2016-07-16 14 views
5

Tôi có một kịch bản trình bao mà tôi đã sử dụng để đăng nội dung lên kênh hipchat. Nó hoạt động ok cho đến khi tôi thử và gửi một tin nhắn có các ký tự cần thoát. Tôi chạy lệnh như vậy (lưu ý các dấu chéo ngược thêm vào đó để gây ra một vấn đề)Làm cách nào để đăng chuỗi json có curl có các ký tự cần thoát?

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

Và mã của tôi trong kịch bản bash của tôi (hipchatmsg.sh) mà vấn đề là thế này:

# 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 

Nếu tôi thử và chạy lệnh trên với bất kỳ ký tự mà không cần thoát ra, tôi sẽ nhận được một lỗi như thế này:

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

tôi tìm thấy một cái gì đó loại tương tự trên đây, nơi những lời khuyên tốt nhất là để thử gửi bài curl với - -da ta-urlencode, vì vậy tôi đã thử như sau:

Nhưng điều này không có hiệu lực.

tôi thiếu gì ở đây?

+1

Mã hóa URL và mã hóa JSON là hai thứ khác nhau; 'curl' không biết về JSON. – chepner

Trả lời

11

Điều dễ nhất cần làm là sử dụng chương trình như jq để tạo JSON; nó sẽ chăm sóc thoát khỏi những gì cần phải được trốn thoát.

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 & 

Đối số @- để -d nói curl để đọc từ đầu vào tiêu chuẩn, được cung cấp từ jq qua các đường ống. Các tùy chọn --arg để jq tạo các chuỗi được mã hóa JSON có sẵn cho bộ lọc, đơn giản chỉ là biểu thức đối tượng JSON.

+0

Cảm ơn bạn đã giải thích điều đó. Bạn là một người tiết kiệm cuộc sống! JQ thật tuyệt vời – willdanceforfun

Các vấn đề liên quan