我想使用Guzzle 6 http客戶端發送請求。我發送兩個內容類型爲application/x-www-form-urlencoded
(在Guzzle中爲form_params
)的請求,另一個爲application/json
(在Guzzle中爲json
)。使用Guzzle發送HTTP請求
我初始化客戶端如以下(forms_params
和json
分別地):
$data1 = array("c1" => "a", "c2" => null)
$client = new Client();
$response = $client->post(
"http://localhost/callback",
array(
"form_params" => $data1, // send as x-www-form-urlencoded
)
);
$data2 = array("c1" => "a", "c2" => null)
$client = new Client();
$response = $client->post(
"http://localhost/callback",
array(
"json" => $data2, // send as json
)
);
響應我接收確實有不相同的數據/體:
輸出爲form_params
:Data -> {"c1":"a"}
json
的輸出:Data -> {"c1":"a","c2":null}
我不理解爲什麼它不發送上述請求的相同數據。這可能是Guzzle中的錯誤嗎?有什麼方法可以解決這個問題(除了在發送請求之前刪除空值)嗎?
UPDATE:作爲請求端點的代碼(同時請求都使用相同的代碼讀取)
if ($$_SERVER["CONTENT_TYPE"] == "application/json") {
$jsonstr = file_get_contents("php://input");
$formData = json_decode($jsonstr, true);
} else {
$formData = $_POST;
}
echo "Data -> " . json_encode($formData);
更新2:我通過發表了關於這個狂飲被預期行爲的鏈接去了。
但是我爲什麼首先問這個問題是因爲我遇到了簽名不匹配的問題。
當我發送請求時,我添加一個標記,其簽名只是hash_hmac("sha256", json_encode($data), "secret_key")
。因此,當發送數據時,我得到不同的簽名json
和form_params
(因爲接收到的數據在form_params
的情況下不同,因爲空值被丟棄/未發送)。首先,我認爲這可能是由於Guzzle中的一個錯誤,但事實並非如此。
有沒有辦法解決這個簽名問題?
如果端點正在返回不同的數據,爲什麼它會成爲Guzzle中的一個錯誤?顯示您的端點代碼,以便我們更好地瞭解發生了什麼。 –
@JonStirling更新了端點代碼 – Abubakkar
的問題,這不是嚴格的錯誤。 Guzzle似乎使用[http_build_query](http://php.net/manual/en/function.http-build-query.php#109466),這似乎過濾了空值的東西。即在第一個請求中,c2實際上並未發送。 –