在Node.js中,除了使用子进程进行CURL调用之外,是否有一种方法可以对远程服务器REST API进行CURL调用并获得返回数据?

我还需要设置远程REST调用的请求头,以及在GET(或POST)中查询字符串。

我找到了这个:http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs

但是它没有显示任何POST查询字符串的方法。


当前回答

Axios

在Node.js中使用Axios的示例(axios_example.js):

const axios = require('axios');
const express = require('express');
const app = express();
const port = process.env.PORT || 5000;

app.get('/search', function(req, res) {
    let query = req.query.queryStr;
    let url = `https://your.service.org?query=${query}`;

    axios({
        method:'get',
        url,
        auth: {
            username: 'the_username',
            password: 'the_password'
        }
    })
    .then(function (response) {
        res.send(JSON.stringify(response.data));
    })
    .catch(function (error) {
        console.log(error);
    });
});

var server = app.listen(port);

确保在你的项目目录中:

npm init
npm install express
npm install axios
node axios_example.js

然后,您可以在http://localhost:5000/search?queryStr=xxxxxxxxx上使用浏览器测试Node.js REST API

类似地,你可以做post,比如:

axios({
  method: 'post',
  url: 'https://your.service.org/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
});

SuperAgent

类似地,您可以使用SuperAgent。

superagent.get('https://your.service.org?query=xxxx')
.end((err, response) => {
    if (err) { return console.log(err); }
    res.send(JSON.stringify(response.body));
});

如果你想做基本的身份验证

superagent.get('https://your.service.org?query=xxxx')
.auth('the_username', 'the_password')
.end((err, response) => {
    if (err) { return console.log(err); }
    res.send(JSON.stringify(response.body));
});

Ref:

https://github.com/axios/axios https://www.twilio.com/blog/2017/08/http-requests-in-node-js.html

其他回答

我使用节点获取,因为它使用熟悉的(如果你是一个web开发人员)fetch() API。fetch()是从浏览器发出任意HTTP请求的新方法。

是的,我知道这是一个节点js的问题,但我们不希望减少API的开发者必须记住和理解的数量,并提高我们的javascript代码的可重用性吗?Fetch是一个标准,所以我们收敛一下如何?

fetch()的另一个好处是它返回一个javascript Promise,所以你可以像这样编写异步代码:

let fetch = require('node-fetch');

fetch('http://localhost', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '{}'
}).then(response => {
  return response.json();
}).catch(err => {console.log(err);});

获取超级种子XMLHTTPRequest。这里有更多信息。

我一直在使用restler进行webservices调用,工作起来很有魅力,而且很整洁。

我发现超级药剂真的很有用, 非常简单 例如

const superagent=require('superagent')
superagent
.get('google.com')
.set('Authorization','Authorization object')
.set('Accept','application/json')
const http = require('http');
const url = process.argv[2];

http.get(url, function(response) {
  let finalData = "";

  response.on("data", function (data) {
    finalData += data.toString();
  });

  response.on("end", function() {
    console.log(finalData.length);
    console.log(finalData.toString());
  });

});

警告:截至2020年2月11日,请求已完全弃用。

如果你使用form-data实现,更多信息请访问https://tanaikech.github.io/2017/07/27/multipart-post-request-using-node.js):

var fs = require('fs');
var request = require('request');
request.post({
  url: 'https://slack.com/api/files.upload',
  formData: {
    file: fs.createReadStream('sample.zip'),
    token: '### access token ###',
    filetype: 'zip',
    filename: 'samplefilename',
    channels: 'sample',
    title: 'sampletitle',
  },
}, function (error, response, body) {
  console.log(body);
});