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.txt
arquivo 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.txt
arquivo -
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.txt
arquivo que tenho em meu comando curl original, \n
ele funcionará bem.
Arquivo "temp.txt" atualizado
Ou seja, se eu mantiver o conteúdo como este em temp.txt
arquivo, 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 \n
manualmente do temp.txt
arquivo antes de enviar a solicitação curl ou existe alguma outra maneira?
Responder1
Sua carga de dados é um documento JSON que contém uma query
chave. 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 \n
nos 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 query
valor decodificado em um arquivo separado e passá-lo em sua curl
chamada falha, porque a API com a qual você está falandoesperaos dados sejam um documento JSON com um valor codificado em JSON para a query
chave.
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 @filename
na curl
linha de comando.
curl \
--header 'Content-Type: application/json' \
--data-binary '@/Users/david/Downloads/temp.txt' "$API_ENDPOINT"