这是一个很难问的问题,因为我很困惑,但让我们看看…
我正在比较得到和https.get,并且有以下简单的代码可以工作。两个都得到了和https.get完全相同的结果。
但是,当我在我的法蒂化应用程序中使用完全相同的代码时,得到了预期的工作,但是https.get的结果是308。
有什么方法可以调试这段代码,看看https.get发出了什么,导致远程服务器用308而不是200进行响应?
import got from 'got';
import https from 'https';
const withGot = async (uri) => {
try {
const json = JSON.parse((await got(uri)).body);
console.log(json);
}
catch (error) {
console.error(error);
}
}
const withHttps = async (uri) => {
try {
const json = await getRequest(uri);
console.log(json);
}
catch (error) {
console.error(error);
}
}
const getRequest = async (uri) => {
return new Promise((resolve) => {
https.get(uri, (res) => {
const { statusCode } = res;
const contentType = res.headers['content-type'];
let error;
/**
* Any 2xx status code signals a successful response but
* here we're only checking for 200.
**/
if (statusCode !== 200) {
error = new Error(`ERROR\n${'-'.repeat(50)}\nRequest Failed.\nURI: ${uri}\nStatus Code: ${statusCode}`);
}
else if (!/^application\/json/.test(contentType)) {
error = new Error(`Invalid content-type.\nExpected application/json but received ${contentType}`);
}
if (error) {
console.error(error.message);
/**
* Consume response data to free up memory
**/
res.resume();
return;
}
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => { rawData += chunk; });
res.on('end', () => {
try {
const parsedData = JSON.parse(rawData);
resolve(parsedData);
}
catch (e) {
console.error(e.message);
}
});
}).on('error', (e) => {
console.error(`Got error: ${e.message}`);
});
});
}
const uri = 'https://zenodo.org/api/records/?q=phylogeny';
withGot(uri);
withHttps(uri);发布于 2022-07-23 22:08:49
我找出了问题的原因(以及解决方案)…似乎当我使用https.get时,我仍然必须通过端口443 (https的默认端口)传递选项,否则,https似乎会敲开端口80,然后被重定向到端口443,这会导致服务器发送回html,这会导致JSON解析器嘎吱作响。如果我传递像下面这样的options对象,那么它就能工作了。但是,在没有选项的情况下,独立脚本工作得很好,这仍然很奇怪,所以我仍然感到困惑,尽管我已经找到了解决方案。
const options = {
hostname: 'zenodo.org',
port: 443,
path: `/api/records/?${qs}`,
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
};https://stackoverflow.com/questions/73094007
复制相似问题