2017-08-29 14 views
0

Ich versuche, eine Post-Anfrage mit Guzzle 6 HTTP-Client senden. Ich sende zwei Anfragen eins mit Inhaltstyp als application/x-www-form-urlencoded (form_params in Guzzle) und das andere als application/json (json in Guzzle).Senden HTTP-Anfrage mit Guzzle

I initialisiert den Client wie unten (forms_params und json respectively):

$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 
) 
); 

Die Antwort, dass ich wirklich nicht identische Daten/Körper hat:

Ausgang für form_params: Data -> {"c1":"a"}

Ausgang für json: Data -> {"c1":"a","c2":null}

Ich verstehe nicht, warum es nicht identische Daten für obige Anfragen sendet. Könnte das ein Fehler in Guzzle sein? Gibt es eine Möglichkeit, dies zu lösen (abgesehen von Nullen vor dem Senden der Anfrage)?

UPDATE: Als Endpunkt Code angefordert (beide Anforderungen werden mit demselben Code lesen)

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); 

UPDATE 2: Ich ging durch die in den Kommentaren zu diesem ist das erwartete Verhalten in Guzzle ausgebrachten Links.

Aber warum ich diese Frage an erster Stelle gestellt habe, liegt daran, dass ich mit einem Problem der Signatur-Diskrepanz konfrontiert war.

Wenn ich die Anfrage senden, füge ich eine Kopfzeile mit einer Signatur, die nichts als hash_hmac("sha256", json_encode($data), "secret_key") ist. So bekomme ich unterschiedliche Signaturen beim Senden von Daten wie json und form_params (da die empfangenen Daten im Fall von form_params anders sind, da Nullwerte verworfen/nicht gesendet werden). Zuerst dachte ich, dass es wegen eines Fehlers in Guzzle sein könnte, aber es ist nicht.

Gibt es trotzdem dieses Signaturproblem zu lösen?

+0

Warum wäre es ein Fehler in Guzzle, wenn der Endpunkt andere Daten zurückgibt? Zeigen Sie Ihren Endpunktcode, damit wir eine bessere Vorstellung davon bekommen können, was vor sich geht. –

+0

@JonStirling Aktualisierte Frage mit Endpunktcode – Abubakkar

+0

Aha, das ist kein Fehler. Guzzle scheint [http_build_query] (http://php.net/manual/en/function.http-build-query.php#109466) zu verwenden, was Sachen mit leeren Werten herauszufiltern scheint. I.e. in der ersten Anfrage wird c2 nicht wirklich gesendet. –

Antwort

0

Wie Jon Stirling und Lawrence Cherone bereits bemerkt, it's not a bug according to Guzzle's authors.

Die Lösung für Sie besteht also darin, Werte in eine Zeichenfolge für form_params zu konvertieren. Dies ist sinnvoll, da das URL-codierte Format (anders als JSON) keine Typen hat (alles ist ein String). Und Sie alle definieren eigene Konvertierungsregeln. In PHP (mit http_build_query) funktioniert es so, überspringt null s überhaupt.

+0

Siehe mein Update 2 – Abubakkar