不带有 IATA 代码的 DELETE 请求,如清单 15 所示:
清单 15. 试着一次性 DELETE 所有机场
$ curl --verbose --request DELETE http://localhost:9090/trip/rest/airport
> DELETE /trip/rest/airport HTTP/1.1
< HTTP/1.1 400 Bad Request
DELETE request must include the IATA code
Example: /rest/airport/iata
实现 POST
接下来您的目标是要插入一个新的 Airport。创建一个如清单 16 所示的名为 simpleAirport.xml 的 文件:
清单 16. simpleAirport.xml
<airport>
<iata>oma</iata>
<name>Eppley Airfield</name>
<city>Omaha</city>
<state>NE</state>
<country>US</country>
<lat>41.3019419</lat>
<lng>-95.8939015</lng>
</airport>
如果资源的 XML 表示是扁平结构(没有深层嵌套元素),而且每一个元素名称都与类中的一个字段名 称相对应的话,Grails 就能够直接从 XML 中构造出新类来。XML 文档的根元素是通过 params 寻址的, 如清单 17 所示:
清单 17. 响应 HTTP POST
def index = {
switch(request.method){
case "POST":
def airport = new Airport(params.airport)
if(airport.save()){
response.status = 201 // Created
render airport as XML
}
else{
response.status = 500 //Internal Server Error
render "Could not create new Airport due to errors:\n ${airport.errors}"
}
break
case "GET": //...
case "PUT": //...
case "DELETE": //...
}
}
精通Grails: RESTful Grails(10)
时间:2011-07-29 IBM Scott Davis
XML 一定要使用扁平结构,这是因为 params.airport 其实是一个散列(Grails 是在后台将 XML 转 换成散列的)。这意味着您在对 Airport 使用命名参数构造函数 — def airport = new Airport (iata:"oma", city:"Omaha", state:"NE")。
要测试新代码,就要使用 cURL 来 POST simpleAirport.xml 文件,如清单 18 所示:
清单 18. 使用 cURL 来发出一个 HTTP POST
$ curl --verbose --request POST -- header "Content-Type: text/xml" --data
@simpleAirport.xml http://localhost:9090/trip/rest/airport
> POST /trip/rest/airport HTTP/1.1
> Content-Type: text/xml
> Content-Length: 176
>
< HTTP/1.1 201 Created
< Content-Type: text/xml; charset=utf-8
<?xml version="1.0" encoding="utf-8"?><airport id="14">
<arrivals>
<null/>
</arrivals>
<city>Omaha</city>
<country>US</country>
<departures>
<null/>
</departures>
<iata>oma</iata>
<lat>41.3019419</lat>
<lng>-95.8939015</lng>
<name>Eppley Airfield</name>
<state>NE</state>
</airport>
如果 XML 比较复杂的话,则需要解析它。例如,还记得您先前定义的自定义 XML 格式么?创建一个 名为 newAirport.xml 的文件,如清单 19 所示:
清单 19. newAirport.xml
<airport iata="oma"&g
|