我有一個下面的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
文件中,那麼從我的第二次捲曲開始它就可以正常工作 -
{"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 文檔。換行符會依照 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"