Cómo enviar una solicitud curl con datos de publicación importados desde un archivo

Cómo enviar una solicitud curl con datos de publicación importados desde un archivo

Tengo un comando curl a continuación que funciona bien y obtengo la respuesta. Estoy publicando datos json en un punto final que me devuelve la respuesta después de presionarlo.

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

Ahora estoy intentando leer los datos binarios de temp.txtun archivo externo pero de alguna manera no funciona y aparece un error.

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

A continuación se muestra el contenido que tengo en mi temp.txtarchivo:

Archivo original "temp.txt"

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

Este es el error que recibo:

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

¿Hay algo malo que estoy haciendo?

Además, si copio exactamente el mismo contenido en el temp.txtarchivo que tengo en mi comando curl original, \nentonces funciona bien.

Archivo "temp.txt" actualizado

Es decir, si mantengo el contenido como este en temp.txtel archivo, entonces funciona bien desde mi segundo rizo:

{"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}"}

Significa que necesito encontrar una manera de convertir nuevas líneas \nmanualmente desde temp.txtun archivo antes de enviar la solicitud curl o ¿hay alguna otra manera?

Respuesta1

Su carga útil de datos es un documento JSON que contiene una queryclave. El valor de esa clave es un documento codificado en JSON, que posiblemente describe algún tipo de consulta, que no es en sí mismo un documento JSON. Las nuevas líneas están codificadas como \nvalores JSON, y el analizador JSON que utiliza el servidor las traducirá en nuevas líneas literales cuando reciba su solicitud.

Su intento de poner el queryvalor decodificado en un archivo separado y pasarlo en su curlllamada falla, porque la API con la que está hablandoesperalos datos deben ser un documento JSON con un valor codificado en JSON para la queryclave.

Lo correcto para descargar la consulta en un archivo separado es hacer exactamente lo que hizo en el último ejemplo. Coloque el documento JSON con la consulta codificada en un archivo y haga referencia a él --data-binary @filenameen la curllínea de comando.

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

información relacionada