【问题标题】:curl does not terminate after successful POST成功 POST 后 curl 不会终止
【发布时间】:2018-01-26 00:45:35
【问题描述】:

我创建了一些 curl 命令来向我的服务器发送一个 POST,我在该服务器上侦听该端口以获取输入以触发其他操作。命令如下(只是屏蔽了 URL):

curl -v -H "Content-Type: application/json" -X POST -d "{\"Location\":\"Some Name\",\"Value\":\"40%\"}" http://example.com:8885/

我从 curl 得到以下输出:

关于 connect() 到 example.com 端口 8885 (#0)

正在尝试 5.147.XXX.XXX...

连接到 example.com (5.147.XXX.XXX) 端口 8885 (#0)

POST / HTTP/1.1

用户代理:curl/7.29.0

主机:example.com:8885

接受:/

内容类型:application/json

内容长度:40

上传完全发送:40 个字节中的 40 个

但是在那之后 curl 不会关闭连接。难道我做错了什么?同样在服务器上,我只有在按下 ctrl+c 时才会收到 POST。

【问题讨论】:

  • 如果其他人遇到同样的问题,请在下面找到最终对我有用的命令(未能通过 NodeRed 发送正确的 HTTP 响应):
    @ 987654322@
    echo -ne "POST http://example.com:PORT/ HTTP/1.0\r\nHost: example.com:PORT\r\nContent-Type: application/json\r\nContent-Length: ${#BODY}\r\nAuthorization: Token {API KEY}\r\n\r\n${BODY}" | nc -i 3 example.com PORT

标签: bash curl


【解决方案1】:

它坐在那里等待正确的 HTTP 响应,在收到响应后它将干净地退出。

最小的 HTTP/1.1 响应可能类似于:

HTTP/1.1 200 OK
Content-Length: 0

...在最后一个标头之后需要一个额外的 CRLF 来表示标头的结束。

【讨论】:

  • 有道理,那我只需要了解如何正确发送 NodeRed 的响应,谢谢提示
【解决方案2】:

我对此有点生疏,但根据section 6.1 of RFC7230,您可能还需要添加Connection: close 标头。引用段落的一部分:

“关闭”连接选项是为发送者定义的 该连接将在完成后关闭 回复。例如,

 Connection: close

在请求或响应头字段中表明 发送者将在当前
之后关闭连接 请求/响应完成(第 6.6 节)。

如果它解决了您的问题,请告诉我 :-)

【讨论】:

  • 不,Connection: close 只是意味着它会在完成后关闭连接,但在这种情况下它会等待,因为它还没有完成......
  • 该死,确实太生锈了:(
  • 既然答案错了,那要不要改一下呢?
猜你喜欢
  • 1970-01-01
  • 2019-03-16
  • 2018-11-07
  • 2021-04-07
  • 2017-07-22
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多