Как экранировать символы в части запроса 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 @-
читать со стандартного ввода).