如何使用正文发出GET请求

时间:2016-11-24 15:37:10

标签: node.js

  

首先,我了解可以使用的模块(https://www.npmjs.com/package/elasticsearch),但我正在寻找一种方法来解决这个问题,并使用node.js构建模块。

我正在寻找一种方法,使用http模块在​​nodejs中执行以下curl请求:
来源:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-count.html

curl -XGET 'http://localhost:9200/twitter/tweet/_count' -d '
{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}'

例如,向请求机构提出请求。

我已尝试过编写帖子数据的手册中所述:https://nodejs.org/api/http.html#http_http_request_options_callback

req.write(parsedData);

2 个答案:

答案 0 :(得分:4)

以下是仅使用http模块向正文发出HTTP GET请求的示例:

var http = require('http');

var options = {
  host: 'localhost',
  path: '/twitter/tweet/_count',
  port: '9200',
  method: 'GET',
  headers: {'Content-Type': 'application/json'}
};

var callback = function (response) {
  var str = '';
  response.on('data', function (chunk) {
    str += chunk;
  });
  response.on('end', function () {
    console.log(str);
  });
};

var data = {a: 1, b: 2, c: [3,3,3]};
var json = JSON.stringify(data);
var req = http.request(options, callback);
req.write(json);
req.end();

要测试它,您可以使用以下命令启动netcat侦听端口9200:

nc -l 9200

运行我的Node示例会发送以下请求:

GET /twitter/tweet/_count HTTP/1.1
Content-type: application/json
Host: localhost:9200
Connection: close

{"a":1,"b":2,"c":[3,3,3]}

如果您不想使用任何npm模块,例如request,那么您需要熟悉内置http模块的低级API。它有很好的记录:

答案 1 :(得分:1)

我对rsp进行了一些调整,以支持https

import https from 'https';
import http from 'http';

const requestWithBody = (body, options = {}) => {
  return new Promise((resolve, reject) => {
    const callback = function(response) {
      let str = '';
      response.on('data', function(chunk) {
        str += chunk;
      });
      response.on('end', function() {
        resolve(JSON.parse(str));
      });
    };

    const req = (options.protocol === 'https:' ? https : http).request(options, callback);
    req.on('error', (e) => {
      reject(e);
    });
    req.write(body);
    req.end();
  });
};

// API call in async function
const body = JSON.stringify({
  a: 1
});
const result = await requestWithBody(body, options = {
  host: 'localhost',
  port: '3000',
  protocol: 'http:', // or 'https:'
  path: '/path',
  method: 'GET',
  headers: {
    'content-type': 'application/json',
    'Content-Length': body.length
  }
};)