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

Posted

技术标签:

【中文标题】cURL - 构造请求以验证服务器发送的事件【英文标题】:cURL - Structuring request to validate server sent events 【发布时间】:2015-09-23 04:10:00 【问题描述】:

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

【问题讨论】:

【参考方案1】:

SSE 是一种基于文本的协议,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。

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

如需更多核心故障排除,请添加--verbose,它将显示正在发送的标头和正在接收的标头。

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

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

请参阅other answer 和curl documentation,了解您可能要考虑使用的其他选项。如果您要解决特定浏览器中的问题,请使用他们的开发工具准确找出正在发送的标头,然后您可以告诉 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);
    

【讨论】:

【参考方案2】:

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

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

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

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

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

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

【讨论】:

适用于 Java 8 SSE。

以上是关于cURL - 构造请求以验证服务器发送的事件的主要内容,如果未能解决你的问题,请参考以下文章

通过 CURL 发送 ajax 请求

PowerShell利用Curl发送请求

使用curl测试不安全的HTTP请求

开发当中curl简单使用

使用 CURL 添加请求时间戳

PHP如何通过CURL上传文件