我正在开发一个使用libcurl的应用程序。
我在我的c代码中添加了以下curl选项:
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
以便遵循http重定向。
当我的应用程序发送http消息(第一个http消息)时,它从服务器接收到http 302重定向,libcurl检测成功重定向信息,然后发送另一个http消息(第二条http消息)到新网址,但新的http消息与第一条http消息相比并不相同。
如何让libcurl发送相同的HTTP消息?
第一条http消息:我的应用程序与第一台服务器之间的通信,直到应用程序获得http重定向消息
申请----> server1的
POST / HTTP/1.1
Host: 192.168.1.15
Accept: */*
User-Agent: cwmp
Content-Type: text/xml
Content-Length: 341
Expect: 100-continue
server1 ---->应用
HTTP/1.1 100 Continue
申请----> server1的
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<soap_env:Envelope
xmlns:soap_env="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soap_enc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap_env:Header>
<cwmp:ID soap_env:mustUnderstand="1" />
</soap_env:Header>
<soap_env:Body>
<any:command>any_command_value</any:command>
</soap_env:Body>
</soap_env:Envelope>
server1 ----&gt;应用程序(重定向消息)
HTTP/1.1 302 Found
Date: Tue, 13 May 2014 11:00:48 GMT
Server: Apache/2.4.7 (Win32) PHP/5.5.8
X-Powered-By: PHP/5.5.8
Location: http://192.168.1.133:8080/openserv/serv
Content-Length: 0
Content-Type: text/html
第二条http消息:我的应用程序在收到http重定向后发送给第二台服务器的http消息
申请---&gt; server2
GET /openserv/serv HTTP/1.1
Host: 192.168.1.133:8080
Accept: */*
User-Agent: cwmp
Content-Type: text/xml
答案 0 :(得分:2)
根据标准,需要在HTTP重定向上发送相同的消息。但是,几乎没有工具可以实现标准。 libcurl
在重定向时将请求方法从POST
更改为GET
,是的,它反对标准,但它是如何工作的。
可能的解决方案:
CURLOPT_POSTREDIR
选项;在重定向后,它会强制libcurl
至少也使用POST
方法,我不知道POST
请求正文的内容。libcurl
的调用发送请求。