如何使用CURL转义部分JSON POST请求中的字符?

时间:2012-08-28 18:22:45

标签: json shell post curl postmark

所以,我正在尝试使用名为Postmark的服务发送格式化的HTML电子邮件。他们有一些API文档here,他们给出了关于如何使用CURL的示例:

$: curl -X POST "http://api.postmarkapp.com/email" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "X-Postmark-Server-Token: ed742D75-5a45-49b6-a0a1-5b9ec3dc9e5d" \
-v \
-d "{From: 'sender@example.com', To: 'receiver@example.com', Subject: 'Postmark test', HtmlBody: '<html><body><strong>Hello</strong> dear Postmark user.</body></html>'}"

所以,当我使用自己的令牌时,这一切都很好并且工作得很好。问题是当我添加自己的HtmlBody时。如果我发送一条简单的消息,它就可以了。一旦我添加某些特殊字符,它就会中断。例如,如果我这样做:

-d "{From: 'sender@example.com', To: 'receiver@example.com', Subject: 'Postmark test', HtmlBody: '<!DOCTYPE html><html><body><strong>Hello</strong> dear Postmark user.</body></html>'}"

由于!而中断。我该如何解决这个问题?


更新:由于 sourcejedi 指出我是从shell(bash)运行的,所以!问题现在对我有意义。我将JSON字符串移动到一个名为email.json的单独文件中,并使用-d @email.json加载它。这适用于使用<!DOCTYPE>的简单电子邮件,但是当我尝试加载完整的HTML时,我仍然收到以下错误:

{"ErrorCode":402,"Message":"Received invalid JSON input."}

我相信这与其他一些特殊角色有关。当我使用--data-urlencode @email.json时,我收到同样的错误。

3 个答案:

答案 0 :(得分:3)

您需要使用--data-urlencode,因此它应该像curl -X POST --data-urlencode

当我在我的身边测试时..

* About to connect() to api.postmarkapp.com port 80 (#0)
*   Trying 50.56.54.211... connected
> POST /email HTTP/1.1
> User-Agent: curl/7.23.1 (x86_64-pc-win32) libcurl/7.23.1 OpenSSL/0.9.8r zlib/1
.2.5
> Host: api.postmarkapp.com
> Accept: application/json
> Content-Type: application/json
> X-Postmark-Server-Token: ed742D75-5a45-49b6-a0a1-5b9ec3dc9e5d
> Content-Length: 164

答案 1 :(得分:2)

  

似乎仍然打破我的正确回报:-bash:!DOCTYPE:未找到事件

这是bash shell的错误。你需要逃脱!作为\!你自己。但我认为,你最好不要从文件中阅读。而不是-d data使用-d @datafile。 (或-d @-从stdin读取。)

答案 2 :(得分:2)

我在发布JSON数据时收到了同样的错误。我所做的是用单引号括起数据并使用双引号作为字符串:

所以来自:

-d "{From: 'sender@example.com', To: 'receiver@example.com', Subject: 'Postmark test', HtmlBody: '<html><body><strong>Hello</strong> dear Postmark user.</body></html>'}"

使用:

-d '{From: "sender@example.com", To: "receiver@example.com", Subject: "Postmark test", HtmlBody: "<html><body><strong>Hello</strong> dear Postmark user.</body></html>"}'

希望这会有所帮助。