2016-03-20 10 views
0

Ich habe eine Rest API erstellt, die gut funktioniert, aber ich bemerkte eine seltsame Sache. Für den Inhalt vom Client gesendeten Deserialisieren ich diesen Code verwenden:json_decode funktioniert nicht mit curl

var_dump(json_decode(file_get_contents("php://input"), true)); 

Wenn ich eine Anfrage mit POSTMAN (Chrome Extension) senden, die alle gute Arbeit finden Sie unter:

enter image description here

aber wenn ich verwenden curl mit MINGW64 ich werde NULL erhalten:

enter image description here

nun in beiden Fällen überprüfte ich den Codierungstyp, die mit diesem Code war:

$content = file_get_contents("php://input"); 
$encode = mb_detect_encoding($content, "auto"); 
$json = mb_convert_encoding($content, $encode); 
var_dump($json); 

und diese Rückkehr UTF-8

Ich verstehe nicht, warum mit curl MINGW64 Konsole nicht funktioniert und mit der Erweiterung Arbeits Was ist passiert?

UPDATE

Ich habe diese Funktion ausgeführt: json_last_error() und haben 5 zurückgekehrt, auf dieser site sah ich, dass sich die Zahl auf einem Fehler entsprechen:

5 = JSON_ERROR_UTF8 

aber ich habe keine Ahnung, was ist falsch.

+0

Sie können versuchen, Inhalt aus Datei zu lesen, um sicher zu sein, dass die Konsole die Codierung nicht beschädigt hat. – vitas

+0

@vitas was meinst du mit datei? – Dillinger

+0

'curl -i -H" Token: Firma "-X PUT http: // localhost/... --data-binary @ input.json' und in der Datei' input.json' wird Ihre JSON-Anfrage. – vitas

Antwort

1

Da Sie JSON-Daten im Hauptteil übermitteln, müssen Sie dem Server den Inhaltstyp mitteilen, andernfalls sendet cURL ihn als application/x-www-form-urlencoded.

Darüber hinaus müssen alle UTF-8-Zeichen in \uXXXX formatiert werden, um eine gültige JSON-Zeichenfolge zu haben.

Versuchen:

curl -i -H "token: company" \ 
-H "Content-type: application/json" \ 
-d '{"Code": "R89d", "Descri": "Questo \u00E8 un test"}' \ 
-X PUT http://localhost/api/customer/add 

Edit:

nicht sicher, was Sie mit anfangen sind, aber Sie können die folgenden zwei Befehle verwenden curl mit einem richtigen JSON-String zu liefern.

var=$(php -r 'echo json_encode(["Code" => "R89d", "Descri" => "Questo è un test"]);') 
curl -v -H "Content-type: application/json" -d "$var" http://sandbox/test.php 
+0

Nun, wenn ich folgendes benutze: 'curl -i -H 'Content-Type: application/json" -d' {"Code": "R89d", "Beschreibung": "Test"} '-X PUT http:// localhost/apicustomer/add' funktioniert gut. Aber wenn ich akzentuierte Buchstaben wie folgt hinzufüge: 'curl -i -H 'Inhaltstyp: application/json" -d' {"Code": "R89d", "Beschreibung": "Questo è un test"} '-X PUT http: // localhost/apicustomer/add' Die Funktion 'json_decode' gibt' NULL' zurück. Diese Situation passiert nur mit der Konsole, mit meiner Desktop-Anwendung oder Postman funktioniert alles gut. – Dillinger

+0

Das liegt daran, dass die JSON-Zeichenfolge ordnungsgemäß maskiert werden muss. Was Sie senden, ist ungültiger JSON. Es muss so aussehen: '{" Code ":" R89d "," Descri ":" Questo \ u00e8 un test "}' – drew010

+0

du hast Recht, scheint jetzt zu arbeiten. Aber ich kann nicht denken, dass die Dinge für "Curl" -Anfragen so komplex sind. Es gäbe eine Möglichkeit, dies über Code oder etwas zu handhaben? Ansonsten sollte ich mich an die Kodierung für akzentuierte Buchstaben erinnern oder die Zeichenkette mit einigen Werkzeugen umwandeln ... nach einiger Zeit kann der Gebrauch von 'curl' mühsam und frustrierend werden. Was schlägst du mir vor? – Dillinger