web-dev-qa-db-ja.com

Node.jsでHTTPリダイレクトをどのようにフォローしますか?

ノードでページを開き、アプリケーションのコンテンツを処理したい。このような何かがうまくいくようです:

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の上にラッパーモジュールがありますか?

66
Zach

ノードアプリケーションからのhttp応答の処理をより簡単に処理するために、httpの上にラッパーモジュールがありますか?

request

リクエスト内のリダイレクトロジック

44
Raynos

リダイレクトに従うだけで、組み込みの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;

...そして、すべてのリクエストは自動的にリダイレクトに従います。

開示:このモジュールを書きました。

88
Olivier Lalonde

更新:

これで、followAllRedirectsパラメーターを使用して、var request = require('request');ですべてのリダイレクトをたどることができます。

request({
  followAllRedirects: true,
  url: url
}, function (error, response, body) {
  if (!error) {
    console.log(response);
  }
});
28
skozz

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);
11
Nakilon

リダイレクトのある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と同じように機能しますが、リダイレクトに従います。

2
jcubic

httpsサーバーがある場合は、https://プロトコルを使用するようにURLを変更します。

私はこれで同様の問題に遭遇しました。私のurlにはhttp://プロトコルがあり、POSTリクエストをしたいのですが、サーバーはhttpsにリダイレクトしたいです。何が起こるかというと、ノードhttpの振る舞いがGETメソッドでリダイレクト要求(次)を送信することが判明しましたが、そうではありません。

私がやったことは、URLをhttps://プロトコルに変更することであり、それは動作します。

0
Kevin F.

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);
        }
     });
}
0
Sanjeet kumar