我必须用Node.JS编写一些代码来获取API文档,但是我在最近几天尝试了我在网上找到的所有解决方案(包括Stack当然),但没有成功......
我的API使用HTTP Digest Auth,这就是问题,我能够连接,这不是什么大问题,但每次我得到相同的回报:
Got response : 401
HTTP Digest Authentication required for "api.example.com"
您可以在不使用身份验证的情况下显示我的基本代码!因为我做了所有的尝试后我不知道自己能做些什么:
var http = require('http')
var options = {
host: 'api.example.com',
path: '/example/1.xml',
};
var request = http.get(options, function(res){
var body = "";
res.on('data', function(data){
body += data;
})
res.on('end', function(){
console.log('Got response : ' + res.statusCode);
console.log(body);
})
res.on('error', function(e){
console.log('Got error : ' +e.message);
});
});
我最后一次尝试是使用这个模块https://npmjs.org/package/request,但每次我得到401时他都不会工作!
有关更多信息,我能够通过Ruby,Python,php和Java连接并获取我需要的信息,因此我确信我的API运行良好,并且我传递的信息是正确的。 我使用Node v0.10.11的最后一个稳定版!
如果有人可以帮助我或找到解决方案,我会很高兴。
编辑: 我将使用模块Mickael/request
添加有关我的测试的一些详细信息首先尝试:
var request = require('request')
var options = {
'url': 'http://api.example.fr/example/1.xml',
'auth': {
'user': 'test',
'pass': 'test',
'sendImmediately': false
}
};
var request = request.get(options, function(error, response, body){
if (!error && response.statusCode == 200){
console.log('body : ' + body)
}
else{
console.log('Code : ' + response.statusCode)
console.log('error : ' + error)
console.log('body : ' + body)
}
});
第二次尝试:
var request = require('request')
request.get('http://api.example.fr/example/1.xml', function(error, response, body){
if (!error && response.statusCode == 200){
console.log('body : ' + body)
}
else{
console.log('Code : ' + response.statusCode)
console.log('error : ' + error)
console.log('body : ' + body)
}
}).auth('test', 'test', false);
但返回仍然是相同的401
答案 0 :(得分:8)
以下是您的示例已更正为使用request
的API。
var options = {
uri: 'http://api.example.fr/example/1.xml',
auth: {
user: 'test',
pass: 'test',
sendImmediately: false
}
};
request(options, function(error, response, body){
if (!error && response.statusCode == 200){
console.log('body : ' + body)
}
else{
console.log('Code : ' + response.statusCode)
console.log('error : ' + error)
console.log('body : ' + body)
}
});
请求可链接样式API有点令人困惑(恕我直言),但我相信你也可以这样做。
答案 1 :(得分:1)
请求包中的摘要身份验证似乎不完整。
你可以尝试:https://npmjs.org/package/http-digest-client,它是一个相当不错的轻量级摘要验证实现。
如果您需要使用要发送的正文消息进行摘要授权POST,您可以将请求与http-digest-client结合使用。安装后,只需在node-modules下打开http-digest-client代码,并将http包的使用替换为请求包api。
答案 2 :(得分:0)
尝试urllib,它将与简单而繁琐的身份验证一起使用。
const httpClient = require('urllib');
const url = 'https://site.domain.com/xmlapi/xmlapi';
const options = {
method: 'POST',
rejectUnauthorized: false,
// auth: "username:password" use it if you want simple auth
digestAuth: "username:password",
content: "Hello world. Data can be json or xml.",
headers: {
//'Content-Type': 'application/xml' use it if payload is xml
//'Content-Type': 'application/json' use it if payload is json
'Content-Type': 'application/text'
}
};
const responseHandler = (err, data, res) => {
if (err) {
console.log(err);
}
console.log(res.statusCode);
console.log(res.headers);
console.log(data.toString('utf8'));
}
httpClient.request(url, options, responseHandler);
答案 3 :(得分:0)
您的样品就是工作
var request = require('request')
request.get('http://api.example.fr/example/1.xml', function(error, response, body){
if (!error && response.statusCode == 200){
console.log('body : ' + body)
}
else{
console.log('Code : ' + response.statusCode)
console.log('error : ' + error)
console.log('body : ' + body)
}
}).auth('test', 'test', false);