Ich habe einen Curl-Befehl unten, der einwandfrei funktioniert und ich bekomme die Antwort zurück. Ich poste JSON-Daten an einen Endpunkt, der mir nach dem Aufrufen eine Antwort zurückgibt.
curl -v 'url' -H 'Accept-Encoding: gzip, deflate, br' -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'DNT: 1' -H 'Origin: url' --data-binary '{"query":"\n{\n data(clientId: 1234, filters: [{key: \"o\", value: 100}], key: \"world\") {\n title\n type\n pottery {\n text\n pid\n href\n count\n resource\n }\n }\n}"}' --compressed
Jetzt versuche ich, die Binärdaten aus temp.txt
einer externen Datei zu lesen, aber irgendwie funktioniert es nicht und ich erhalte eine Fehlermeldung -
curl -v 'url' -H 'Accept-Encoding: gzip, deflate, br' -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'DNT: 1' -H 'Origin: url' --data-binary "@/Users/david/Downloads/temp.txt" --compressed
Unten sehen Sie den Inhalt meiner temp.txt
Datei -
Ursprüngliche Datei „temp.txt“
{
data(clientId: 1234, filters: [{key: "o", value: 100}], key: "world") {
title
type
pottery {
text
pid
href
count
resource
}
}
}
Dies ist der Fehler, den ich bekomme -
.......
* upload completely sent off: 211 out of 211 bytes
< HTTP/1.1 500 Internal Server Error
< date: Fri, 28 May 2021 23:38:12 GMT
< server: envoy
< content-length: 0
< x-envoy-upstream-service-time: 1
<
* Connection #0 to host url left intact
* Closing connection 0
Mache ich etwas falsch?
Auch wenn ich genau denselben Inhalt in die temp.txt
Datei kopiere, den ich in meinem ursprünglichen Curl-Befehl habe, \n
funktioniert es einwandfrei.
Aktualisierte Datei „temp.txt“
Das heißt, wenn ich den Inhalt so in temp.txt
der Datei behalte, dann funktioniert es ab meinem zweiten Curl einwandfrei -
{"query":"\n{\n data(clientId: 1234, filters: [{key: \"o\", value: 100}], key: \"world\") {\n title\n type\n pottery {\n text\n pid\n href\n count\n resource\n }\n }\n}"}
\n
Das bedeutet, dass ich eine Möglichkeit finden muss, neue Zeilen manuell aus einer Datei zu konvertieren, temp.txt
bevor ich die Curl-Anfrage sende, oder gibt es eine andere Möglichkeit?
Antwort1
Ihre Datennutzlast ist ein JSON-Dokument, das einen query
Schlüssel enthält. Der Wert dieses Schlüssels ist ein JSON-codiertes Dokument, das möglicherweise eine Art Abfrage beschreibt, die selbst kein JSON-Dokument ist. Zeilenumbrüche werden wie \n
in JSON-Werten codiert, und der vom Server verwendete JSON-Parser würde diese in wörtliche Zeilenumbrüche übersetzen, wenn er Ihre Anfrage empfängt.
Ihr Versuch, den dekodierten query
Wert in eine separate Datei zu schreiben und diese in Ihrem curl
Aufruf zu übergeben, schlägt fehl, da die API, mit der Sie kommunizierenerwartetDie Daten sollen ein JSON-Dokument mit einem JSON-codierten Wert für den query
Schlüssel sein.
Um die Abfrage in eine separate Datei auszulagern, gehen Sie am besten genau so vor wie in Ihrem letzten Beispiel. Legen Sie das JSON-Dokument mit der codierten Abfrage in eine Datei und verweisen Sie --data-binary @filename
in der curl
Befehlszeile darauf.
curl \
--header 'Content-Type: application/json' \
--data-binary '@/Users/david/Downloads/temp.txt' "$API_ENDPOINT"