У меня есть команда 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}"}
\n
Это значит, что мне нужно найти способ вручную преобразовывать новые строки из temp.txt
файла перед отправкой curl-запроса или есть другой способ?
решение1
Ваши полезные данные — это документ JSON, содержащий query
ключ. Значение этого ключа — документ в кодировке JSON, возможно, описывающий некоторую форму запроса, который сам по себе не является документом JSON. Новые строки кодируются как \n
значения JSON, и анализатор 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"