So senden Sie eine Curl-Anfrage mit aus einer Datei importierten Post-Daten

So senden Sie eine Curl-Anfrage mit aus einer Datei importierten Post-Daten

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.txteiner 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.txtDatei -

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.txtDatei kopiere, den ich in meinem ursprünglichen Curl-Befehl habe, \nfunktioniert es einwandfrei.

Aktualisierte Datei „temp.txt“

Das heißt, wenn ich den Inhalt so in temp.txtder 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}"}

\nDas bedeutet, dass ich eine Möglichkeit finden muss, neue Zeilen manuell aus einer Datei zu konvertieren, temp.txtbevor ich die Curl-Anfrage sende, oder gibt es eine andere Möglichkeit?

Antwort1

Ihre Datennutzlast ist ein JSON-Dokument, das einen querySchlü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 \nin 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 queryWert in eine separate Datei zu schreiben und diese in Ihrem curlAufruf 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 querySchlü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 @filenamein der curlBefehlszeile darauf.

curl \
    --header 'Content-Type: application/json' \
    --data-binary '@/Users/david/Downloads/temp.txt' "$API_ENDPOINT"

verwandte Informationen