3

我试图使用 AJAX(post请求)调用 eBay FindProducts API,但遇到以下错误:

XMLHttpRequest 无法加载http://open.api.ebay.com/shopping?callname=FindProducts。Access-Control-Allow-Origin 不允许来源http://localhost.com/test.php 。

我的代码:

$.ajax
({
    type: "POST",
    url: 'http://open.api.ebay.com/shopping?callname=FindProducts',
    dataType: ($.browser.msie) ? "text" : "xml",
    contentType: 'application/x-javascript',
    crossDomain : true,
    data: {
        'X-EBAY-API-APP-ID' : 'ebayAppId', 
        'X-EBAY-API-VERSION': '771', 
        'X-EBAY-API-SITEID': '0', 
        'X-EBAY-API-REQUEST-ENCODING': 'NV', 
        'X-EBAY-API-RESPONSE-ENCODING': 'json',
        'QueryKeywords' : '753759971632',
        'MaxEntries' : '3'
    },
    success: function (result) {
        alert('success');
        alert(result);
    },
    error: function (data) {
        alert((data));
    }
})

我怎样才能克服这个错误。

我尝试设置dataType : jsonp(我知道正在检索 XML,但为了解决我将其设置为 jsonP 的错误)。它可以工作,但 jQuery 无法解析 XML,因为预期的 json 响应。

4

3 回答 3

8

如果您添加&responseencoding=JSON到您的 URL,您将根据文档获得 JSON 格式的响应

更新 工作示例。我所做的是我更改为dataType:'jsonp'added jsonp:'callbackname'。因为 jQuery 默认调用回调参数callback,但 eBay 期望它被调用callbackname。您所要做的就是将您的参数添加到数据映射中。确保使用正确的参数名称,检查文档并使用 URL 方法而不是标头方法。希望这可以帮助。

于 2012-05-21T21:34:05.160 回答
0

如果您阅读了jQuery.ajax()文档,您可以使用 jsonp 并且仍然需要解析不同的返回类型。

多个空格分隔的值:从 jQuery 1.5 开始,jQuery 可以将 dataType 从它在 Content-Type 标头中接收到的内容转换为您需要的内容。例如,如果您希望将文本响应视为 XML,请使用“text xml”作为 dataType。您还可以发出 JSONP 请求,将其作为文本接收,并由 jQuery 解释为 XML:“jsonp text xml”。类似地,诸如“jsonp xml”之类的速记字符串将首先尝试从 jsonp 转换为 xml,如果失败,则从 jsonp 转换为文本,然后从文本转换为 xml。

所以基本上你所要做的就是将你dataType的代码行更改为:

dataType: ($.browser.msie) ? "jsonp text xml" : "xml",

或者您可以&responseencoding=JSON向您的 URL 添加一个参数,如另一个答案中所述。

于 2012-05-21T21:36:59.387 回答
0

感谢 Albin,我终于通过做 2 件事让 thi 开始工作。

我改成dataType:'jsonp'加了jsonp:'callbackname'。因为jQuery默认调用回调参数callback,但eBay期望它被称为'callbackname'。由于 eBay 的 CRO 问题,XML 无法正常工作(但需要确认。)

使用 chrome 控制台调试检索到的对象,使用 JSON.Stringify() 转换为字符串。

希望这对某人有帮助!

干杯,拉杰什

于 2012-05-22T05:31:06.510 回答