gpt4 book ai didi

jQuery .ajax 和同源策略

转载 作者:行者123 更新时间:2023-12-01 04:19:33 25 4
gpt4 key购买 nike

我有一个正在运行的 HTML5/JS 应用程序,我正在尝试将其移植到浏览器进行演示。该应用程序是为在车辆中运行而构建的,并使用车辆制造商的网络 API 来执行获取/发布请求。

对于浏览器版本,我尝试使用 jQuery 进行 get/post。但是,我立即遇到了问题。

XMLHttpRequest cannot load http://<API I AM CALLING>. Origin null is not allowed by Access-Control-Allow-Origin.

我研究过同源政策,但仍然不完全理解。我可以浏览到正在使用的 URL,并查看我尝试检索的 JSON。

环顾网络,很多人建议在我的 ajax 调用中指定 JSONP 作为 dataType。我尝试了一下,但没有成功。

            $.ajax({
url: url,
type: "GET",
dataType: "jsonp",
success: function (data, textStatus, jqXHR) {
log("success getting JSON from " + url);
success(data);
},
error: function (jqXHR, textStatus, errorThrown) {
log("error getting JSON from " + url + ", code " + JSON.stringify(jqXHR));
log("textStatus is " + textStatus);
log("errorThrown is " + errorThrown);
},
});

我的控制台中显示错误:

Uncaught SyntaxError: Unexpected token : 

之后,使用我的错误回调。

error getting JSON from http://<API I AM CALLING>, code {"readyState":4,"status":200,"statusText":"success"}
textStatus is parsererror
errorThrown is Error: jQuery180006523256213404238_1346098086632 was not called

看起来服务器正在响应我需要的 JSON 数据。但是,我猜测 jQuery 期望将此数据包装在函数中,因此无法解析它。

我无法控制我正在调用其 API 的服务器。由于数据返回到浏览器,我觉得必须有某种方法来访问它。

注意:
应用程序仅针对 webkit 浏览器,我不需要支持任何其他浏览器。将 dataType 保留为“json”只会在 Chrome 中引起问题,但由于安全策略不同,Safari 似乎工作正常。寻找代码解决方法,而不是简单地使用特殊参数启动 Chrome。即使我在 Apache 上托管代码,这种情况在 Chrome 中仍然会发生,因此这不仅仅限于我尝试在本地打开 index.html。

最佳答案

一种可能的解决方案是编写一个服务来代理您想要的 JSON 服务并返回 JSONP。我已经编写了许多这样的代理服务,因此我可以绕过相同的来源策略。

例如:http://high-cloud-3702.heroku.com/

此服务是城市词典的 jsonp 代理。

您可以非常轻松地在 Sinatra 中编写这样的代理,并将其免费托管在 Heroku 上。

像这样的代理的关键是以下代码:

get '/' do
callback = params.delete('callback') # jsonp
json = <function_to_get_data_here>.to_json

if callback
content_type :js
response = "#{callback}(#{json})"
else
content_type :json
response = json
end
response
end

关于jQuery .ajax 和同源策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12149015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com