2014-03-06 27 views
3
的NodeJS我

有一个RESTful Web服务(托管通过IIS不同的服务器上),返回JSON。奇怪的是下面的NodeJS命令行测试应用(不是通过网页浏览器,而是通过命令行)工作正常,并返回JSON:AJAX请求失败jQuery中而不是在

工作的NodeJS应用:

var request = require("request"); 
var btoa = require("btoa"); 

var uname = "corp\\user.name"; 
var pword = "password123" 

var options = { 
    url: "http://192.168.3.142/v1/foo?format=json", 
    headers: { 
     "Authorization": "Basic " + btoa(uname + ":" + pword) 
    } 
}; 

request(options, function(err, response, body) { 
    console.log(body); 
}); 

然而

OPTIONS http://192.168.3.142/v1/foo?format=json 401 (Unauthorized) jquery-1.11.0.min.js:4 
XMLHttpRequest cannot load http://192.168.3.142/v1/foo?format=json. Invalid HTTP status code 401 

这是来自服务器的响应报头:

具有以下AJAX请求失败

AJAX代码:

$.ajaxSetup({ 
    beforeSend: function (xhr, settings) { 
     var creds = { 
      username: "corp\\user.name", 
      password: "password123" 
     }; 
     xhr.setRequestHeader("Authorization", "Basic " + btoa(creds.username + ":" + creds.password)); 
     return true; 
    } 
}); 

$.ajax({ 
    type: "GET", 
    url: "http://192.168.3.142/v1/foo?format=json", 
    success: function (data, text) { 
     console.log(data); 
    } 
}); 

UPDATE:

抛出相同401(未授权)

var creds = { 
    username: "corp\\user.name", 
    password: "password123" 
}; 
var credentials = btoa(creds.username + ":" + creds.password); 
$.ajax({ 
    type: "GET", 
    dataType: "text/json", 
    url: "http://192.168.3.142/v1/foo?format=json", 
    beforeSend: function (xhr) { 
     xhr.setRequestHeader("Authorization", "Basic " + credentials); 
     return true; 
    }, 
    success: function (data, text) { 
     console.log(data); 
    } 
}); 
+0

将beforeSend放入$ .ajax调用中,并在没有设置参数的情况下尝试。不是计算“Basic XXXX”字符串,而是预先计算并静态传递它。我也注意到你的IP地址改变了,那是故意的吗?另外,尝试将'dataType'属性设置为'text/json' – blakev

+0

试试这些然后回报:) – blakev

+0

@blakev:查看更新的问题。仍然抛出“401(未授权)”和IP地址是无意的。 – fuzz

回答

1

一旦我添加xhrFields: { withCredentials: true }$.ajaxSetup({});错误返回:

Credentials flag is 'true', but the 'Access-Control-Allow-Credentials' header is ''. It must be 'true' to allow credentials.

我在服务器端添加Access-Control-Allow-Credentials: true,现在它的正常工作。

var creds = { 
    username: "username", 
    password: "password" 
}; 
var credentials = btoa(creds.username + ":" + creds.password); 
$.ajaxSetup({ 
    xhrFields: { withCredentials: true }, 
    beforeSend: function (xhr, settings) { 
     xhr.setRequestHeader("Authorization", "Basic " + credentials); 
     return true; 
    } 
}); 

$.ajax({ 
    type: "GET", 
    url: "http://localhost/v1/service", 
    async: true, 
    success: function (data, text) { 
     console.log(data); 
    } 
}); 
+0

有疑问。如果我们无法访问服务器端代码。并且curl请求正常运行,那么我们该如何解决这个问题? – Daenarys