快速业务通道

精通Grails: 用JSON和Ajax实现异步Grails - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
tel&tp=1",   "Result":[    {"id":"42712564",    "Title":"Springhill Suites-Denver Arprt",    "Address":"18350 E 68th Ave",    "City":"Denver",    "State":"CO",    "Phone":"(303) 371-9400",    "Latitude":"39.82076",    "Longitude":"-104.673719",    "Distance":"2.63",    [SNIP]

现在,您有了一个可用的宾馆列表,接下来需要为其创建一个控制器方法,就像为 AirportMapping.iata() 创建该方法一样。

创建用于发出远程 JSON 请求的控制器方法

在本文的前面,您已经创建了一个 HotelController。将清单 15 中的 near 闭包添加到其中。(您 在 “Grails 服务和 Google 地图” 中已经看到了类似的代码)。

清单 15. HotelController

class HotelController {   def scaffold = Hotel   def near = {    def addr = "http://local.yahooapis.com/LocalSearchService/V3/localSearch?"    def qs = []    qs << "appid=YahooDemo"    qs << "query=hotel"    qs << "sort=distance"    qs << "output=json"    qs << "latitude=${params.lat}"    qs << "longitude=${params.lng}"    def url = new URL(addr + qs.join("&"))    render(contentType:"application/json", text:"${url.text}")   } }

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

时间:2011-08-02 IBM Scott Davis

所有查询字符串参数都是硬编码的,但最后两个除外:latitude 和 longitude。倒数第二行实例化一 个新的 java.net.URL。最后一行调用服务(url.text),并呈现结果。由于没有使用 JSON 转换器,因 此必须显式地将 MIME-type 设置为 application/json。除非特意设置,否则 render 会返回 text/plain。

在浏览器中输入下面的内容(不要换行):

http://localhost:9090/trip/hotel/near?lat=    39.858409881591797&lng=-104.666999816894531

将结果与前面直接调用 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 请求带来两个好处:可以规避同源

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号