封装控制器的统一结果
- 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
/*** 控制层返回的统一结果类型*/publicclassJsonResult { /*** 返回结果的状态*/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请求也可以同样这样做.