노드에서 페이지를 열고 내 응용 프로그램의 내용을 처리하고 싶습니다. 이와 같은 것이 잘 작동하는 것 같습니다.
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;
… 모든 요청은 자동으로 리디렉션을 따릅니다.
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));