基于MVCRESTful风格的实现

1.RESTful风格阐述

REST服务是一种ROA(Resource-Oriented Architecture,面向资源的架构)应用。主要特点是方法信息存在于HTTP协议的方法中(GET,POST,PUT,DELETE),作用域存在于URL中。例如,在一个获取设备资源列表的GET请求中,方法信息是GET,作用域信息是URI种包含的对设备资源的过滤、分页和排序等条件

良好的REST API不需要任何文档

1.1REST风格资源路径

REST风格的资源路径设计是面向资源的,资源的名称应该是准确描述该资源的名词。

资源路径概览:sheme://host:port/path?queryString

例:http://localhost:8080/bywlstudio/users/user?username=xiuer

1.2HTTP方法

GET用于读取、检索、查询、过滤资源

PSOT用于创建一个资源

PUT用于修改、更新资源、创建客户端维护主键信息的资源

DELETE用于删除资源

资源地址和HTTP方法结合在一起就可以实现对资源的完整定位

1.3RESTful风格API设计

上文讲述了通过HTTP方法和资源路径对服务器的一个资源进行定位的过程

接下来看一个REST风格API的设计

功能 描述
添加/创建 POST/users PUT/users{id}创建客户端维护主键信息的资源
删除 DELETE/users/{id}
修改/更新 PUT/users/{id}
查询全部 GET/users
主键查询 GET/users/{id} GET/users?id=26
分页作用域查询 GET/users?start=0&size=10 GET/users?07,2019-07,2020

可以看到通过这个RESTAPI都是通过对同一个资源的操作,所不同的就是通过不同的HTTP方法来实现对资源不同的处理。

2.MVCREST的支持

1.1主要通过注解来实现
  • @Controller声名一个处理请求的控制器

  • @RequestMapping请求映射地址,它存在几个子注解对于实现REST风格来说更加具有语义性

    • @GETMapping GET请求

    • @PUTMapping PUT请求

    • @POSTMapping POST请求

    • @DELETEMapping DELETE请求

  • @ResponseBody 将响应内容转换为JSON格式

  • @RequestBody 请求内容转换为JSON格式

  • @PathVariable("id")用于绑定一个参数

  • @RESTController 等同于@Controller+@ResponseBody在类上写了这个注解,标识这个类的所有方法只返回数据,而不进行视图跳转

1.2返回HTTP状态码

REST风格API一个最鲜明的特点通过返回对应的HTTPStatus来判断客户端的操作是否完成

下面是spring中关于Http状态码描述的枚举类,本文列举了常见的状态码(读者若对此感兴趣可以查看HttpStatus源码)

 public enum HttpStatus{
     OK(200, "OK"),//用于服务器有实体响应
     CREATED(201, "Created"),//创建了新实体,响应该实体
     NO_CONTENT(204, "No Content"),//服务器正常响应,但无实体响应
     BAD_REQUEST(400, "Bad Request"),//客户端请求语法错误
     NOT_FOUND(404, "Not Found"),//目标资源不存在
     INTERNAL_SERVER_ERROR(500, "Internal Server Error"),//服务器内部错误
     NOT_IMPLEMENTED(501, "Not Implemented"),//服务器不支持当前请求
 }

Spring返回状态码是通过@ResponseStatus注解或者ResponseEntity<?>类实现的。

@ResponseStatus方式

 @GetMapping(path = "/user/{id}" , produces = "application/json;charset=utf-8")
 @ResponseStatus(HttpStatus.OK)
 public User findUserById(@PathVariable("id")Integer id){
     User user = userService.findUserById(id);
     return user ;
 }

ResponseEntity<?>方式

 @GetMapping(produces = "application/json;charset=utf-8")
 public ResponseEntity<List<User>> findAll(){
     List<User> users = userService.findAll();
     return new ResponseEntity<List<User>>(users , HttpStatus.OK);
 }
1.3由于MVC默认不支持PUTDELETE方法,所以需要手动开启

tomcat服务器的web.xml文件中开启一下配置

 <servlet>
  <servlet-name>default</servlet-name>
  <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
  <init-param>
  <param-name>debug</param-name>
  <param-value>0</param-value>
  </init-param>
  <init-param>
  <param-name>listings</param-name>
  <param-value>false</param-value>
  </init-param>
  <init-param>
         <param-name>readonly</param-name>
         <param-value>true</param-value><!--开启这个-->
  </init-param>
  <load-on-startup>1</load-on-startup>
  </servlet>

