zoukankan      html  css  js  c++  java
  • 基于MVC的RESTFul风格API实战

    基于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);
        }
    }
    

    更多原创文章和Java学习资料清关注@公众号MakerStack

  • 相关阅读:
    同一部电脑配两个git账号
    在span中,让里面的span垂直居中用这个
    三张图搞懂JavaScript的原型对象与原型链
    vue2.0 生命周期
    js中__proto__和prototype的区别和关系?
    【转】css 包含块
    【转】BFC(block formating context)块级格式化上下文
    javascript中函数的5个高级技巧
    toString() 和 valueOf()
    桌面图标列表排列小工具
  • 原文地址:https://www.cnblogs.com/onlyzuo/p/13936929.html
Copyright © 2011-2022 走看看