【问题标题】:How can I work around the same-origin policy to develop AJAX client code for a Google AppEngine site?如何解决同源策略为 Google AppEngine 网站开发 AJAX 客户端代码?
【发布时间】:2012-02-04 17:31:34
【问题描述】:

我正在与一个拥有 Google AppEngine 站点的人合作,该站点具有一个自定义 API。

我需要编写一些 AJAX Javascript 来与网站上的自定义 API 交互,但我被同源策略所困扰。 JSONP 将毫无用处,因为您无法从失败的“AJAX”请求中获得错误回调(它不使用 XMLHTTPRequest)。我正在使用 JQuery 发出请求。

显然,Google AppEngine 有一个可怕的警告,即您不能单独上传单个文件进行测试,所以我无法通过直接在 API 的正确域上开发来解决这个问题。

我在 MAC 上,听说你可以设置某种代理来解决这个问题,我什至不知道从哪里开始,如果我绝对没有的话,我也不想这样做到。我可以做些什么来让我针对这个 API 开发一些 AJAX JS?

【问题讨论】:

  • 您能否通过服务器端代码发出请求来获取所需的数据?也就是浏览器向你的web服务器(同域)发出ajax请求,然后你的web服务器从其他域获取数据并返回。

标签: javascript jquery ajax http-headers same-origin-policy


【解决方案1】:

如果您只是在寻找开发时解决方案(即设置代理),我会推荐 Charles Web Proxy (http://www.charlesproxy.com/)。

这是我用于本地开发的工具 - 它可以拦截对 URL 的请求并将它们重定向到其他位置以解决跨域问题(用于本地开发和测试 - 当然不是生产)。设置和工作非常容易,并且提供免费试用。

【讨论】:

  • 这是一个很好的建议,也是解决这个问题的方法之一。另一个是禁用浏览器中的安全性,使其不再遵守同源策略。这是我最终选择的路线,但感谢您的回答!
  • 此方法的另一个优点是它允许从各种浏览器测试您的网站,而无需尝试配置每个浏览器以避免同源策略。
  • @Sly_cardinal 我无法在 Charles 中看到 OPTIONS 请求。还有什么需要配置的吗? ://
【解决方案2】:

一般来说,JSONP API 不会因为这个原因而无法响应。即使出现问题,精心设计的也会做出如下回应:

response({
   error: {...}
});

或类似的。因此,除非存在网络连接问题或服务器出现严重故障(例如 App Engine 出现故障),否则您应该始终得到响应。如果 API 没有针对错误返回有效的 JSON,我建议更改它。

【讨论】:

  • 您的意思是,除非出现通常存在的问题,否则您应该始终得到响应? :-P
  • @Malvolio,我知道你在开玩笑,但与许多其他错误相比,这类错误相对较少(用户 ID 错误,方法名称无效,无法连接到数据库,未经过身份验证,还有太多无法列出)
  • 我是 kind 开玩笑,但如果我同意系统级(而不是应用程序级)错误特别罕见,我不会没有提出来。今天,我们做了一个大型网站发布。很多错误。其中至少有一半超出了应用程序控制消息传递的能力。只是不是 JSONP 的忠实拥护者,错误处理只是原因之一。
【解决方案3】:

您的问题的解决方案是CORS。你朋友的网站必须允许 CORS,如果你想让你的代码支持 IE(听起来你不支持),你必须使用像 this one 这样的特殊插件。

【讨论】:

    【解决方案4】:

    我通过削弱我的浏览器 (Chrome) 中的同源策略支持解决了这个问题,使其不再起作用或受到尊重。在开发过程中,我可以发出跨域请求,浏览器不会阻止它们。如果您像我一样遇到这个问题,请像这样启动 Chrome:

    /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --disable-web-security

    这显然是一个仅用于开发的解决方案,但这就是我所需要的。对于更广泛的解决方案,上述关于 CORS 和 JSONP + 正确设计的 JSONP API 的答案更合适。

    【讨论】:

    • 我喜欢这种方法,因为它只持续到Chrome运行的时间,所以你可以退出并以正常的安全性进行测试。并在浏览网页时开启安全性。
    猜你喜欢
    • 2015-11-15
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2016-05-22
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多