我想在node中打开一个页面,并处理应用程序中的内容。像这样的东西似乎工作得很好:
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响应?
发布于 2012-11-15 09:25:56
如果你想做的就是遵循重定向,但仍然想使用内置的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';
披露:这个模块是我写的。
发布于 2017-08-20 09:46:34
基于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);
发布于 2020-06-26 13:34:04
这是我使用普通节点下载JSON的(递归)方法,不需要包。
import https from "https";
function get(url, resolve, reject) {
https.get(url, (res) => {
// if any other status codes are returned, those needed to be added here
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));
https://stackoverflow.com/questions/7323932
复制相似问题