Comment puis-je faire un aller requête HTTP POST, avec des données, en node.js?
Réponses
Trop de publicités?Cela devient beaucoup plus facile si vous utilisez la demande de la bibliothèque.
var request = require('request');
request.post(
'http://www.yoursite.com/formpage',
{ form: { key: 'value' } },
function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body)
}
}
);
En plus d'offrir une belle syntaxe qu'il fait json demandes facile, poignées oauth signature (pour twitter, etc.), peut faire des formulaires en plusieurs parties (par exemple, pour le téléchargement de fichiers) et le streaming.
Voici un exemple d'utilisation de node.js pour faire une requête POST vers le Google Compilateur API:
// We need this to build our post string
var querystring = require('querystring');
var http = require('http');
var fs = require('fs');
function PostCode(codestring) {
// Build the post string from an object
var post_data = querystring.stringify({
'compilation_level' : 'ADVANCED_OPTIMIZATIONS',
'output_format': 'json',
'output_info': 'compiled_code',
'warning_level' : 'QUIET',
'js_code' : codestring
});
// An object of options to indicate where to post to
var post_options = {
host: 'closure-compiler.appspot.com',
port: '80',
path: '/compile',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': post_data.length
}
};
// Set up the request
var post_req = http.request(post_options, function(res) {
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('Response: ' + chunk);
});
});
// post the data
post_req.write(post_data);
post_req.end();
}
// This is an async file read
fs.readFile('LinkedList.js', 'utf-8', function (err, data) {
if (err) {
// If this were just a small part of the application, you would
// want to handle this differently, maybe throwing an exception
// for the caller to handle. Since the file is absolutely essential
// to the program's functionality, we're going to exit with a fatal
// error instead.
console.log("FATAL An error occurred trying to read in the file: " + err);
process.exit(-2);
}
// Make sure there's data before we post it
if(data) {
PostCode(data);
}
else {
console.log("No data to post");
process.exit(-1);
}
});
J'ai mis à jour le code pour montrer comment publier des données à partir d'un fichier, au lieu de la chaîne codée en dur. Il utilise la async fs.readFile
de commande pour atteindre cet objectif, affichant le code après avoir réussi à lire. Si il y a une erreur, il est jeté, et si il n'y a pas de données, le processus s'arrête avec une valeur négative pour indiquer l'échec.
J'utilise Restler et l'Aiguille des fins de production. Ils sont à la fois beaucoup plus puissant que les httprequest. Il est possible de demander avec l'authentification de base, spéciales d'entrée d'en-tête ou même télécharger/télécharger des fichiers.
Comme pour le post/get opération, ils sont aussi beaucoup plus simple à utiliser que les premières appels ajax à l'aide de httprequest.
needle.post('https://my.app.com/endpoint', {foo:'bar'},
function(err, resp, body){
console.log(body);
});
Vous pouvez également utiliser Requestify, un vraiment cool et simple client HTTP, j'ai écrit pour nodeJS + il prend en charge la mise en cache.
Il suffit de faire la suivante:
var requestify = require('requestify');
requestify.post('http://example.com', {
hello: 'world'
})
.then(function(response) {
// Get the response body (JSON parsed or jQuery object for XMLs)
response.getBody();
});
J'ai fait un amical wrapper pour ce complexe de l'API: https://gist.github.com/1393666