Como enviar solicitação curl com dados de postagem importados de um arquivo

Como enviar solicitação curl com dados de postagem importados de um arquivo

Eu tenho um comando curl abaixo que funciona bem e recebo a resposta de volta. Estou postando dados json em um endpoint que me dá uma resposta depois de acessá-lo.

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

Agora estou tentando ler os dados binários do temp.txtarquivo externo, mas de alguma forma não funciona e recebo um erro -

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

Abaixo está o conteúdo que tenho em meu temp.txtarquivo -

Arquivo "temp.txt" original

{
  data(clientId: 1234, filters: [{key: "o", value: 100}], key: "world") {
    title
    type
    pottery {
      text
      pid
      href
      count
      resource
    }
  }
}

Este é o erro que estou recebendo -

.......
* 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

Há algo de errado que estou fazendo?

Além disso, se eu copiar exatamente o mesmo conteúdo do temp.txtarquivo que tenho em meu comando curl original, \nele funcionará bem.

Arquivo "temp.txt" atualizado

Ou seja, se eu mantiver o conteúdo como este em temp.txtarquivo, ele funcionará bem no meu segundo 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}"}

Isso significa que preciso encontrar uma maneira de converter novas linhas \nmanualmente do temp.txtarquivo antes de enviar a solicitação curl ou existe alguma outra maneira?

Responder1

Sua carga de dados é um documento JSON que contém uma querychave. O valor dessa chave é um documento codificado em JSON, possivelmente descrevendo alguma forma de consulta, que não é em si um documento JSON. As novas linhas são codificadas como \nnos valores JSON, e o analisador JSON que o servidor está usando as traduziria em novas linhas literais quando receber sua solicitação.

Sua tentativa de colocar o queryvalor decodificado em um arquivo separado e passá-lo em sua curlchamada falha, porque a API com a qual você está falandoesperaos dados sejam um documento JSON com um valor codificado em JSON para a querychave.

A coisa correta a fazer para descarregar a consulta em um arquivo separado é fazer exatamente o que você fez no último exemplo. Coloque o documento JSON com a consulta codificada em um arquivo e referencie-o --data-binary @filenamena curllinha de comando.

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

informação relacionada