基于RestFul风格编程示例

简介: 基于RestFul风格编程示例

封装控制器的统一结果

  • GET(SELECT):从服务器取出资源(一项或多项)。
  • POST(CREATE):在服务器新建一个资源。
  • PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
  • PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
  • DELETE(DELETE):从服务器删除资源

示例:

Http  请求方式  method:
GET:     查询请求
POST:    添加请求
PUT:     修改请求
DELETE:  删除请求
GET : http://localhost:8080/dianping/shop/20001    查询id=20001的shop
      http://localhost:8080/dianping/shop           查询所有的shop
      http://localhost:8080/dianping/shop/page/2
Delete : http://localhost:8080/dianping/shop/20001  删除id=20001的店铺
    http://localhost:8080/dianping/shop   删除所有的店铺
POST : http://localhost:8080/dianping/shop 添加新店铺
Put : http://localhost:8080/dianping/shop  修改店铺
 GET :  /zoos         查询所有的动物园
       /zoos/101      查询id=101的动物园
       /zoos/101/animals     查询id=101动物园里的所有的动物
       /zoos/101/animals/2001 查询id=101动物园里的 id=2001的这个动物
 Post: /zoos        添加一个新的动物园对象  
    /zoos/101/animals    在id=101动物园里添加一个animal对象  
 Put : /zoos        修改某一个动物园信息
 Delete : /zoos/101     删除id=101这个动物园
    /zoos/101/animals/2001   删除id=101动物园里的 id=2001的这个动物

客户端的请求(使用postman工具发出的请求)

GET请求

DELETE请求

POST请求

PUT请求

@RestController //@Controller + @ResponseBody
@RequestMapping("/cards")
public class TestRestController {
    @GetMapping("get/{id}")   // @RequestMapping(value="get",method = RequestMethod.GET)
    public JsonResult find(@PathVariable("id") int id){
        System.out.println("id = "+id);
        //模拟service
        Card card = new Card();
        card.setCardId(7788);
        card.setCardBalance(499.9f);
        Customer customer = new Customer(9001,"沈峰",183928493493L);
        Map<String,Object> map = new HashMap<>();
        map.put("card",card);
        map.put("customer",customer);
        return JsonResult.createSuccessJsonResult(map);
    }
    @DeleteMapping("delete/{id}")   // @RequestMapping(value="get",method = RequestMethod.DELETE)
    public JsonResult remove(@PathVariable("id") int id){
        System.out.println("id = "+id);
       return JsonResult.createSuccessJsonResult(null);
    }
    @PostMapping("post")   // @RequestMapping(value="get",method = RequestMethod.POST)
    public JsonResult add(Card card){
        System.out.println("card = "+card);
        boolean flag = false;  //模拟service返回结果
        if(flag)
          return  JsonResult.createSuccessJsonResult(null);
        else
            return    JsonResult.createFailJsonResult(null);
    }
    @PutMapping("put")   // @RequestMapping(value="get",method = RequestMethod.PUT)
    public JsonResult update(Card card){
        boolean flag = false;  //模拟service返回结果
        if(flag)
            return  JsonResult.createSuccessJsonResult(null);
        else
            return    JsonResult.createFailJsonResult(null);
    }
}

controller层返回统一的json结果类型JsonResult

/*** 控制层返回的统一结果类型*/@DatapublicclassJsonResult {
/*** 返回结果的状态*/privateResultStatusstatus;   //成功,失败,出错,需要登录,已登录.... ===>枚举类中/*** 返回结果的数据*/privateMap<String,Object>data;
/*** 返回数据的描述*/privateStringmessage;
publicJsonResult(){}
publicJsonResult(ResultStatusstatus, Map<String, Object>data, Stringmessage) {
this.status=status;
this.data=data;
this.message=message;
    }
publicstaticJsonResultcreateSuccessJsonResult( Map<String,Object>data){
returnnewJsonResult(ResultStatus.SUCCESS,data,"操作成功");
    }
publicstaticJsonResultcreateFailJsonResult( Map<String,Object>data){
returnnewJsonResult(ResultStatus.FAIL,data,"操作失败");
    }
publicstaticJsonResultcreateErrorJsonResult( Map<String,Object>data){
returnnewJsonResult(ResultStatus.ERROR,data,"操作错误");
    }
publicstaticJsonResultneedLoginJsonResult( Map<String,Object>data){
returnnewJsonResult(ResultStatus.NEED_LOGIN,data,"用户需要先登录");
    }
publicstaticJsonResulthasLoginJsonResult( Map<String,Object>data){
returnnewJsonResult(ResultStatus.HAS_LOGIN,data,"用户已登陆");
    }
}

封装结果状态 ResultStatus

