2012-08-28 4 views
2

Donc, j'essaie d'utiliser un service appelé Postmark pour envoyer un e-mail au format HTML. Ils ont une certaine documentation de l'API here, et ils donnent cet exemple sur la façon d'utiliser CURL:Comment faire pour échapper des caractères dans une partie d'une demande JSON POST avec 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: '[email protected]', To: '[email protected]', Subject: 'Postmark test', HtmlBody: '<html><body><strong>Hello</strong> dear Postmark user.</body></html>'}" 

Alors, c'est tout bon et fonctionne très bien quand j'utiliser mon propre jeton. Le problème est quand j'ajoute mon propre HtmlBody. Si j'envoie un message simple, cela fonctionne très bien. Dès que j'ajoute certains caractères spéciaux, ça casse. Par exemple, si je fais quelque chose comme ceci:

-d "{From: '[email protected]', To: '[email protected]', Subject: 'Postmark test', HtmlBody: '<!DOCTYPE html><html><body><strong>Hello</strong> dear Postmark user.</body></html>'}" 

Il brise à cause de la !. Comment puis-je réparer cela?


MISE À JOUR: Comme sourcejedi a fait remarquer que je suis en cours d'exécution depuis le shell (bash), de sorte que la question ! me fait sens maintenant. J'ai déplacé la chaîne JSON dans un fichier séparé appelé email.json et chargé en utilisant -d @email.json. Cela a fonctionné pour un simple e-mail avec <!DOCTYPE>, mais je me fais toujours l'erreur suivante lorsque je tente de charger le code HTML complet:

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

Je crois que cela a à voir avec d'autres caractères spéciaux. J'ai la même erreur quand j'utilise --data-urlencode @email.json.

Répondre

3

Vous devez utiliser --data-urlencode, il devrait donc être comme curl -X POST --data-urlencode

Quand je l'ai testé sur ma fin ..

* 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 
+0

Toujours semble me casser un retour juste: -bash:! DOCTYPE: événement non trouvé – ralphthemagician

+0

Je viens de tester le même sur ma fin. cela fonctionne bien .. êtes-vous sûr que vous recevez l'erreur .. voir la sortie de test que j'ai. J'ai également reçu l'erreur d'application 'Mauvais ou manquant de jeton d'API de serveur ou d'utilisateur 'car j'utilise le mauvais jeton de serveur attendu. –

2

semble encore se briser sur moi un peu retourne: -bash: ! DOCTYPE: événement non trouvé

C'est une erreur du shell bash. Vous auriez besoin d'échapper à la! comme \! toi même. Mais vous feriez mieux de lire un fichier, je pense. Au lieu de -d data, utilisez -d @datafile. (Ou -d @- à lire à partir de stdin).

+0

Dans ce cas, est-ce que je pourrais simplement mettre toute la chaîne JSON dans un fichier? – ralphthemagician

+1

@ralphthemagician Oui, cela devrait fonctionner. Tant que vous n'essayez pas de le créer à partir du shell en utilisant "echo", parce que vous auriez exactement le même problème :).("chat", ou un éditeur basé sur la console serait bien). – sourcejedi

+0

Je l'ai essayé. Ça marche. Sorta. Le ! n'est plus un problème, mais j'obtiens "ErrorCode": 402, "Message": "Entrée JSON invalide reçue." lorsque j'essaie d'utiliser le balisage HTML complet. Je pense que cela a quelque chose à voir avec le {} dans la section style. Semble être un pas dans la bonne direction cependant. – ralphthemagician

2

J'ai déjà reçu la même erreur lors de l'envoi de données JSON. ce que je faisais était enfermé les données avec un seul devis et utiliser Guillemet pour une chaîne:

donc de:

-d "{From: '[email protected]', To: '[email protected]', Subject: 'Postmark test', HtmlBody: '<html><body><strong>Hello</strong> dear Postmark user.</body></html>'}" 

utilisation:

-d '{From: "[email protected]", To: "[email protected]", Subject: "Postmark test", HtmlBody: "<html><body><strong>Hello</strong> dear Postmark user.</body></html>"}' 

espérons que cette aide.

Questions connexes