Как отправить curl-запрос с данными post, импортированными из файла

Как отправить curl-запрос с данными post, импортированными из файла

У меня есть команда 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"

Связанный контент