基于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

基于MVC的RESTFul风格API实战的更多相关文章

  1. 基于MVC的RESTful风格的实现

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

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

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

  3. 第03章—打造RESTful风格API

    spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址:https://gitee.com/jinxia ...

  4. Restful风格API中用put还是post做新增操作有什么区别?

    Restful风格API中用put还是post做新增操作有什么区别? 转 头条面试归来,有些话想和Java开发者说!>>> 这个是华为面试官问我的问题,回来我找了很多资料,想验证这个 ...

  5. 通过beego快速创建一个Restful风格API项目及API文档自动化

    通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...

  6. 通过beego快速创建一个Restful风格API项目及API文档自动化(转)

    通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...

  7. day2(RESTful风格API)

    1.RESTful风格API  详情查看博客地址:https://www.cnblogs.com/xiaonq/p/10053234.html 1.1 什么是RESTful REST与技术无关,代表的 ...

  8. SpringBoot实战(二)Restful风格API接口

    在上一篇SpringBoot实战(一)HelloWorld的基础上,编写一个Restful风格的API接口: 1.根据MVC原则,创建一个简单的目录结构,包括controller和entity,分别创 ...

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

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

随机推荐

  1. 如何安装eclipse

    1.打开浏览器输入网址:http://www.eclipse.org 进入官方 2.(目前我使用windows操作系统),下拉界面选择"windows"后的"64-bit ...

  2. MySQL 修改表中的字段,使其自增

    例如,我想使字段 id 自增. 1.查看表定义 mysql> DESC user; +----------+-------------+------+-----+---------+------ ...

  3. Flink实例(五十): Operators(十)多流转换算子(五)coGroup 与union

    参考链接:https://mp.weixin.qq.com/s/BOCFavYgvNPSXSRpBMQzBw 需求场景分析 需求场景 需求诱诱诱来了...数据产品妹妹想要统计单个短视频粒度的「点赞,播 ...

  4. 【开源】Springboot API 一键生成器

    Springboot API 一键生成器 写这个项目,最大的想法就是:不做CRUD 程序猿 Springboot 在我们平时开发项目当中,是如此的常用.然而,比如平时我们写的一些: XX 管理系统 X ...

  5. Vue学习 一 环境搭建

    Vue  ui  启动 创建一个新项目 包管理器 npm Bable 转换js 至低版本的支持(兼容低版本) TypeScript  对TypeScript  的支持  (暂时不需要) PWA    ...

  6. 代码质量管理平台之SonarQube安装部署

    一.简介 Sonar是一个用于代码质量管理的开放平台,通过插件机制,sonar可以收集不同的测试工具,代码分析工具,以及持续集成工具.与持续集成工具(比如jenkins)不同,sonar并不是简单地把 ...

  7. MeteoInfoLab脚本示例:图形版面、点标注

    在MeteoInfoLab界面中,图形的大小会随着它所在的窗口的大小改变而改变,在需要精确控制图中一些要素的位置的时候会比较困难,这时可以用figure函数的一些参数来控制图形版面大小.figure函 ...

  8. day33 Pyhton logging 模块和包

    一内容回顾 try/except try/except/else try/finally try/except try/except/finally try/except/else/finally 报 ...

  9. bootStrap小结2

    <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...

  10. pytest文档53-命令行实时输出错误信息(pytest-instafail)

    前言 pytest 运行全部用例的时候,在控制台会先显示用例的运行结果(.或F), 用例全部运行完成后最后把报错信息全部一起抛出到控制台. 这样我们每次都需要等用例运行结束,才知道为什么报错,不方便实 ...