首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用https.get代替got导致308

使用https.get代替got导致308
EN

Stack Overflow用户
提问于 2022-07-23 20:28:43
回答 1查看 47关注 0票数 1

这是一个很难问的问题,因为我很困惑,但让我们看看…

我正在比较得到https.get,并且有以下简单的代码可以工作。两个都得到了https.get完全相同的结果。

但是,当我在我的法蒂化应用程序中使用完全相同的代码时,得到了预期的工作,但是https.get的结果是308。

有什么方法可以调试这段代码,看看https.get发出了什么,导致远程服务器用308而不是200进行响应?

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

发布于 2022-07-23 22:08:49

我找出了问题的原因(以及解决方案)…似乎当我使用https.get时,我仍然必须通过端口443 (https的默认端口)传递选项,否则,https似乎会敲开端口80,然后被重定向到端口443,这会导致服务器发送回html,这会导致JSON解析器嘎吱作响。如果我传递像下面这样的options对象,那么它就能工作了。但是,在没有选项的情况下,独立脚本工作得很好,这仍然很奇怪,所以我仍然感到困惑,尽管我已经找到了解决方案。

代码语言:javascript
复制
const options = {
    hostname: 'zenodo.org',
    port: 443,
    path: `/api/records/?${qs}`,
    method: 'GET',
    headers: {
        'Content-Type': 'application/json'
    }
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73094007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档