ファイルから取得した投稿データにカールリクエストを送信する方法

ファイルから取得した投稿データにカールリクエストを送信する方法

以下にカールコマンドがありますが、正しく動作し、応答を受け取ります。 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また、元のカールコマンドと同じ内容をファイルにコピーすると\n正常に動作します。

更新された「temp.txt」ファイル

つまり、このようなものをtemp.txtファイルに保存すると、2番目のカールから正しく機能します。

{"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の改行文字を手動で変換する方法を見つける必要がありますtemp.txt。それとも別の方法がありますか?

ベストアンサー1

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

queryデコードされた値を別々のファイルに入れて呼び出しに渡す試みは、curl使用中のAPIのために失敗します。予想するデータはJSON文書であり、対応するキー値はJSONでエンコードされていますquery

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

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

おすすめ記事