以下の 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 ドキュメントではありません。改行は\n
JSON 値としてエンコードされ、サーバーが使用している 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"