15

我必须用 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 连接并获取我需要的信息,因此我确信我的 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

4

4 回答 4

14

这是您的示例,已更正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 有点令人困惑(恕我直言),但我相信您也可以让它工作。

于 2013-06-14T14:45:23.037 回答
1

请求包中的摘要身份验证似乎不完整。

你可以试试:https ://npmjs.org/package/http-digest-client ,它是一个相当不错的摘要认证轻量级实现。

如果您需要使用要发送的正文消息进行摘要身份验证 POST,您可以将 request 与 http-digest-client 结合使用。安装后,只需在 node-modules 下打开 http-digest-client 代码,并将其对 http 包的使用替换为请求包 api。

于 2013-09-14T10:44:34.840 回答
1

试试urllib它将与简单和 disgest auth 一起使用。

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);
于 2019-07-26T13:21:09.763 回答
0

your sample is work

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);
于 2020-10-12T12:03:49.237 回答