ファイルからインポートした投稿データを使用して curl リクエストを送信する方法

ファイルからインポートした投稿データを使用して curl リクエストを送信する方法

以下の curl コマンドは正常に動作し、応答が返されます。エンドポイントに json データを投稿しており、これを実行すると応答が返されます。

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

今、外部のファイルからバイナリデータを読み取ろうとしていますtemp.txtが、どういうわけかうまくいかず、エラーが発生します -

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

temp.txt以下は私のファイルの内容です-

元の「temp.txt」ファイル

{
  data(clientId: 1234, filters: [{key: "o", value: 100}], key: "world") {
    title
    type
    pottery {
      text
      pid
      href
      count
      resource
    }
  }
}

これは私が受け取ったエラーです -

.......
* 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

私が何か間違ったことをしているのでしょうか?

temp.txtまた、元の curl コマンドに含まれているものとまったく同じ内容をファイルにコピーすると\n、正常に動作します。

「temp.txt」ファイルを更新しました

つまり、このような内容をtemp.txtファイルに保存しておけば、2回目のcurlからは正常に動作します -

{"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}"}

つまり、curl リクエストを送信する前に、ファイル\nから新しい行を手動で変換する方法を見つける必要があるということですか、それとも他の方法がありますか?temp.txt

答え1

データ ペイロードは、キーを含む JSON ドキュメントですquery。そのキーの値は JSON でエンコードされたドキュメントで、クエリの形式を記述している可能性がありますが、それ自体は JSON ドキュメントではありません。改行は\nJSON 値としてエンコードされ、サーバーが使用している JSON パーサーは、リクエストを受信すると、これらをリテラルの改行に変換します。

デコードされたquery値を別のファイルに入れてcurl呼び出しに渡そうとすると、通信先のAPIが期待するデータは、queryキーの JSON エンコードされた値を持つ JSON ドキュメントになります。

クエリを別のファイルにオフロードするための正しい方法は、最後の例で行ったこととまったく同じことです。エンコードされたクエリを含む JSON ドキュメントをファイルに配置し、コマンド ライン--data-binary @filenameでを使用して参照しますcurl

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

関連情報