以下是WireShark的转储:
POST /drm/drm_production_v2.php HTTP/1.1
content-length: 278
content-type: text/xml
User-Agent: UserAgent 1.0
Connection: Keep-Alive
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
host: www.example.com
<methodCall>
<methodName>aMethod</methodName>
<params>
<param>
<value>
<base64>dXNlcm5hbWU6cGFzc3dvcmQ=</base64>
</value>
</param>
<param>
<value>
<struct/>
</value>
</param>
</params>
</methodCall>
我将xml保存到一个单独的文件中。这就是我在做的事情:
<?php
function httpsPost($Url, $xml_data, $headers)
{
// Initialisation
$ch=curl_init();
// Set parameters
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_URL, $Url);
// Return a variable instead of posting it directly
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERPWD,"username:password");
// Activate the POST method
curl_setopt($ch, CURLOPT_POST, 1) ;
curl_setopt($ch,CURLOPT_USERAGENT,"UserAgent 1.0");
// Request
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);
curl_setopt($ch, CURLOPT_TIMEOUT, 999);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
// execute the connexion
$result = curl_exec($ch);
// Close it
curl_close($ch);
return $result;
}
$str='username:password';
$auth=base64_encode($str);
$request_file = "./request.xml";
$fh = fopen($request_file, 'r');
$filesize=filesize($request_file);
echo $filesize;
$xml_data = fread($fh,$filesize);
fclose($fh);
$url = 'http://www.example.com';
$header = array();
$header[] = "POST /drm/drm_production_v2.php HTTP/1.1";
$header[] = "Content-type: text/xml";
$header[] = "content-length: ".$filesize. "\r\n";
$header[] = "User-Agent: UserAgent 1.0";
$header[] = "Connection: Keep-Alive";
$header[] = "Authorization: Basic ".$auth;
$header[] = "host: www.example.com";
$Response = httpsPost($url, $xml_data, $header);
echo $Response;
?>
它从服务器返回“错误请求”。有什么建议吗?
答案 0 :(得分:2)
我的第一个猜测是内容长度标题之后的额外“\ r \ n”使服务器认为帖子内容从那里开始。我还将“content-length”,“Content-type”和“host”更改为“Content-Length”,“Contnet-Type”和“Host”,以防万一。
编辑:那,和罗纳德·布曼的回答。
答案 1 :(得分:2)
我认为你的论点是
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_data);
不正确。 postfields选项应该是URL编码的名称/值对。来自文档:
” 这可以作为urlencoded字符串传递,如'para1 = val1&amp; para2 = val2&amp; ...',或者作为一个数组,字段名称作为键,字段数据作为值。如果value是数组,则Content-Type标头将设置为multipart / form-data “
答案 2 :(得分:0)
有pcap2curl工具允许将HTTP请求的pcap文件转换为cURL。
但是如果你想从浏览器重放一些网页请求,那么你可以在没有Wireshark的情况下进行,而是在浏览器中进入Web开发者模式。然后,您转到网络请求视图并右键单击感兴趣的请求,然后在大多数现代浏览器中,有一个选项复制为cURL ,之后您可以将生成的命令粘贴到终端中并使用curl
工具按您认为合适的方式重新运行捕获的命令。某些浏览器(例如Mozilla)也提供了在浏览器中编辑和重新发送的选项。