我有一个下面的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}"}
这意味着我需要找到一种方法,在发送卷曲请求之前将新行\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"