技术开发 频道

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

  在 Grails 控制器中呈现 JSON

  在 “使用 Ajax 实现多对多关系” 中,您首先从一个 Grails 控制器返回 JSON。清单 4 中的闭包类似于您当时创建的闭包。不同之处在于,这个闭包是通过一个友好的 Uniform Resource Identifier(URI)访问的,这已在 “RESTful Grails” 中讨论。它还使用您在 “测试 Grails 应用程序” 中首次见到的 Elvis 操作符。

  将一个名为 iata 的闭包添加到您在 “Grails 与遗留数据库” 中创建的 grails-app/controllers/AirportMappingController.groovy 类中,记得在文件顶部导入 grails.converters 包,如清单 4 所示:

  清单 4. 将 Groovy 对象转换成 JSON

import grails.converters.*
class AirportMappingController {
    def iata
= {
      def iata
= params.id?.toUpperCase() ?: "NO IATA"
      def airport
= AirportMapping.findByIata(iata)
      
if(!airport){
        airport
= new AirportMapping(iata:iata, name:"Not found")
      }
      render airport
as JSON
    }
}

  在浏览器中输入 http://localhost:9090/trip/airportMapping/iata/den 进行测试。应该可以看到清单 5 中所示的 JSON 结果:

  清单 5. JSON 中的一个有效的 AirportMapping 对象

{"id":328,
"class":"AirportMapping",
"iata":"DEN",
"lat":"39.858409881591797",
"lng":"-104.666999816894531",
"name":"Denver International",
"state":"CO"}

  也可以输入 http://localhost:9090/trip/airportMapping/iata 和 http://localhost:9090/trip/airportMapping/iata/foo,以确认是否返回 “Not Found”。清单 6 显示了返回的无效的 JSON 对象:

  清单 6. JSON 中的一个无效的 AirportMapping 对象

{"id":null,
"class":"AirportMapping",
"iata":"FOO",
"lat":null,
"lng":null,
"name":"Not found",
"state":null}

  当然,这样的 “考验” 不能替代真正的测试。

0
相关文章