在浏览器中使用AJAX请求的问题

时间:2012-04-30 09:31:43

标签: jquery error-handling cross-browser jsonp

我正在向我的服务器实现一些AJAX请求。请求类型和参数在两种情况下完全相同,但来自服务器的响应类型不同。

案例1

这是使用钛网络http客户端在Titanium中实现的。

var xhr = Ti.Network.createHTTPClient({
    onload : function() {
        alert('sucess');
    },
    onerror : function(e) {
         alert('error');
    },
    timeout : 5000
});
var main_url = "http://localhost:3000/shops/560/login.json?api_token=some_token&customer[phone_number]=9988776655&customer[pin]=9876";
xhr.open('GET', main_url);
xhr.send();

完美地返回响应,似乎对我有用。

案例2

这是使用JQuery AJAX方法在本地文件中实现的。

var main_url = "http://localhost:3000/shops/560/login.json?api_token=some_token&customer[phone_number]=9988776655&customer[pin]=9876";

       $.ajax({
        url: main_url,
        type: "GET",
        dataType: "json",
        timeout: 5000,
        success: function(data, status, xmlstatus) {
            alert("success");
        },
        error: function(data, status, xmlstatus){
            if (t === "timeout") {
                alert("timeout");
            } else {
                alert("some error");
            }
        }
     });

但由于浏览器中的 CROSS DOMAIN政策,它会返回

 XMLHttpRequest cannot load http://localhost:3000/shops/560/login.json?api_token=some_token&customer[phone_number]=9988776655&customer[pin]=9876. Origin null is not allowed by Access-Control-Allow-Origin.

所以,为了避免这种情况,我添加了另一个参数

 &callback = ?

但它仍然会返回

 alert('some error');

无法确定哪些内容出错了。 当URL,参数,类型一切都相同时。

--------------- EDIT -------------

向内挖掘让我感到欣慰:

 console.log(data) => parsererror

 console.log(xmlstatus) => jQuery164023596301255747676_1335786441349 was not called

2 个答案:

答案 0 :(得分:1)

我认为你的服务器没有用jsonp回答,只是用json回答。

JSONP答案是这样的:

callback(someJson)

回调是您提供的回调的名称,或者是由jquery自动提供的回调的名称。您不能简单地在JSONP中调用为JSON查询而生成的服务器。

这是一个示例(有点复杂,它是真实的代码,但也许您会过滤与您的问题无关的内容):

客户:https://github.com/Canop/braldop/blob/master/chrome/braldop/inext_com.js

服务器:https://github.com/Canop/braldop/blob/master/go/src/braldopserver/BraldopServer.go

答案 1 :(得分:0)

正如您所说的“本地文件”一样,如果您使用协议文件加载文件,请注意不能在ajax中做很多事情://。即使服务器是localhost,也需要使用http://。