【问题标题】:How to make request with Node http module如何使用 Node http 模块发出请求
【发布时间】:2022-01-16 13:16:28
【问题描述】:

如何使用 http.request 向https://api.urbandictionary.com/v0/define?term=wat 发出获取请求? 运行此代码时,我在关闭之前没有收到任何响应:

import { request, METHODS } from 'http';

  const options = {
    host: 'api.urbandictionary.com',
    path: '/v0/define/?term=wat',
    pathname: '/v0/define/',
    search: 'term=wat',
    method: 'GET',
    headers: { Accept: 'application/json' }
  }

  const req = request(options, (res) => {
    let resAccum = '';
    res.on('data', (chunk) => {
      console.log('GOT chunk', chunk);
      resAccum += chunk;
    });
    res.on('close', () => console.log('FINISHED', resAccum)); // FINISHED
    res.on('error', err => console.log(err));
  });

  req.on('error', err => console.log(err));
  req.end();

【问题讨论】:

    标签: node.js http request


    【解决方案1】:

    我发现了三个问题:

    1. 您需要监听 end 事件,而不是 close 事件
    2. 您需要使用 https
    3. 您的路径不正确。它不会在 ? 之前接受 /

    close 事件发生在 req 对象上,而不是 res 对象上。

    文档中的代码示例here。我同意文档中的措辞没有说明这一点,但文档中有多个编码示例显示使用res.on('end', ...) 知道所有响应何时到达。

    这是一个也解析 JSON 的工作版本:

    import { request } from 'https';
    
    const options = {
        host: 'api.urbandictionary.com',
        path: '/v0/define?term=wat',
        method: 'GET',
        headers: { Accept: 'application/json' }
    }
    
    const req = request(options, (res) => {
        console.log(res.headers);
        console.log(res.statusCode, res.statusMessage);
    
        let resAccum = '';
        res.on('data', chunk => {
            resAccum += chunk.toString();
        });
    
        // *** Use end event here ***
        res.on('end', () => {
            console.log('FINISHED');
            const data = JSON.parse(resAccum);
            console.log(data);
        });
        res.on('error', err => console.log(err));
    });
    
    req.on('error', err => console.log(err));
    req.end();
    

    仅供参考,here 列出的库比http.request() 库更高级别,并且更易于用于此类编码并且经过良好测试。我强烈建议从该列表中选择您最喜欢的。我个人使用got(),因为我喜欢他们设计界面的方式,但之前列表中的任何一个都是不错的选择。

    作为参考,使用 got() 库可以实现相同的结果:

    import got from 'got';
    
    got("https://api.urbandictionary.com/v0/define?term=wat").json().then(result => {
        console.log(result);
    }).catch(err => {
        console.log(err);
    });
    

    【讨论】:

    • 仍然得到一个空响应。
    • @kasymbayaman - 究竟什么是空的? console.log('GOT chunk', chunk); 有什么显示吗?你知道你的响应中的数据是字符串还是缓冲区?
    • 不,不接受任何块,完成后没有任何记录
    • @kasymbayaman - 我发现了其他几个问题。我的答案中的代码现在正在运行。您必须使用https,而您的path 有问题。
    猜你喜欢
    • 2012-04-03
    • 2018-05-04
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 2019-10-20
    • 2019-06-22
    • 2020-04-24
    • 2017-07-18
    相关资源
    最近更新 更多