首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于 MVC的 RESTful风格的实现

基于 MVC的 RESTful风格的实现

作者头像
石的三次方
发布2021-01-05 22:26:33
发布2021-01-05 22:26:33
9710
举报
文章被收录于专栏:石的三次方石的三次方

1. RESTful风格阐述

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

1.1 REST风格资源路径

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

资源路径概览:sheme://host:port/path?queryString 例:http://localhost:8080/bywlstudio/users?username=xiuer&id=1

1.2 HTTP方法

GET用于读取、检索、查询、过滤资源 PSOT用于创建一个资源 PUT用于修改、更新资源、创建客户端维护主键信息的资源 DELETE用于删除资源

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

1.3 RESTful风格 API设计

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

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

代码语言:javascript
复制
POST/users

PUT/users{id}
[^创建客户端维护主键信息的资源]

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

2. MVCREST的支持

2.1主要通过注解来实现

  • @Controller声名一个处理请求的控制器
  • @RequestMapping请求映射地址,它存在几个子注解对于实现 REST风格来说更加具有语义性
  • @GETMapping GET请求
  • @PUTMapping PUT请求
  • @POSTMapping POST请求
  • @DELETEMapping DELETE请求
  • @ResponseBody 将响应内容转换为 JSON格式
  • @RequestBody 请求内容转换为 JSON格式
  • @PathVariable("id")用于绑定一个参数
  • @RESTController 等同于 @Controller+ @ResponseBody在类上写了这个注解,标识这个类的所有方法只返回数据,而不进行视图跳转

2.2返回 HTTP状态码

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

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

代码语言:javascript
复制
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方式

代码语言:javascript
复制
@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<?>方式

代码语言:javascript
复制
@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);}

2.3由于 MVC默认不支持 PUTDELETE方法,所以需要手动开启

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

代码语言:javascript
复制
<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中配置

代码语言:javascript
复制
<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.2 API设计

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控制层代码

代码语言:javascript
复制
@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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 石的三次方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. RESTful风格阐述
    • 1.1 REST风格资源路径
    • 1.2 HTTP方法
    • 1.3 RESTful风格 API设计
  • 2. MVC对 REST的支持
    • 2.1主要通过注解来实现
    • 2.2返回 HTTP状态码
    • 2.3由于 MVC默认不支持 PUT和 DELETE方法,所以需要手动开启
  • 3. MVC实现 REST代码实现
    • 3.1实例环境
    • 3.2 API设计
    • 3.3控制层代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档