8

最近我意识到我需要使用easyXDM而不是 jQuery$.ajax来进行跨域发布请求。设置 easyXDM 后,我看到功能排列相当紧密:

jQuery:

$.ajax({
    url: "/ajax/",
    method: "POST",
    data: myData
});

易XDM:

xhr.request({
    url: "/ajax/",
    method: "POST",
    dataType: 'json', // I added this trying to fix the problem, didn't work
    data: myData
});

myData 设置如下:

myData = {};
myData[1] = 'hello';
myData[2] = 'goodbye';
myData[3] = {};
myData[3][1] = 'sub1';
myData[3][2] = 'sub2';
myData[3][3] = 'sub3';

当我使用 jQuery 发出请求时,它会正确处理子字段,但不能使用 easyXDM。

下面是 POST 请求如何通过 jQuery 进入服务器:

屏幕截图与阴影.png http://img37.imageshack.us/img37/4526/screenshotwithshadow.png

下面是easyXDM的用法:

screenshot-with-shadow.png http://img204.imageshack.us/img204/4526/screenshotwithshadow.png

如何像 jQuery 一样通过 easyXDM / XHR 请求发送 javascript 对象/键值对数组?

4

3 回答 3

4

鉴于评论中讨论的easyXDM的局限性,您可以使用它的唯一方法是将数据传递给.request时手动序列化数据,即

xhr.request({
    url: "/ajax/",
    method: "POST",
    data: {jsonData: JSON.stringify(myData)}
});

或者,您可以创建自己的 postMessage 解决方案,但您将排除 IE7 及以下版本。

于 2012-10-26T15:11:55.637 回答
2

我认为您对通过 AJAX 发送跨域请求是错误的。无论 JavaScript API 是什么,您都可以通过 AJAX 跨域发送请求。但是,为了跨域接收响应,响应需要是JSONP数据类型。

JSONP 只是带有填充的 JSON,例如:

JSON:

{ Key: "Hello", Value: "World" }

JSONP:

callback({ Key: "Hello", Value: "World" })

这是一个细微的区别,但 JSONP 绕过浏览器同源策略并允许您使用由另一台服务器提供的 JSON 数据。

要通过 jQuery AJAX 使用来自另一台服务器的 JSON 数据,请尝试以下操作:

$.ajax({
    url: "http://mydomain.com/Service.svc/GetJSONP?callback=callback",
    dataType: "jsonp",
    data: myData,
    success: function(data) {
        alert(data);
    }
});

为此,您必须确保您的 Web 服务以 JSONP 而不是 JSON 的形式返回结果。

于 2012-10-26T14:22:15.453 回答
1

由于 easyXDM 无法正确序列化,您需要手动序列化数据:

JSON.stringify(myData)

由于请求现在将包含 json 字符串而不是对象,因此 Index.html 不应解析属性以创建 json 结构。进入easyXDM自带的index.html,找到如下代码:

var pairs = [];
for (var key in config.data) {
    if (config.data.hasOwnProperty(key)) {
        pairs.push(encodeURIComponent(key) + "=" + encodeURIComponent(config.data[key]));
    }
}
data = pairs.join("&");

不要在 POST 请求的情况下执行此代码。只需将 config.data 分配给数据:

data = config.data;
于 2013-09-19T06:27:43.003 回答