2016-07-16 30 views
5

Mam skrypt powłoki, którego używam do publikowania rzeczy na kanale hipchat. Działa dobrze, dopóki nie spróbuję wysłać wiadomości zawierającej znaki, które wymagają ucieczki. Biegnę tak jak polecenie (zwróć uwagę na dodatkowy ukośnik w tam, aby spowodować problem)Jak mogę napisać ciąg json z curl, który ma znaki, które potrzebują ucieczki?

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

i mój kod w moim skrypcie bash (hipchatmsg.sh), która ma znaczenie to:

# 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 

Jeśli staram się uruchomić komendę powyżej wszelkich znaków, które muszą uciekających, będę się błąd jak poniżej:

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

Znalazłem coś niby podobna tu gdzie najlepszym rozwiązaniem była próba wysłania curl posta - -da Ta-urlencode, więc próbowałem w ten sposób:

Ale to nie przyniosło efektu.

Czego mi tu brakuje?

+1

Kodowanie URL i kodowanie JSON to dwie różne rzeczy; 'curl' nie zna jednak JSON. – chepner

Odpowiedz

11

Najłatwiej jest użyć programu takiego jak jq do wygenerowania JSON; zadba o ucieczkę przed tym, co musi uciekać.

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 & 

Argument @- do -d mówi curl się ze standardowego wejścia, który jest zasilany z jq rurą. Opcje --arg do jq udostępniają łańcuchy zakodowane w JSON do filtra, który jest po prostu wyrażeniem obiektu JSON.

+0

Dzięki za wyjaśnienie tego. Jesteś ratownikiem! JQ jest niesamowity – willdanceforfun