构建一个基于CRUD式Web服务的简单咖啡订购系统

首先将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应用

对资源(订单)的操作

  1. 在顾客点单时,生成订单。

  2. 订单会被频繁读取,特别是询问其状态时。

  3. 在某些情况下,可以更新订单(改变口味)。

  4. 如果订单还处于待处理状态,允许顾客取消订单。

以上对于订单的四种操作,正好对应于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."
      } 
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容