Ich definiere eine PUT-Anfrage mit einem JSON-Anfragetext unter Verwendung von libcurl in C.
So wie ich es mache:
%Vor%Der Anfragetext kommt folgendermaßen an:
%Vor% Mit { '
am Anfang und ' }
am Ende.
--- MEHR INFO -----
wenn ich diesen Code deklariere
%Vor%Der Server erhält dies als Anfragekörper:
%Vor%Meine Frage ist:
Formatiert libCurl die JSON-Anfrage automatisch vor / formatiert?
Hat libCurl übrigens eine Möglichkeit, ein JSON-Objekt zu codieren?
Vielen Dank!
Zuerst wollen wir ein paar Dinge notieren. Zu Beginn hat Daniel Stenberg Recht (wie ich es mir erhofft hätte, da er den Code geschrieben hat): libcurl fügt keine Daten an Ihren Code an. Ich kann dies mit diesem Beispielprogramm demonstrieren, das wie Ihr Beispiel ist, aber mit etwas zusätzlichen Setup / Teardown-Code. Dies ist all des Codes: Es gibt nichts anderes hier:
%Vor%Das Paket, das die Anforderung mit Wireshark erfasst, zeigt, dass dies die folgende HTTP-Anforderung auslöst:
%Vor%Wie Sie sehen können, sind dies genau die JSON-Daten, die Sie senden wollten. Es gibt keine zusätzlichen Daten hier, keine umschließenden Klammern.
Dies bedeutet, dass die zusätzlichen Klammern entweder von Ihrem Server oder von einer Zwischenbox hinzugefügt werden. Meine Vermutung ist, dass Ihr Server es hinzufügt, weil es zwangsweise versucht, einen Körper, der kein application/json
body ist, in einen zu verwandeln, indem er den gesamten Körper als String betrachtet.
Der Grund, warum Ihr Server dies nicht als JSON-Body ansieht, ist hier durch eine andere Antwort gekapselt: Sie setzen Ihre Header nicht richtig. curl_slist_append
gibt ein neues struct curl_slist *
zurück, das Sie erneut in Ihre headers
Variable zuweisen müssen. Das bedeutet, dass Sie diese vier Zeilen ändern müssen:
zu diesen vier:
%Vor%Dies sollte Ihren Server davon überzeugen, dass Sie JSON-Daten senden.
Ich empfehle Ihnen in Zukunft, sich mit Wireshark vertraut zu machen, um solche Probleme zu lösen. Es ist äußerst hilfreich, die tatsächliche Anfrage zu sehen, die Sie gesendet haben. Wenn dies nicht möglich ist, können Sie CURLOPT_DEBUGFUNCTION
verwenden, um die Daten zu erfassen, die curl sendet, um sie zu validieren.
libcurl sendet genau die Bytes, die Sie senden möchten. Es hat überhaupt keine Kenntnis von JSON.
Siehe @ Lukasas ausgezeichnete und ausführlichere Antwort für bessere und detailliertere Informationen.
Ich hatte ein ähnliches Problem.
Ich habe die Option -libcurl für den Befehl curl entdeckt. Es hat sehr geholfen! Fügen Sie es einfach an das Ende Ihres Arbeitscurl-Befehls an.
Am Ende hilft es mir, diesen Code zu erstellen:
%Vor%Express erhält diesen JSON als:
%Vor%Ich hoffe, das hilft!
Ein Schlüssel zum Verständnis, ob sich das System korrekt verhält, ist das Sehen, was das Programm tatsächlich über das Netzwerk sendet. Eine andere Möglichkeit, den Byte-Stream zu überprüfen, anstatt ihn auf Ihren Server zu richten (und / oder Wireshark auszuführen), besteht darin, einfach eine netcat Instanz in einem separaten Fenster auf der Testmaschine:
%Vor%und zeigen Sie den Code (CURLOPT_URL) auf " Ссылка ".
Sie müssen Control-D im Fenster nc
drücken, um die Verbindung zu beenden, so dass die Rundung abgeschlossen ist. Sie können jedoch auch vorher einen Testrückgabetyp eingeben, der nützlich sein kann Sie erwarten eine Art von Antwort, gegen die getestet werden soll.
Ich habe json-c zum Kodieren und Dekodieren von Jons benutzt und es hat sehr gut funktioniert. Die Dokumentation ist auch einfach zu verstehen. Ссылка