WEB开发网
开发学院软件开发Java 精通 Grails: 用 JSON 和 Ajax 实现异步 Grails 阅读

精通 Grails: 用 JSON 和 Ajax 实现异步 Grails

 2009-10-26 00:00:00 来源:WEB开发网   
核心提示: 将结果与前面直接调用 http://local.yahooapis.com 的结果相比,两者应该是相同的,精通 Grails: 用 JSON 和 Ajax 实现异步 Grails(8), 为什么不能直接从浏览器远程调用 Web 服务?如果将 local.yahooapis.com URL 插入到

将结果与前面直接调用 http://local.yahooapis.com 的结果相比,两者应该是相同的。

为什么不能直接从浏览器远程调用 Web 服务?

如果将 local.yahooapis.com URL 插入到一个 Ajax.Request 中,它将静默失败。如果将它输入到浏览器的地址栏,它将会成功,但是编程式地从 JavaScript 中调用它时,就会再次失败。这是一个特有的现象,而不是存在 bug。

具体而言,Ajax 请求要遵循同源(same source 或 same origin)规则。这意味着 Ajax 请求只能回到源 HTML 页面所在的同一个字段。在您的例子中,可以任意调用 http://localhost,但是 http://local.yahooapis.com 或其他地方是不能调用的。

这样做是出于安全考虑。当您在 http://amazon.com 中输入信用卡号时,一定希望确保那些数字不会同时被悄悄地发送到 http://hackers.r.us。(更正式的说法是 XSS 或跨站点脚本)。

同源规则仅适用于客户端 JavaScript,而不适用于服务器端 Groovy。因此我让您通过一个控制器代理对 http://local.yahooapis.com 调用,并透明地将它传回浏览器。

如果确实想从浏览器调用 Yahoo! 或 Google Web 服务,两者都会通过提供回调选项以巧妙的方法规避了同源规则。

使用控制器可以让远程 JSON 请求带来两个好处:可以规避同源 Ajax 限制,但是更重要的是,它提供某种封装。控制器将变得与 Data Access Object(DAO)类似。

就像您不希望将 URL 硬编码到远程 Web 服务中一样,您也不希望在视图中出现原始的 SQL。现在,通过调用一个本地控制器,可以保证下游的客户机不受实现更改的影响。表名或字段名的更改会破坏嵌入式的 SQL 语句,URL 的更改则会破坏嵌入式的 Ajax 调用。而通过调用 AirportMapping.iata(),则就可以随意更改本地表和远程 GeoNames 服务中的数据源,并保证客户端界面不受影响。长远来看,为了提升性能,甚至可以将对远程服务的调用缓存到一个本地数据库,为每个请求构建本地缓存。

上一页  3 4 5 6 7 8 9 10  下一页

Tags:精通 Grails JSON

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接