在项目的web.xml中配置

 <filter>
     <filter-name>HiddenHttpMethodFilter</filter-name>
     <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
   </filter>
 ​
   <filter-mapping>
     <filter-name>HiddenHttpMethodFilter</filter-name>
     <servlet-name>dispathcherServlet</servlet-name>
   </filter-mapping>

3.MVC实现REST代码实现

3.1实例环境
  • JDK1.8

  • maven3.60

  • tomcat9

3.2API设计
URI Description Response HTTPStatus
GET/users 获取全部用户 JSON 200
GET/users/{id} 获取指定主键的用户 JSON 200
PUT/users/{id} 修改指定的主键的用户信息 JSON 200/201
POST/users 增加一个用户 JSON 201
DELETE/users/{id} 删除一个用户 void 204
3.3控制层代码
 @RestController
 @RequestMapping("/users")
 public class UserControler {
 ​
     @Autowired
     private IUserService userService ;
 ​
     //REST风格实现方法
 ​
     /**
      * 查询所有
      * @return
      */
     @GetMapping(produces = "application/json;charset=utf-8")
     public ResponseEntity<List<User>> findAll(){
         List<User> users = userService.findAll();
         return new ResponseEntity<List<User>>(users , HttpStatus.OK);
    }
 ​
     /**、
      * 根据ID查询
      * @param id
      * @return
      */
 ​
     @GetMapping(path = "/{id}" , produces = "application/json;charset=utf-8")
     @ResponseStatus(HttpStatus.OK)
     public User findUserById(@PathVariable("id")Integer id){
         User user = userService.findUserById(id);
         return user ;
    }
     /**
      * 增加一个用户
      * 返回该用户
      */
     @PostMapping(produces = "application/json;charset=utf-8")
     @ResponseStatus(HttpStatus.CREATED)
     public User addUser(@RequestBody User user){
         User newUser = userService.addUser(user);
         return newUser ;
    }
 ​
     /**
      * 更新
      * @param user
      */
     @PutMapping(path = "/{id}" ,produces = "application/json;charset=utf-8")
     public ResponseEntity<User> updateUser(@PathVariable("id") Integer id , @RequestBody User user){
         user.setUid(id);
         //资源是否修改
         boolean flag = userService.updateUser(user);
         User deUser = userService.findUserById(id);
         if(flag)
             return new ResponseEntity<User>(deUser,HttpStatus.CREATED);
         return new ResponseEntity<User>(deUser,HttpStatus.OK);
    }
 ​
     @DeleteMapping(path = "/{id}" , produces = "application/json;charset=utf-8")
     @ResponseStatus(HttpStatus.NO_CONTENT)
     public void delUser(@PathVariable("id") Integer id){
         User user = userService.findUserById(id);
         userService.delUser(id);
    }
 }

本文项目地址:https://github.com/946470326/MakerStack/tree/ssm

