cURL - 构造请求以验证服务器发送的事件

cURL - Structuring request to validate server sent events

我是 cURL 和服务器发送事件的新手。我知道如何使用 cURL 构建简单的 GETPOST 请求并获得响应。另外,理论上我知道服务器发送的事件是通过创建事件源的侦听器来处理的,但我不确定如何继续使用 cURL 验证任何此类 API。任何指导表示赞赏。

SSE 是一种 text-based 协议,curl 是一种很好的方法,可以准确地解决您的连接正在发送的内容。命令很简单:

curl -N http://127.0.0.1/path/to/clock.php

-N 停止任何缓冲,因此数据在收到时显示。)

它输出这个:

data:2015-07-07 06:19:27

data:2015-07-07 06:19:28

data:2015-07-07 06:19:29

data:2015-07-07 06:19:30

data:2015-07-07 06:19:31

data:2015-07-07 06:19:32

注意它是如何显示SSE协议的"data:"前缀的,并且还清楚地显示了双LF。它永远 运行,直到你按下 ctrl-c。

关于唯一要指出的是,您必须使用网络服务器;你不能 运行 SSE 通过 file:// 协议。

有关更多 hard-core 故障排除,请添加 --verbose,这将显示正在发送的 headers 和正在接收的 headers。

SSE 确实支持 cookie,您可以这样提供:(您首先必须准备 "cookies.txt" 文件):

curl -N --cookie cookies.txt http://127.0.0.1/path/to/clock.php

有关您可能要考虑使用的其他选项,请参阅 other answer and the curl documentation。如果您正在解决特定浏览器中的问题,请使用他们的开发工具来准确找出正在发送的内容 headers,然后您可以让 curl up 执行相同的操作。


为了完整性,这里是 clock.php 脚本:

<?php 
set_time_limit(0);
header("Content-type: text/event-stream");

while(1){
    echo "data:" . date("Y-m-d H:i:s") . "\n\n";
    @ob_flush();flush();
    sleep(1);
    }

为完整起见,您的 curl 命令应如下所示:

$ curl -N --http2 -H "Accept:text/event-stream" https://some.address.com/clocktimes

-N 参数非常重要,因为 curl 缓冲了响应。因此,您的服务器可能已经发送了一些数据,但由于 curl 缓冲,这些数据没有呈现在屏幕上。任何时候使用 curl 进行流式传输时,都应该包括此标志。

-H 应作为最佳实践包括在内,因为如果您的服务器已将其他协议绑定到同一端口,它将无法消除该协议的歧义。

例如,如果端口 443 用于 HTTPS 和 SSE,则您需要提供 -H header 以便服务器知道这是一个 SSE 请求。

以上示例假设服务器使用 HTTP/2。如果不是,请删除 --http2 参数并将方案从 https:// 更改为 http://