Je veux ouvrir une page dans le noeud et traiter le contenu de mon application. Quelque chose comme ça semble bien fonctionner:
var opts = {Host: Host, path:pathname, port: 80};
http.get(opts, function(res) {
var page = '';
res.on('data', function (chunk) {
page += chunk;
});
res.on('end', function() {
// process page
});
Toutefois, cela ne fonctionne pas si la page renvoie une redirection 301/302. Comment pourrais-je le faire de manière réutilisable au cas où il y aurait plusieurs redirections? Existe-t-il un module wrapper au-dessus de http pour gérer plus facilement le traitement des réponses http à partir d'une application de noeud?
Existe-t-il un module wrapper au-dessus de http pour gérer plus facilement le traitement des réponses http à partir d'une application de noeud?
Si tout ce que vous voulez, c'est suivre les redirections tout en utilisant les modules HTTP et HTTPS intégrés, je vous suggère d'utiliser https://github.com/follow-redirects/follow-redirects .
yarn add follow-redirects
npm install follow-redirects
Tout ce que vous avez à faire est de remplacer:
var http = require('http');
avec
var http = require('follow-redirects').http;
... et toutes vos demandes suivront automatiquement les redirections.
Divulgation: j'ai écrit ce module.
Mettre à jour:
Vous pouvez maintenant suivre toutes les redirections avec var request = require('request');
en utilisant le paramètre followAllRedirects
.
request({
followAllRedirects: true,
url: url
}, function (error, response, body) {
if (!error) {
console.log(response);
}
});
Faites une autre demande basée sur response.headers.location
:
const request = function(url) {
lib.get(url, (response) => {
var body = [];
if (response.statusCode == 302) {
body = [];
request(response.headers.location);
} else {
response.on("data", /*...*/);
response.on("end", /*...*/);
};
} ).on("error", /*...*/);
};
request(url);
Voici la fonction que j'utilise pour récupérer l'URL contenant la redirection:
const http = require('http');
const url = require('url');
function get({path, Host}, callback) {
http.get({
path,
Host
}, function(response) {
if (response.headers.location) {
var loc = response.headers.location;
if (loc.match(/^http/)) {
loc = new Url(loc);
Host = loc.Host;
path = loc.path;
} else {
path = loc;
}
get({Host, path}, callback);
} else {
callback(response);
}
});
}
cela fonctionne comme http.get mais suivez la redirection.
Si vous avez un serveur https
, changez votre URL pour utiliser le protocole https://
.
J'ai eu un problème similaire avec celui-ci. Mon URL a le protocole http://
et je souhaite effectuer une demande POST
, mais le serveur souhaite la rediriger vers https
. En réalité, le comportement du nœud http envoie la demande de redirection (suivant) dans la méthode GET
, ce qui n’est pas le cas.
Ce que j'ai fait est de changer mon URL en protocole https://
et cela fonctionne.
En cas de PUT ou de POST Request. si vous recevez statusCode 405 ou si la méthode n'est pas autorisée. Essayez cette implémentation avec la bibliothèque "request" et ajoutez les propriétés mentionnées.
followAllRedirects: true,
followOriginalHttpMethod: true
const options = {
headers: {
Authorization: TOKEN,
'Content-Type': 'application/json',
'Accept': 'application/json'
},
url: `https://${url}`,
json: true,
body: payload,
followAllRedirects: true,
followOriginalHttpMethod: true
}
console.log('DEBUG: API call', JSON.stringify(options));
request(options, function (error, response, body) {
if (!error) {
console.log(response);
}
});
}