在Node.js中,除了使用子进程进行CURL调用之外,还有一种方法可以对远程服务器进行CURL调用。 REST API并获取返回数据?
我还需要将请求标头设置到远程REST调用,还需要在GET(或POST)中查询字符串。
我找到这个: http //blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs
但它没有显示任何方法来发布查询字符串。
在Node.js中,除了使用子进程进行CURL调用之外,还有一种方法可以对远程服务器进行CURL调用。 REST API并获取返回数据?
我还需要将请求标头设置到远程REST调用,还需要在GET(或POST)中查询字符串。
我找到这个: http //blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs
但它没有显示任何方法来发布查询字符串。
Answers:
看着 http.request
var options = {
host: url,
port: 80,
path: '/resource?id=foo&bar=baz',
method: 'POST'
};
http.request(options, function(res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
}).end();
如何使用请求-简化的HTTP客户端。
2020年2月修改:请求已过时,因此您可能不应再使用它。
这是一个GET:
var request = require('request');
request('http://www.google.com', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // Print the google web page.
}
})
OP还需要POST:
request.post('http://service.com/upload', {form:{key:'value'}})
看看http://isolasoftware.it/2012/05/28/call-rest-api-with-node-js/
var https = require('https');
/**
* HOW TO Make an HTTP Call - GET
*/
// options for GET
var optionsget = {
host : 'graph.facebook.com', // here only the domain name
// (no http/https !)
port : 443,
path : '/youscada', // the rest of the url with parameters if needed
method : 'GET' // do GET
};
console.info('Options prepared:');
console.info(optionsget);
console.info('Do the GET call');
// do the GET request
var reqGet = https.request(optionsget, function(res) {
console.log("statusCode: ", res.statusCode);
// uncomment it for header details
// console.log("headers: ", res.headers);
res.on('data', function(d) {
console.info('GET result:\n');
process.stdout.write(d);
console.info('\n\nCall completed');
});
});
reqGet.end();
reqGet.on('error', function(e) {
console.error(e);
});
/**
* HOW TO Make an HTTP Call - POST
*/
// do a POST request
// create the JSON object
jsonObject = JSON.stringify({
"message" : "The web of things is approaching, let do some tests to be ready!",
"name" : "Test message posted with node.js",
"caption" : "Some tests with node.js",
"link" : "http://www.youscada.com",
"description" : "this is a description",
"picture" : "http://youscada.com/wp-content/uploads/2012/05/logo2.png",
"actions" : [ {
"name" : "youSCADA",
"link" : "http://www.youscada.com"
} ]
});
// prepare the header
var postheaders = {
'Content-Type' : 'application/json',
'Content-Length' : Buffer.byteLength(jsonObject, 'utf8')
};
// the post options
var optionspost = {
host : 'graph.facebook.com',
port : 443,
path : '/youscada/feed?access_token=your_api_key',
method : 'POST',
headers : postheaders
};
console.info('Options prepared:');
console.info(optionspost);
console.info('Do the POST call');
// do the POST call
var reqPost = https.request(optionspost, function(res) {
console.log("statusCode: ", res.statusCode);
// uncomment it for header details
// console.log("headers: ", res.headers);
res.on('data', function(d) {
console.info('POST result:\n');
process.stdout.write(d);
console.info('\n\nPOST completed');
});
});
// write the json data
reqPost.write(jsonObject);
reqPost.end();
reqPost.on('error', function(e) {
console.error(e);
});
/**
* Get Message - GET
*/
// options for GET
var optionsgetmsg = {
host : 'graph.facebook.com', // here only the domain name
// (no http/https !)
port : 443,
path : '/youscada/feed?access_token=you_api_key', // the rest of the url with parameters if needed
method : 'GET' // do GET
};
console.info('Options prepared:');
console.info(optionsgetmsg);
console.info('Do the GET call');
// do the GET request
var reqGet = https.request(optionsgetmsg, function(res) {
console.log("statusCode: ", res.statusCode);
// uncomment it for header details
// console.log("headers: ", res.headers);
res.on('data', function(d) {
console.info('GET result after POST:\n');
process.stdout.write(d);
console.info('\n\nCall completed');
});
});
reqGet.end();
reqGet.on('error', function(e) {
console.error(e);
});
我使用node-fetch是因为它使用了熟悉的fetch()API(如果您是Web开发人员)。fetch()是从浏览器发出任意HTTP请求的新方法。
是的,我知道这是一个节点js问题,但是我们是否不想减少必须记住和理解的API开发人员的数量,并提高我们的javascript代码的可重用性?提取是标准那么我们如何融合呢?
关于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。这是更多信息。
node-fetch
编写API时出现的问题是,只有完整的URL才有效,而相对URL则不起作用。
在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
然后,可以使用浏览器在以下位置测试Node.js REST API: http://localhost:5000/search?queryStr=xxxxxxxxx
同样,您可以发布,例如:
axios({
method: 'post',
url: 'https://your.service.org/user/12345',
data: {
firstName: 'Fred',
lastName: 'Flintstone'
}
});
同样,您可以使用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));
});
使用最新的异步/等待功能
https://www.npmjs.com/package/request-promise-native
npm install --save request
npm install --save request-promise-native
//码
async function getData (){
try{
var rp = require ('request-promise-native');
var options = {
uri:'https://reqres.in/api/users/2',
json:true
};
var response = await rp(options);
return response;
}catch(error){
throw error;
}
}
try{
console.log(getData());
}catch(error){
console.log(error);
}
另一个例子-您需要为此安装请求模块
var request = require('request');
function get_trustyou(trust_you_id, callback) {
var options = {
uri : 'https://api.trustyou.com/hotels/'+trust_you_id+'/seal.json',
method : 'GET'
};
var res = '';
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
res = body;
}
else {
res = 'Not Found';
}
callback(res);
});
}
get_trustyou("674fa44c-1fbd-4275-aa72-a20f262372cd", function(resp){
console.log(resp);
});
我没有使用cURL找到任何内容,因此我在node-libcurl周围写了一个包装,可以在https://www.npmjs.com/package/vps-rest-client上找到。
进行POST就像这样:
var host = 'https://api.budgetvm.com/v2/dns/record';
var key = 'some___key';
var domain_id = 'some___id';
var rest = require('vps-rest-client');
var client = rest.createClient(key, {
verbose: false
});
var post = {
domain: domain_id,
record: 'test.example.net',
type: 'A',
content: '111.111.111.111'
};
client.post(host, post).then(function(resp) {
console.info(resp);
if (resp.success === true) {
// some action
}
client.close();
}).catch((err) => console.info(err));
如果您使用Node.js 4.4+,请查看reqclient,它使您可以进行呼叫并以cURL样式记录请求,因此您可以轻松地在应用程序外部检查和重现呼叫。
返回无极对象,而不是简单的传球回调,这样你就可以在更处理结果“时尚”的方式,链处理结果,轻松地结果,并以标准的方式处理错误。还删除了每个请求的许多样板配置:基本URL,超时,内容类型格式,默认标头,URL中的参数和查询绑定以及基本缓存功能。
这是一个如何初始化它,进行调用并使用curl样式记录操作的示例:
var RequestClient = require("reqclient").RequestClient;
var client = new RequestClient({
baseUrl:"http://baseurl.com/api/", debugRequest:true, debugResponse:true});
client.post("client/orders", {"client": 1234, "ref_id": "A987"},{"x-token": "AFF01XX"});
这将登录控制台...
[Requesting client/orders]-> -X POST http://baseurl.com/api/client/orders -d '{"client": 1234, "ref_id": "A987"}' -H '{"x-token": "AFF01XX"}' -H Content-Type:application/json
当响应返回时...
[Response client/orders]<- Status 200 - {"orderId": 1320934}
这是一个如何处理承诺对象响应的示例:
client.get("reports/clients")
.then(function(response) {
// Do something with the result
}).catch(console.error); // In case of error ...
当然,它可以与安装:npm install reqclient
。
您可以使用curlrequest轻松设置要执行的请求时间...甚至可以在选项中设置标头以“ 伪造 ”浏览器调用。
警告:自2020年2月11日起,请求已完全弃用。
如果您使用表单数据实现,请获取更多信息(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);
});