[英]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.