这个对我不起作用。
我必须使用 UPLOAD 和 PUT 才能正确执行此操作。
对我有用的答案在这里:
How do I send long PUT data in libcurl without using file pointers?
您需要 READFILE 的回调函数,然后使用它将数据复制到该回调中 curl 提供的指针。
最终对我有用的是确保我使用 CURLOPT_INFILESIZE 或 CURLOPT_INFILESIZE_LARGE 设置文件大小,具体取决于您的有效负载。否则,您会在背景故事中发布问题。
背景故事:
我期待一个 JSON 请求,但使用 PUT CURL 选项或这种自定义请求方法我得到与通过控制台执行此操作相同的结果
curl -H "Accept:application/json" -H "Authorization:authxxxx" -v -X PUT "http://server.xxxdomain.com/path0/path1/path2/state?data1=1&data2=1421468910543&data3=-3"
* Adding handle: conn: 0x7fd752003a00
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7fd752003a00) send_pipe: 1, recv_pipe: 0
* About to connect() to server.xxxdomain.com port 80 (#0)
* Trying ipaddress...
* Connected to api-qos.boingodev.com (ipaddress) port 80 (#0)
> PUT /path0/path1/path2/done?data1=1&data2=1421468910543&data3=-3 HTTP/1.1
> User-Agent: curl/7.30.0
> Host: server.xxxdomain.com
> Accept:application/json
> Authorization:authxxxx
>
< HTTP/1.1 411 Length Required
* Server nginx/1.1.19 is not blacklisted
< Server: nginx/1.1.19
< Date: Sat, 17 Jan 2015 04:32:18 GMT
< Content-Type: text/html
< Content-Length: 181
< Connection: close
<
<html>
<head><title>411 Length Required</title></head>
<body bgcolor="white">
<center><h1>411 Length Required</h1></center>
<hr><center>nginx/1.1.19</center>
</body>
</html>
* Closing connection 0
另一方面,在控制台上发出相同的请求并添加数据字段(PUT -d "" URL)得到我想要的:
curl -H "Accept:application/json" -H "authxxxx" -v -X PUT -d "" "http://server.xxxdomain.com/path0/path1/path2/state?data1=1&data2=1421468910543&data3=-3"
* Adding handle: conn: 0x7fe8aa803a00
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7fe8aa803a00) send_pipe: 1, recv_pipe: 0
* About to connect() to server.xxxdomain.com port 80 (#0)
* Trying ipaddress...
* Connected to server.xxxdomain.com (ipaddress) port 80 (#0)
> PUT /path0/path1/path2/state?data1=1&data2=1421468910543&data3=-3" HTTP/1.1
> User-Agent: curl/7.30.0
> Host: server.xxxdomain.com
> Accept:application/json
> Authorization:authxxxx
> Content-Length: 0
> Content-Type: application/x-www-form-urlencoded
>
< HTTP/1.1 200 OK
* Server nginx/1.1.19 is not blacklisted
< Server: nginx/1.1.19
< Date: Sat, 17 Jan 2015 17:16:59 GMT
< Content-Type: application/json
< Content-Length: 32
< Connection: keep-alive
<
* Connection #0 to host server.xxxdomain.com left intact
{"code":"0","message":"Success"}
总而言之,我似乎需要找出与 PUT -d "" 等效的 CURL 选项。您还可以看到两种响应之间的区别,在一种情况下,返回是 HTML 并且连接已关闭。在另一种情况下,内容是 JSON,并且连接保持活动状态。
根据我发现的错误 411:
http://www.checkupdown.com/status/E411.html
问题在于,无论您是使用带有 CURLOPT_PUT 的 CURLOPT_UPLOAD 还是 CUSTOM 选项,都需要设置内容长度。
因此,如果您有一个数据流,您似乎必须使用 READDATA 和 READFUNCTION 选项来确定数据的长度。
管理员注意:
请记住,发布 cmets 需要代表 50,所以我别无选择,只能发布单独的帖子以进行交流。因此,当您考虑像过去那样删除这些帖子时,请考虑这一点。