2017-08-29 181 views
0

我想使用Guzzle 6 http客戶端發送請求。我發送兩個內容類型爲application/x-www-form-urlencoded(在Guzzle中爲form_params)的請求,另一個爲application/json(在Guzzle中爲json)。使用Guzzle發送HTTP請求

我初始化客戶端如以下(forms_paramsjson分別地):

$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_paramsData -> {"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")。因此,當發送數據時,我得到不同的簽名jsonform_params(因爲接收到的數據在form_params的情況下不同,因爲空值被丟棄/未發送)。首先,我認爲這可能是由於Guzzle中的一個錯誤,但事實並非如此。

有沒有辦法解決這個簽名問題?

+0

如果端點正在返回不同的數據,爲什麼它會成爲Guzzle中的一個錯誤?顯示您的端點代碼,以便我們更好地瞭解發生了什麼。 –

+0

@JonStirling更新了端點代碼 – Abubakkar

+0

的問題,這不是嚴格的錯誤。 Guzzle似乎使用[http_build_query](http://php.net/manual/en/function.http-build-query.php#109466),這似乎過濾了空值的東西。即在第一個請求中,c2實際上並未發送。 –

回答

0

正如Jon Stirling和Lawrence Cherone所注意到的,it's not a bug according to Guzzle's authors

因此,您的解決方案是將值轉換爲form_params的字符串。它是有道理的,因爲URL編碼格式(不像JSON)沒有類型(全部是字符串)。每個人都定義了自己的轉換規則。在PHP中(使用http_build_query)它是這樣工作的,根本跳過null

+0

請參閱我的更新2 – Abubakkar