我试图使用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响应。
答案 0 :(得分:8)
如果您向网址添加&responseencoding=JSON
,则会根据docs
<强>更新强>
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()将字符串修改为字符串。
希望这有助于某人!
干杯, 拉杰什