2

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

案例一

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

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");
            }
        }
     });

但是由于浏览器中的跨域策略,它返回

 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、参数、类型一切都一样。

- - - - - - - -编辑 - - - - - - -

挖掘 iniside 给了我回应:

 console.log(data) => parsererror

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

2 回答 2

1

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

JSONP 的答案是这样的:

callback(someJson)

其中 callback 是您提供的回调名称或 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

于 2012-04-30T11:56:49.887 回答
0

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

于 2012-04-30T11:40:54.140 回答