基于MVC的RESTful风格的实现的更多相关文章

  1. 基于MVC的RESTFul风格API实战

    基于MVC的RESTful风格的实现 1.RESTful风格阐述 REST服务是一种ROA(Resource-Oriented Architecture,面向资源的架构)应用.主要特点是方法信息存在于 ...

  2. 【Spring学习笔记-MVC-18.1】Spring MVC实现RESTful风格-同一资源,多种展现:xml-json-html

    概要 要实现Restful风格,主要有两个方面要讲解,如下: 1. 同一个资源,如果需要返回不同的形式,如:json.xml等: 不推荐的做法: /user/getUserJson /user/get ...

  3. java之spring mvc之Restful风格开发及相关的配置

    1. Restful : 表征状态状态转移. 传统 : url : http://localhost:8080/usersys/delete.do?user.id=12 Restful 风格:url ...

  4. 基于cxf开发restful风格的Web Service

    一.写在前面 webservice一些简单的其他用法和概念,就不在这里赘述了,相信大家都可以在网上查到,我也是一个新手,写这篇文章的目的一方面是想记录自己成长的历程,另一方面是因为学习这个的时候花了点 ...

  5. SpringMVC+Json构建基于Restful风格的应用(转)

    一.spring 版本:spring-framework-3.2.7.RELEASE 二.所需其它Jar包: 三.主要代码: web.xml <?xml version="1.0&qu ...

  6. MockMVC - 基于RESTful风格的Springboot,SpringMVC的测试

    MockMVC - 基于RESTful风格的SpringMVC的测试 对于前后端分离的项目而言,无法直接从前端静态代码中测试接口的正确性,因此可以通过MockMVC来模拟HTTP请求.基于RESTfu ...

  7. Spring MVC 4.1.4 RESTFUL风格返回JSON数据406错误处理

    Spring MVC 4.1.4 RESTFUL风格返回JSON数据406错误处理 今天在使用spring4.1.4,使用ResponseBody注解返回JSON格式的数据的时候遇到406错误. 解决 ...

  8. Aspnet Mvc 前后端分离项目手记(三)关于restful 风格Url设计

    RESTful 不是新东西,简单理解它的核心思想就是最大程度的利用http协议的一些特点,比如uri,比如请求动词,在前后端分离的项目中会有大大的好处 ,好的设计的url简单明了,胜过详细的说明文档. ...

  9. Restful风格API接口开发springMVC篇

    Restful风格的API是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机 ...

随机推荐

  1. 安装vue开发环境

    每次搜索vue开发环境安装时,总是有很多种版本,虽然都能安装完成,但还是整理下自己觉得比较好的版本吧 1.首先安装nodeJs以及也把git安装好(反正开发也是需要git),安装完成后执行 node ...

  2. Python攻破淘宝网各类反爬手段,采集淘宝网ZDB(女用)的销量!

    声明: 由于某些原因,我这里会用手机代替,其实是一样的! 环境: windows python3.6.5 模块: time selenium re 环境与模块介绍完毕后,就可以来实行我们的操作了. 第 ...

  3. MongoDB入门系列之科普篇

    ​ 目录 背景 对比 MongoDB的数据存储格式 背景 最近公司扩展了很多国外客户,那么一个很严重的问题就是翻译,对于国外客户来说,肯定看不懂中文,那就要项目中提供切换各自国家语言的功能. 由于每个 ...

  4. 使用 .NET Core 3.0 的 AssemblyLoadContext 实现插件热加载

    一般情况下,一个 .NET 程序集加载到程序中以后,它的类型信息以及原生代码等数据会一直保留在内存中,.NET 运行时无法回收它们,如果我们要实现插件热加载 (例如 Razor 或 Aspx 模版的热 ...

  5. JavaScript系列:函数式编程(开篇)

    前言: 上一篇介绍了 函数回调,高阶函数以及函数柯里化等高级函数应用,同时,因为正在学习JavaScript·函数式编程,想整理一下函数式编程中,对于我们日常比较有用的部分. 为什么函数式编程很重要? ...

  6. 四 mysql之单表查询

    目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 1. 什么是分组?为什么要分组? 2. ONLY_FULL_GROUP_BY ...

  7. 解决使用MUI时mui-slider-item高度不一致的自适应问题

    今天在写一个MUI项目的时候,发现使用slider时,最高的mui-slider-item会把mui-slider-group撑开,而其他的mui-slider-item下面会出现很大的空白. 百度了 ...

  8. ActiveMQ学习总结------入门篇01

    注:*这篇博文文章主要介绍ActiveMQ是什么原理性的内容和如何安装和简易操作 一. ActiveMQ  简介 1 ActiveMQ是什么呢?看起来好碉堡的东西哇! ActiveMQ 是 Apach ...

  9. pycharm 激活码 2019/11最新福利(2)

    812LFWMRSH-eyJsaWNlbnNlSWQiOiI4MTJMRldNUlNIIiwibGljZW5zZWVOYW1lIjoi5q2j54mIIOaOiOadgyIsImFzc2lnbmVlT ...

  10. Python多任务之进程

    Process多进程 进程的概念 程序是没有运行的代码,静态的: 进程是运行起来的程序,进程是一个程序运行起来之后和资源的总称: 程序只有一个,但同一份程序可以有多个进程:例如,电脑上多开QQ: 程序 ...