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?
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. –
@JonStirling Aktualisierte Frage mit Endpunktcode – Abubakkar
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. –