【问题标题】:jquery ajax post says xxx not allowed by Access-Control-Allow-Originjquery ajax 帖子说 xxx 不允许 Access-Control-Allow-Origin
【发布时间】:2012-05-22 14:19:31
【问题描述】:

我尝试使用 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 无法像预期的 json 响应那样解析 XML。

【问题讨论】:

  • "我尝试设置 dataType : jsonP" - 它不起作用,因为 JSONP 不是 XML,反之亦然。尝试检查 ebay 是否支持CORS,以便您可以读取 XML。
  • 您可能必须在服务器端执行此操作。您将对您的服务器进行 ajax 调用,从页面传递您需要的任何信息。然后,使用 curl 之类的方法在 php 中访问 api。
  • 您好约瑟夫,感谢您的回复。我知道 json 不是 xml,反之亦然(在我尝试设置 dataType : jsonP 后,请参阅我在 () 中的帖子)。如果 eBay 不支持 CORS,有没有办法做到这一点?即使在将 dataType 设置为 jsonp 或脚本之后,有没有办法检索 xml(我从浏览器控制台看到正在检索 xml,但 jquery 无法解析它。)? lbstr -thansk 您的回复,我知道使用 curl/php 实现这一点的方法 :) 。我想看看这是否可以在客户端完成。
  • albin 的方案可以解决这个问题,但是,你想让你的 appid 公开吗?
  • appid公开就好了,不知道为什么jquery无法解析响应,ajax返回错误!

标签: jquery ajax


【解决方案1】:

如果您将&responseencoding=JSON 添加到您的网址,您将根据docs 获得 JSON 格式的响应

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

【讨论】:

  • 我认为它不起作用,如果你看到我的 ajax 调用,我已经在发送 X-EBAY-API-RESPONSE-ENCODING': 'json',
  • 有趣的是,我正在监视请求和响应标头/参数,我能够检索 json 响应,但仍然出现错误:资源解释为脚本,但使用 MIME 类型文本/纯文本传输:
  • 是的,我刚刚看到了。但是,但是您将它作为参数传递,如果您尝试将其作为标头传递,并且当我尝试时,我发现它在 docs 中区分大小写,他们使用的是 JSON。
  • Working example。我所做的是我更改为dataType:'jsonp' 添加jsonp:'callbackname'。因为jQuery默认调用回调参数callback,但eBay期望它被称为'callbackname'。您所要做的就是将您的参数添加到数据映射中。确保使用正确的参数名称,检查 docs 并使用 URL 方法而不是标头方法。希望这会有所帮助。
  • Albin:非常感谢我让它工作了。谢谢你的例子。我期待 response.responseText 保存对象,但响应 itelf 是来自 eBay 的响应 JSON。我可以通过 $("#eBayXMLResponse").val(JSON.stringify(object,null,4)); 将它打印到文本区域。 JSON.stringify 是将 json obj 转换为字符串的好方法。和其他参数用于格式化 '4' 缩进。摘要:谢谢拉杰什
【解决方案2】:

如果您阅读了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 参数添加到您的网址,如another answer 中所述。

【讨论】:

  • 感谢您的回答。该文档看起来很有希望,但似乎不起作用。我还在我的 url 中将 responseencoding 附加到 Json,dint 工作。但是,当我尝试使用数据类型时出现错误:“jsonp text xml”
  • 资源被解释为脚本但以 MIME 类型 text/plain 传输:{"open.api.ebay.com/…".}
  • 去掉 contentType 选项,好像是把事情搞砸了。 (为什么将它设置为 application/x-javascript?)
  • 对不起,我删除了内容类型,正在测试一些东西。但是删除内容类型似乎没有帮助。
  • 这只是一个警告,而不是错误。它不应该破坏你的代码。 (警告是因为服务器没有使用正确的 MIME 类型进行回答,但应该没有太大关系。)无论如何,最好将您的数据作为 JSON 接收,如 stackoverflow.com/a/10692959/578843 中所述。 (我展示的技巧实际上有点像你想要的黑客/解决方法。)
【解决方案3】:

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

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

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

希望这对某人有所帮助!

干杯, 拉杰什

【讨论】:

    猜你喜欢
    • 2013-03-10
    • 2013-08-24
    • 2015-06-17
    • 2013-09-09
    • 2019-11-25
    • 2012-03-08
    • 2023-03-05
    • 2011-10-25
    相关资源
    最近更新 更多