如何使用 Node http 模块发出请求

How to make request with Node http module

如何使用 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();

我发现了三个问题:

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

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 are higher level than the http.request() library and are simpler to use for coding like this and very well tested. I highly recommend picking your favorite from that list. I personally use 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);
});