2015-03-02 2 views
1

J'essaye d'écrire un script pour que Hubot fasse un appel AJAX à Strawpoll.me. J'ai une commande cURL qui fonctionne exactement comme je veux, mais j'ai du mal à traduire cela en une fonction Node.js.Nodejs Appel Ajax avec XMLHttpRequest En-tête

curl --header "X-Requested-With: XMLHttpRequest" --request POST --data "options=1&options=2&options=3&options=4&options=5&title=Test&multi=false&permissive=false" http://strawpoll.me/api/v2/polls 

Voici ce que j'ai actuellement dans mon script.

QS = require 'querystring' 

module.exports = (robot) -> 
    robot.respond /strawpoll "(.*)"/i, (msg) -> 
     options = msg.match[1].split('" "') 
     data = QS.stringify({ 
      title: "Strawpoll " + Math.floor(Math.random() * 10000), 
      options: options, 
      multi: false, 
      permissive: true 
      }) 
     req = robot.http("http://strawpoll.me/api/v2/polls").headers({"X-Requested-With": "XMLHttpRequest"}).post(data) (err, res, body) -> 
      if err 
      msg.send "Encountered an error :(#{err}" 
      return 
      msg.reply(body) 

La version du script retourne {"error":"Invalid request","code":40}

Je ne peux pas dire ce que je fais mal. Merci de votre aide.

Répondre

1

Pour les requêtes POST, curl définit Content-Type à application/x-www-form-urlencoded. Hubot utilise le client http de Node, lequel OTOH n'utilise aucune valeur par défaut pour l'en-tête Content-Type. Sans en-tête Content-Type explicite, la ressource à http://strawpoll.me/api/v2/polls n'est pas capable de discerner le corps de la demande. Vous devrez définir l'en-tête Content-Type manuellement pour imiter la requête de curl.

robot.http('http://strawpoll.me/api/v2/polls') 
    .headers({'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/x-www-form-urlencoded'}) 
    .post(data) 
+0

C'était tout! Merci beaucoup. – ericsaupe