簡體   English   中英

PHP Curl發布請求-不發送有效載荷

[英]PHP Curl Post Request - not sending payload

我正在嘗試設置代理服務器以發出發布請求。 問題是當我發出請求時我看不到有效負載。

我注意到的一件事是curl似乎在請求中的內容類型上添加了一個額外的“邊界”。

我想念什么嗎?

編碼:

$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 

最好的猜測:您的問題(最大,但代碼破破,但不僅如此)是目標服務器僅支持application/x-www-form-urlencoded -encoded POST請求,但是您的curl代碼同時轉換了application/x-www-form-urlencoded -encoded請求和multipart/form-data請求multipart/form-data ,不管使用何種客戶端。 (這是因為PHP透明地將它們都轉換為相等的本機PHP數組,稱為$ _POST)

這將使用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"];決定使用哪種編碼$_SERVER["HTTP_CONTENT_TYPE"];

  • 並且如果它們都不是(例如,如果它是application/json ),則必須添加特殊代碼來處理每個代碼,並且只要$ _SERVER [“ HTTP_CONTENT_TYPE”]; 不是您已為其進行特殊處理的類型之一(例如,原始的$ _POST用於多部分處理,而http_build_query($ _ POST)x-www-form-urlencoded)

  • 而且您沒有轉發任意的HTTP標頭,您可能應該為此添加一些代碼

  • 並且如果您確實需要支持Upgrade-Insecure-Requests:1標頭,則需要實現特定的代碼以在代理端進行處理(請閱讀該主題的http規范-https: //www.w3.org/TR / upgrade-insecure-requests /

  • 然后您對目標服務器說您接受Accept-Encoding:gzip, deflate, br ,但是不提供任何代碼來解碼它們中的任何一個,因此,如果目標服務器決定使用其中的任何一個,則對客戶端來說,這就像垃圾二進制數據(但是,curl可以使用CURLOPT_ENCODING為您解碼它們,如果libcurl是使用gzip和deflate和br支持編譯的。我從未見過具有br支持的libcurl,我敢打賭您的curl沒有它。可能是gzip /縮小支持的編譯)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM