Enviar una solicitud POST a través de curl tiene problemas con comillas dobles

0

Entonces, para enviar una solicitud POST a gists (github), puedes hacer algo como esto como se ve en https: //gist.github.com/caspyi ...

curl --user "user" -X POST --data '{"description":"Created via API","public":"true","files":{"file1.txt":{"content":"Demo"}}' https://api.github.com/gists

Pero, en el ejemplo anterior, el nombre del archivo y el contenido del mismo están codificados de manera rígida, que es la parte. file1.txt":{"content":"Demo"}..

Estoy reemplazando la parte anterior con mi variable $file":{"content":"$content"} pero inicialice la variable, la solicitud json debe estar entre comillas dobles, lo que hice como

curl --user "user" -X POST --data "{\"description\":\"Created via API\",\"public\":\"true\",\"files\":{\"$file\":{\"content\":\"$content\"}}' https://api.github.com/gists

Pero esto no funciona, me sale un error json.

{
  "message": "Problems parsing JSON",
  "documentation_url": "https://developer.github.com/v3/gists/#create-a-gist"
}

Incluso, si reemplacé todas las comillas dobles escapadas con \' comillas simples.

¿Alguien sabe cómo incluir una variable dentro de esta solicitud json? por cierto: he utilizado todos los encabezados como

 -H "Content-Type: application/json; charset=UTF-8" 

y muchas combinaciones para validar la solicitud pero en vano.

ACTUALIZAR.

Así es como se ve todo el contenido.

function gist_controller(){
    content=$(cat $1)
    DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
    read -p "enter your password - " pass 
    public="false"
    gist_content=$(cat $1)
    curl --user "samserayo"  -H "Content-Type: application/json; charset=UTF-8" -X POST -d  "{ 'description': 'Created via API', 'public': 'true', 'files':{ ' '$1 ':{ 'content': '$gist_content'}}" https://api.github.com/gists
}
samayo
fuente
Esto es casi seguramente mejor preguntado en Superusuario , ya que no veo una conexión real con el servidor o la administración de la red. Puede marcarlo y solicitar la migración si desea que la pregunta se mueva allí.
a CVn
@ MichaelKjörling Gracias, lo marcó. Sin embargo, creo que la solicitud de rizos tiene algo que ver con la administración del servidor.
samayo
Los problemas con las citas y el escape son los más básicos de todos los problemas de programación (errores de sintaxis), la pregunta debería migrarse a SO.
Alexander

Respuestas:

0

No muestra el valor que ha establecido para $ file o $ content. ¿A qué se expanden ambos? Es probable que uno, o el otro, o ambos, contengan caracteres que no le gustan al analizador JSON. Lo más probable es que algo dentro del valor de expansión variable deba escaparse o codificarse aún más antes de enviarlo al analizador JSON a través de la curvatura.

¿Has exportado las variables de entorno?

Tratar:

echo "$ file $ content";

para asegurarte de que ambos estén ajustados como esperas que estén.

JesseM
fuente
Lo sentimos, actualizado el contenido.
samayo
0

No especificó qué shell está utilizando, pero cualquier cosa entre comillas dobles está sujeta a la expansión del nombre de archivo del shell. En particular, {} tiene significado para la mayoría de las conchas. Esa es la razón por la que el ejemplo que citó utilizó comillas simples para envolver todo el asunto.

Los escapes de Shell son difíciles, ya veces parece imposible obtener lo que quieres. Honestamente, en casos como este escribiría un script de Python para llamar curl, donde sé que el shell no me está "ayudando".

FusionDude
fuente
Lo sentimos, actualizado el contenido. Estoy usando bash shell.
samayo
-1

Tienes que poner toda la cadena entre comillas dobles. ". Y necesitas escapar de las comillas dentro de la cadena (¡no convertirlas en otros tipos de comillas!).

Así que en lugar de:

"{'description': 'Created via API', 'public': 'true', 'files': {'' $ 1 ': {' content ':' $ gist_content '}}"

Usted quiere:

"{\" description \ ": \" Creado a través de API \ ", \" public \ ": \" true \ ", \" files \ ": {\" $ 1 \ ": {\" content \ ": \" $ gist_content \ "}}}"

Probablemente deberías probar con echo y asegúrese de que la cadena es exactamente correcta.

David Schwartz
fuente
No, esto es lo primero que hice antes de volverme loco. No funciona así. Siempre me sale un error como mencioné anteriormente "message": "Problems parsing JSON",
samayo
@samayo Pega el mensaje exacto que enviaste. O es JSON legal o no lo es. (Asegúrese de que cada { tiene una coincidencia }.)
David Schwartz