PHP Curl Post Request - 不发送有效负载

时间:2017-06-13 17:36:30

标签: php curl post

我试图设置代理服务器来发帖请求。问题是,当我提出请求时,我没有看到有效载荷。

我注意到的一点是,卷曲似乎是在增加一个额外的边界"到请求中的content-type。

我错过了什么吗?

守则:

$contentType = $_SERVER["HTTP_CONTENT_TYPE"];
$post = http_build_query($_POST);
$ch = curl_init();     
$header = array("Content-Type:" . $contentType,
        "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        "Accept-Encoding:gzip, deflate, br",
        "Accept-Language:en-US,en;q=0.8",
        "Connection:keep-alive",
        "User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
        "Cache-Control:max-age=0",
        "Upgrade-Insecure-Requests:1",
        "Origin:<url here>");

echo "<b>POST</b><br>" . var_dump($_POST) . "<br><br>";

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($_POST));
curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookiejar.txt");
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_HEADER, 1);
$result = curl_exec($ch); 

$headerSent = curl_getinfo($ch, CURLINFO_HEADER_OUT );
echo "<b>Request Header</b><br>$headerSent<br><br>";

$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($result, 0, $header_size);
$body = substr($result, $header_size);


echo "<b>Response Header</b><br>$header<br><br>";
echo "<b>Response Body</b><br>$body";

响应

$_POST = array(5) { ["formFields_Complaint_Type"]=> string(9) "1-GM2-226" 
["formFields_Descriptor_1"]=> string(10) "1-GM3-3085" 
["formFields_Descriptor_2"]=> string(9) "1-GM4-903" 
["formFields_Date/Time_of_Occurrence"]=> string(0) "" ["_target1"]=> string(1) " " } 

请求标题:

POST <relative address> HTTP/1.1 Host: <url> 
Cookie: 
JSESSIONID=mDMJZQdLV4bhvJQ6vPyQvxqHVTynGS3byBnYsTpjDvY1xBnB93R8!-759339305!-1867032216 Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Accept-Encoding:gzip, deflate, br 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 
Cache-Control:max-age=0 Upgrade-Insecure-Requests:1 
Origin: <url>
Content-Length: 633 
Expect: 100-continue 
Content-Type:multipart/form-data; boundary=----
WebKitFormBoundarybdBepqnmjSF86t50; boundary=------------------------
f8e2ad22b9bb626c 

1 个答案:

答案 0 :(得分:0)

最佳猜测:您的(最大的,代码破坏,但不仅仅是)问题是目标服务器仅支持application/x-www-form-urlencoded编码的POST请求,但您的curl代码会转换application/x-www-form-urlencoded个编码的请求无论客户使用什么,都会向multipart/form-data发出multipart/form-data次请求。 (这是因为PHP透明地将它们转换为一个名为$ _POST的相同的本机PHP数组)

这将使用multipart/form-data编码:

curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST);

这将使用application/x-www-form-urlencoded编码:

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_POST));

您必须根据$_SERVER["HTTP_CONTENT_TYPE"];

决定使用哪种编码
  • 如果它们都不是(例如,如果它是application/json),你必须添加特殊代码来处理每个,并且你应该在$ _SERVER [&#34; HTTP_CONTENT_TYPE&##时出错34;];不是你为其做过特殊情况的类型之一(比如原始$ _POST for multipart,和http_build_query($ _ POST)x-www-form-urlencoded)

  • 你也没有转发任意的http标题,你应该为它添加一些代码

  • 如果您确实需要支持Upgrade-Insecure-Requests:1标头,则需要在代理端实现特定代码来处理(请阅读主题上的http规范 - https://www.w3.org/TR/upgrade-insecure-requests/)< / p>

  • 你告诉目标你接受Accept-Encoding:gzip, deflate, br,但没有提供任何代码来解码它们,所以如果目标服务器决定使用任何代码,它将看起来像垃圾二进制数据到客户端其中(curl可以为你解码它们,使用CURLOPT_ENCODING,如果libcurl是用gzip和deflate以及br支持编译的。我从来没有见过带有br支持的libcurl,我敢打赌你的curl没有它可能有编译的gzip / deflate支持但是