[node.js] 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 위에 래퍼 모듈이 있습니까?



답변

노드 응용 프로그램의 http 응답 처리를보다 쉽게 ​​처리 할 수 ​​있도록 http 위에 래퍼 모듈이 있습니까?

request

요청의 리디렉션 논리


답변

리디렉션을 따르고 싶지만 기본 제공 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;

… 모든 요청은 자동으로 리디렉션을 따릅니다.

TypeScript를 사용하면 유형을 설치할 수도 있습니다.

npm install @types/follow-redirects

그런 다음

import { http, https } from 'follow-redirects';

공개 :이 모듈을 작성했습니다.


답변

최신 정보:

이제 매개 변수 를 var request = require('request');사용하여 모든 리디렉션을 따를 수 있습니다 followAllRedirects.

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과 동일하게 작동하지만 리디렉션을 따릅니다.


답변

PUT 또는 POST 요청의 경우. statusCode 405 또는 메서드가 허용되지 않는 경우. ” 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);
        }
     });
}


답변

다음은 일반 노드로 JSON을 다운로드하는 방법이며 패키지가 필요하지 않습니다.

import https from "https";

function get(url, resolve, reject) {
  https.get(url, (res) => {
    if(res.statusCode === 301 || res.statusCode === 302) {
      return get(res.headers.location, resolve, reject)
    }

    let body = [];

    res.on("data", (chunk) => {
      body.push(chunk);
    });

    res.on("end", () => {
      try {
        // remove JSON.parse(...) for plain data
        resolve(JSON.parse(Buffer.concat(body).toString()));
      } catch (err) {
        reject(err);
      }
    });
  });
}

async function getData(url) {
  return new Promise((resolve, reject) => get(url, resolve, reject));
}

// call
getData("some-url-with-redirect").then((r) => console.log(r));