首先将Order(订单)建模为资源
class Orders {
String name
String milk
String size
Integer quantity
static constraints = {
name(inList:['Latte','Cappuccino','Chocolate'])
milk(inList:['skim','semi','whole'])
size(inList:['small','medium','large'])
quantity(range:1..10)
}
}
创建一个web应用
对资源(订单)的操作
在顾客点单时,生成订单。
订单会被频繁读取,特别是询问其状态时。
在某些情况下,可以更新订单(改变口味)。
如果订单还处于待处理状态,允许顾客取消订单。
以上对于订单的四种操作,正好对应于HTTP的四个动词。
构造CRUD式服务
动词 URI 用途
POST /order 创建一个新订单,成功之后返回新建的订单
GET /order/{id} 请求该URI所对应的订单的当前状态
PUT /order/{id} 更新该URI所对应的订单,提供完整的表述
DELETE /order/{id} 从逻辑上删除该URI所对应的订单
编程实现
编程语言 Groovy 框架 Grails 开发工具 Spring Groovy/Grails Tool Suite
创建新项目
New - Grails 项目 Restbucks
创建order控制器
利用了URL映射(Mapping)的映射到HTTP方法,每个HTTP方法比如GET,PUT,POST和DELETE都映射到控制器的唯一动作(action)
class UrlMappings {
static mappings = {
"/order/$id?"(controller:"order",parseRequest:true){
action = [GET:"get", PUT:"put", DELETE:"delete", POST:"post"]
}
"/"(view:"/index")
"500"(view:'/error')
}
}
实现控制器方法
class OrderController {
def get() {
render "Create\n"
}
def put() {
render "Put\n"
}
def delete() {
render "Delete\n"
}
def post() {
render "Post\n"
}
}
使用 cURL来验证 每个方法运行正常:
~$curl --request PUT http://localhost:8080/Restbucks/order/
Put
~$curl --request POST http://localhost:8080/Restbucks/order/
Post
~$curl --request GET http://localhost:8080/Restbucks/order/
Get
~$curl --request DELETE http://localhost:8080/Restbucks/order/1
Delete
实现Get
def get() {
if(params.id && Orders.exists(params.id)) {
def p = Orders.get(params.id)
render p as XML
}
else {
def all = Orders.list()
render all as XML
}
}
实现Post
def post() {
def orders = new Orders(params.orders)
if(orders.save()){
response.status = 201 // Created
render orders as XML
}
else{
response.status = 500 //Internal Server Error
render "Could not create new Order due to errors:\n ${orders.errors}"
}
}
实现Put
def put() {
def orders = Orders.get(params.id)
orders.properties = params.orders
if(orders.save()){
response.status = 200 // OK
render orders as XML
}
else{
response.status = 500 //Internal Server Error
render "Could not create new order due to errors:\n ${orders.errors}"
}
}
实现Delete
def delete() {
if(params.id){
if(Orders.exists(params.id)){
def orders = Orders.get(params.id)
orders.delete()
response.status = 204 //No Content
render "Delete\n"
}
else{
response.status = 404 //Not Found
render "${params.id} not found."
}
}
else{
response.status = 400 //Bad Request
render "DELETE request must include the id."
}
}