public enum ResultStatus {
    SUCCESS("success"),
    ERROR("error"),
    FAIL("fail"),
    NEED_LOGIN("need_login"),
    HAS_LOGIN("has_login");
    private String value;
    ResultStatus( String value){
        this.value = value;
    }
}

注意:

1. html表单form中,method没有put、delete。

2. SpringMVC并不能直接接收到通过put、delete方式传过来的参数。

我这里的解决方式是

添加过滤器hiddenHttpMethodFilter,作用是将put和delete的参数获取并重新放入request中,controller便可以直接拿到这些参数。

我们需要在web.xml中配置一个过滤器

<!-- 配置过滤器 将POST请求转换为PUT和DELETE请求 -->
<filter>
      <filter-name>HiddenHttpMethodFilter</filter-name>
      <filter-lass>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
      <filter-name>HiddenHttpMethodFilter</filter-name>
      <url-pattern>/*</url-pattern>
</filter-mapping>
需要注意的是,只有context-type:application/x-www-form-urlencoded的请求才会被过滤
在表单上增加一个隐藏表单域,将HiddenHttpMethodFilter里的_method属性改为put或者delete后提交
因为只有form表单才具有post方法,而这个过滤器也只能将post方法转化,get则不行。
比如你要提交一个删除的请求
其Controller里的方法对应的
@RequestMapping(value="deleteById/{id}",method = RequestMethod.DELETE)
//RESTFUL风格
<a class="del" href="deleteById/100">DELETE</a>//将ID为100的删除
<form action="" method="post" id="delForm">
    <input type="hidden" name="_method" value="DELETE">
</form>
当然这种提交是要写js的
$(function(){
    $('.del').click(function(){
        $('#delForm').attr('action',this.href).submit();
    })
})
这段js脚本的意思就是
在点击<a>标签删除的时候将a标签的href赋值给id为delForm的表单的action然后让这个form
表单提交.这就完成了将POST请求转换成DELETE请求,那么PUT请求也可以同样这样做.
目录
相关文章
|
XML 域名解析 JSON
【RESTful】RESTful API 接口设计规范 | 示例
【RESTful】RESTful API 接口设计规范 | 示例
5421 0
【RESTful】RESTful API 接口设计规范 | 示例
|
API 对象存储 网络架构
OSS restful API 调用 put,上传文件,python发http request示例
发送put 请求,向bucket中写入文件,代码中*** 的部分改成实际内容。rest请求主要问题在拼header时authorization可能会有问题,注意生成signature时的入参。#tested env: python version v3.9.6 #author: Fred #2022-1-11 import hmac import hashlib import base64 im
1138 0
|
1月前
|
API Python
Flask-RESTful基础示例
Flask-RESTful基础示例
|
11月前
|
数据库
SAP Restful ABAP Programming 编程模型的 Action 实现和云端调试介绍
SAP Restful ABAP Programming 编程模型的 Action 实现和云端调试介绍
|
11月前
|
存储 前端开发 JavaScript
如何使用 Restful ABAP Programming 编程模型开发一个支持增删改查的 Fiori 应用
如何使用 Restful ABAP Programming 编程模型开发一个支持增删改查的 Fiori 应用
|
JSON Java 程序员
|
JSON 前端开发 Java
Restful风格的编程
Restful风格的编程
209 0
Restful风格的编程
|
前端开发 JavaScript 数据库
如何使用 Restful ABAP Programming 编程模型开发一个支持增删改查的 Fiori 应用(二)
Restful ABAP Programming 编程模式是 ABAP 这门编程语言在不断向前进化的过程中,诞生的一门新的编程模型,简称为RAP模型。
131 0
如何使用 Restful ABAP Programming 编程模型开发一个支持增删改查的 Fiori 应用(二)
|
存储 数据库
如何使用 Restful ABAP Programming 编程模型开发一个支持增删改查的 Fiori 应用(一)
Restful ABAP Programming 编程模式是 ABAP 这门编程语言在不断向前进化的过程中,诞生的一门新的编程模型,简称为RAP模型。
168 0
如何使用 Restful ABAP Programming 编程模型开发一个支持增删改查的 Fiori 应用(一)
|
SQL 设计模式 Oracle
无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口
通过之前一篇文章 无需编程,基于PostgreSQL零代码生成CRUD增删改查RESTful API接口 的介绍,采用抽象工厂设计模式,已经支持了大象数据库PostgreSQL。之前通过字符串拼接生成DDL SQL语句,比较繁琐。本文开始,引入了FreeMarker模版引擎,通过配置模版实现创建和修改物理表结构SQL语句,简化了大量代码,提高了效率,并且通过配置oracle数据库SQL模版,基于oracle数据库,零代码实现crud增删改查。
225 0
无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口