ノードでページを開き、アプリケーションのコンテンツを処理したい。このような何かがうまくいくようです:
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
});
ただし、ページが301/302リダイレクトを返す場合、これは機能しません。複数のリダイレクトがある場合、再利用可能な方法でそれを行うにはどうすればよいですか?ノードアプリケーションからのhttp応答の処理をより簡単に処理するために、httpの上にラッパーモジュールがありますか?
リダイレクトに従うだけで、組み込みのHTTPおよびHTTPSモジュールを引き続き使用する場合は、 https://github.com/follow-redirects/follow-redirects を使用することをお勧めします。
yarn add follow-redirects
npm install follow-redirects
あなたがする必要があるのは、交換することです:
var http = require('http');
と
var http = require('follow-redirects').http;
...そして、すべてのリクエストは自動的にリダイレクトに従います。
開示:このモジュールを書きました。
更新:
これで、followAllRedirects
パラメーターを使用して、var request = require('request');
ですべてのリダイレクトをたどることができます。
request({
followAllRedirects: true,
url: url
}, function (error, response, body) {
if (!error) {
console.log(response);
}
});
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);
リダイレクトのあるURLを取得するために使用する関数は次のとおりです。
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);
}
});
}
http.getと同じように機能しますが、リダイレクトに従います。
https
サーバーがある場合は、https://
プロトコルを使用するようにURLを変更します。
私はこれで同様の問題に遭遇しました。私のurlにはhttp://
プロトコルがあり、POST
リクエストをしたいのですが、サーバーはhttps
にリダイレクトしたいです。何が起こるかというと、ノードhttpの振る舞いがGET
メソッドでリダイレクト要求(次)を送信することが判明しましたが、そうではありません。
私がやったことは、URLをhttps://
プロトコルに変更することであり、それは動作します。
PUTまたはPOST Request。の場合。statusCode405または許可されていないメソッドを受け取った場合。この実装を "request"ライブラリで試して、言及されたプロパティを追加します。
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);
}
});
}