我一直在尝试使用在浏览器中工作的URL来执行HTML GET请求,但在运行我的代码时会以某种方式导致401 Unauthorized错误。问题是我确实提供了身份验证; URL的格式为
http://username:password@url?param=value
它成功用于Firefox和Chrome(我也通过隐身模式以避免使用Cookie)以及Google的Postman应用程序,但是尽管尝试了其他几种HTTP GET请求方法,但它们都会返回未经授权的错误。我通过REST API和XMLHttpRequest以及命令行运行它。
关于可能导致这种情况的任何想法?或者,更好的是,如果有人有类似的问题并有解决方案吗?
(注意:我对这一切都很陌生,不确定我是否足够清楚/详细。如果有人需要,我会尽力详细说明。)
编辑:以下是我正在运行的原始代码的一些想法:
var func = function() {
var options = {
baseUrl: SERVER,
uri: '/device.cgi',
qs: {
param1: value1,
param2: value2
}
};
request(options, function(err, response, body) {
if (err) console.log(err);
else console.log(body);
});
};
我也跑了
function httpGet(theUrl)
{
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", theUrl, false ); // false for synchronous request
xmlHttp.send( null );
return xmlHttp.responseText;
}
来自this question并获得相同的未经授权的结果。
因为显然我正在使用的设备也适用于POST,
var func = function () {
var formData = {
form: {
param1: value1,
param2: value2
}
};
request.post(SERVER + 'device.cgi', formData, function (err, response, body) {
if (err) {
console.log(err);
}
else console.log(body);
}).auth(userID, userPass);
};
仍然有完全相同的结果。
答案 0 :(得分:1)
浏览器正在获取该URL,并为您创建基本HTTP授权标头。
Node.js不会为您执行此操作,因此您必须在代码中自行设置Authorization标头。
var http = require('http');
var options = {
host: 'www.tempuri.org',
path: '/helloworld/',
headers: {
'Authorization': 'Basic QWxhZGRpbjpPcGVuU2VzYW1l'
}
};
http.request(options, function(response) {
var body = '';
response.on('data',function(c) {
body+= c;
})
response.on('end',function() {
console.log(body)
})
}).end();
以下链接讨论基本身份验证,浏览器如何对URL中的数据进行编码,以及如何在Node.js中自行实现它: