2016-07-16 122 views
5

Ho uno script di shell che sto usando per pubblicare contenuti su un canale di Hipchat. Funziona bene fino a quando non provo a inviare un messaggio con caratteri che devono essere salvati. Ho eseguito il comando in questo modo (si noti la barra rovesciata aggiuntiva in là per causare un problema)Come posso inviare una stringa json con curl che ha caratteri che devono essere salvati?

/usr/local/bin/hipchatmsg.sh "my great message here \ " red 

E il mio codice nel mio script bash (hipchatmsg.sh) che conta è questo:

# Make sure message is passed 
if [ -z ${1+x} ]; then 
    echo "Provide a message to create the new notification" 
    exit 1 
else 
    MESSAGE=$1 
fi 

// send locally via curl 
/usr/bin/curl -H "Content-Type: application/json" \ 
    -X POST \ 
    -k \ 
    -d "{\"color\": \"$COLOR\", \"message_format\": \"text\", \"message\": \"$MESSAGE\" }" \ 
$SERVER/v2/room/$ROOM_ID/notification?auth_token=$AUTH_TOKEN & 

// $server and $room are defined earlier 

exit 0 

Se provo ed eseguire il comando di cui sopra con i caratteri che hanno bisogno di fuga, mi metterò un errore come questo:

{ 
    "error": { 
    "code": 400, 
    "message": "The request body cannot be parsed as valid JSON: Invalid \\X escape sequence u'\\\\': line 1 column 125 (char 124)", 
    "type": "Bad Request" 
    } 
} 

ho trovato qualcosa tipo di simile qui dove il miglior consiglio è stato quello di provare a inviare il montante flessione con - -da ta-UrlEncode, così ho provato in questo modo:

Ma questo non ha avuto effetto.

Cosa mi manca qui?

+1

Codifica URL e codifica JSON sono due cose diverse; "arricciare" non sa di JSON, però. – chepner

risposta

11

La cosa più semplice da fare è utilizzare un programma come jq per generare il JSON; si prenderà cura di sfuggire a ciò che deve essere sfuggito.

jq -n --arg color "$COLOR" \ 
     --arg message "$MESSAGE" \ 
    '{color: $color, message_format: "text", message: $message}' | 
/usr/bin/curl -H "Content-Type: application/json" \ 
    -X POST \ 
    -k \ 
    [email protected] \ 
    $SERVER/v2/room/$ROOM_ID/notification?auth_token=$AUTH_TOKEN & 

L'argomento @- di -d dice curl leggere dall'input standard, che viene alimentato da jq attraverso il tubo. Le opzioni su jq rendono disponibili le stringhe con codifica JSON sul filtro, che è semplicemente un'espressione dell'oggetto JSON.

+0

Grazie per averlo spiegato. Sei un risparmiatore di vita! JQ è fantastico – willdanceforfun

Problemi correlati