jquery ajax帖子说Access-Control-Allow-Origin不允许使用xxx

时间:2012-05-21 21:27:10

标签: jquery ajax

我试图使用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响应。

3 个答案:

答案 0 :(得分:8)

如果您向网址添加&responseencoding=JSON,则会根据docs

获得JSON响应

<强>更新 Working example。我所做的是我改为dataType:'jsonp'添加了jsonp:'callbackname'。因为jQuery默认调用回调参数callback,但eBay希望它被称为callbackname。您需要做的是将参数添加到数据映射中。确保使用正确的参数名称,检查文档并使用URL方法而不是header方法。希望这会有所帮助。

答案 1 :(得分:0)

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

  

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

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

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

或者您可以在网址中添加&responseencoding=JSON参数,如another answer中所述。

答案 2 :(得分:0)

我终于做了两件事,感谢阿尔宾。

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

使用chrome控制台调试retreived对象,使用JSON.Stringify()将字符串修改为字符串。

希望这有助于某人!

干杯, 拉杰什