本网站(662p.com)打包出售,且带程序代码数据,662p.com域名,程序内核采用TP框架开发,需要联系扣扣:2360248666 /wx:lianweikj
精品域名一口价出售:1y1m.com(350元) ,6b7b.com(400元) , 5k5j.com(380元) , yayj.com(1800元), jiongzhun.com(1000元) , niuzen.com(2800元) , zennei.com(5000元)
需要联系扣扣:2360248666 /wx:lianweikj
基于MVC的RESTFul风格API实战
luenmicro · 363浏览 · 发布于2020-11-06 +关注

基于MVC的RESTful风格的实现

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.MVC对REST的支持

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> findAll(){
    List users = userService.findAll();    
    return new ResponseEntity<List>(users , HttpStatus.OK);
}
1.3由于MVC默认不支持PUT和DELETE方法,所以需要手动开启

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

defaultorg.apache.catalina.servlets.DefaultServletdebug0listingsfalse        readonly        true1

在项目的web.xml中配置

    HiddenHttpMethodFilter    org.springframework.web.filter.HiddenHttpMethodFilter        HiddenHttpMethodFilter    dispathcherServlet

3.MVC实现REST代码实现

3.1实例环境
  • JDK1.8

  • maven3.60

  • tomcat9

3.2API设计
URIDescriptionResponseHTTPStatus
GET/users获取全部用户JSON200
GET/users/{id}获取指定主键的用户JSON200
PUT/users/{id}修改指定的主键的用户信息JSON200/201
POST/users增加一个用户JSON201
DELETE/users/{id}删除一个用户void204
3.3控制层代码
@RestController
@RequestMapping("/users")
public class UserControler {

    @Autowired
    private IUserService userService ;

    //REST风格实现方法

    /**
     * 查询所有
     * @return
     */
    @GetMapping(produces = "application/json;charset=utf-8")
    public ResponseEntity<List> findAll(){
        List users = userService.findAll();
        return new ResponseEntity<List>(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 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(deUser,HttpStatus.CREATED);
        return new ResponseEntity(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);
    }
}


相关推荐

PHP实现部分字符隐藏

沙雕mars · 1312浏览 · 2019-04-28 09:47:56
Java中ArrayList和LinkedList区别

kenrry1992 · 896浏览 · 2019-05-08 21:14:54
Tomcat 下载及安装配置

manongba · 957浏览 · 2019-05-13 21:03:56
JAVA变量介绍

manongba · 953浏览 · 2019-05-13 21:05:52
什么是SpringBoot

iamitnan · 1076浏览 · 2019-05-14 22:20:36
加载中

0评论

评论
本人有多年的互联网工作经验,专注技术研发,运维工作等!
分类专栏
小鸟云服务器
扫码进入手机网页