Как экранировать символы в части запроса JSON POST с CURL?

Итак, я пытаюсь использовать службу Postmark для отправки отформатированного электронного письма в формате HTML. У них здесь есть некоторая документация по API, и они приводят этот пример того, как использовать 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, я запускаю это из оболочки (bash), поэтому ! вопрос имеет смысл для меня сейчас. Я переместил строку JSON в отдельный файл с именем email.json и загрузил его, используя -d @email.json, Это сработало для простого письма с <!DOCTYPE>, но я все еще получаю следующую ошибку при попытке загрузить полный HTML:

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

Я считаю, что это связано с некоторыми другими специальными персонажами. Я получаю ту же ошибку при использовании --data-urlencode @email.json,

3 ответа

Однажды я получил ту же ошибку при публикации данных 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>"}'

надеюсь это поможет.

Вам нужно использовать --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

Все еще кажется, что я просто возвращаюсь: -bash:!DOCTYPE: событие не найдено

Это ошибка оболочки Bash. Вам нужно будет избежать! как \! сам. Но я думаю, что вам лучше читать из файла. Вместо -d data использование -d @datafile, (Или же -d @- читать со стандартного ввода).

Другие вопросы по тегам