Linux

如何使用從文件導入的 post 數據發送 curl 請求

  • May 29, 2021

我有一個下面的 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文件中,那麼它從我的第二次 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 請求之前找到一種將新行\ntemp.txt文件手動轉換為手動的方法,還是有其他方法?

您的數據有效負載是一個包含query密鑰的 JSON 文件。該鍵的值是 JSON 編碼的文件,可能描述某種形式的查詢,它本身不是 JSON 文件。換行符被編碼為\nJSON 值,伺服器使用的 JSON 解析器會在收到您的請求時將它們轉換為文字換行符。

您嘗試將解碼query後的值放在單獨的文件中並在curl呼叫中傳遞它失敗了,因為您正在與之交談的 API期望數據是 JSON 文件,其中鍵的 JSON 編碼值query

將查詢解除安裝到單獨的文件中的正確做法是完全按照您在上一個範例中所做的操作。將帶有編碼查詢的 JSON 文件放在一個文件中,並--data-binary @filenamecurl命令行上使用它來引用它。

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

引用自:https://unix.stackexchange.com/questions/651885