以下にカールコマンドがありますが、正しく動作し、応答を受け取ります。 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"