基于MVC的RESTFul风格API实战
基于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/usersPUT/users{id}[^创建客户端维护主键信息的资源] |
| 删除 | DELETE/users/{id} |
| 修改/更新 | PUT/users/{id} |
| 查询全部 | GET/users |
| 主键查询 | GET/users/{id}GET/users?id=26 |
| 分页作用域查询 | GET/users?start=0&size=10GET/users?07,2019-07,2020 |
可以看到通过这个RESTAPI都是通过对同一个资源的操作,所不同的就是通过不同的HTTP方法来实现对资源不同的处理。
2.MVC对REST的支持
1.1主要通过注解来实现
@Controller声名一个处理请求的控制器@RequestMapping请求映射地址,它存在几个子注解对于实现REST风格来说更加具有语义性@GETMappingGET请求@PUTMappingPUT请求@POSTMappingPOST请求@DELETEMappingDELETE请求
@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默认不支持PUT和DELETE方法,所以需要手动开启
在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.8maven3.60tomcat9
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实战的更多相关文章
- 基于MVC的RESTful风格的实现
基于MVC的RESTful风格的实现 1.RESTful风格阐述 REST服务是一种ROA(Resource-Oriented Architecture,面向资源的架构)应用.主要特点是方法信息存在于 ...
- Restful风格API接口开发springMVC篇
Restful风格的API是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机 ...
- 第03章—打造RESTful风格API
spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址:https://gitee.com/jinxia ...
- Restful风格API中用put还是post做新增操作有什么区别?
Restful风格API中用put还是post做新增操作有什么区别? 转 头条面试归来,有些话想和Java开发者说!>>> 这个是华为面试官问我的问题,回来我找了很多资料,想验证这个 ...
- 通过beego快速创建一个Restful风格API项目及API文档自动化
通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...
- 通过beego快速创建一个Restful风格API项目及API文档自动化(转)
通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...
- day2(RESTful风格API)
1.RESTful风格API 详情查看博客地址:https://www.cnblogs.com/xiaonq/p/10053234.html 1.1 什么是RESTful REST与技术无关,代表的 ...
- SpringBoot实战(二)Restful风格API接口
在上一篇SpringBoot实战(一)HelloWorld的基础上,编写一个Restful风格的API接口: 1.根据MVC原则,创建一个简单的目录结构,包括controller和entity,分别创 ...
- 【Spring学习笔记-MVC-18.1】Spring MVC实现RESTful风格-同一资源,多种展现:xml-json-html
概要 要实现Restful风格,主要有两个方面要讲解,如下: 1. 同一个资源,如果需要返回不同的形式,如:json.xml等: 不推荐的做法: /user/getUserJson /user/get ...
随机推荐
- centos7安装YouCompleteMe,vim打造成C++的IDE
一.安装python3 1.安装编译工具 yum -y groupinstall "Development tools" yum -y install zlib-devel bzi ...
- SQL实战——01. 查找最晚入职员工的所有信息
查找最晚入职员工的所有信息CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` date NOT NULL,`first_n ...
- 【代码审计】PHP代码审计---基础记录
PHP伪协议 PHP伪协议事实上是其支持的协议与封装协议,支持的种类有以下12种. * file:// - 访问本地文件系统 * http:// - 访问 HTTP(s) 网址 * ftp:// - ...
- JVM系列【4】内存模型
JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 硬件层数据一致性 - 存储器层次结构 从L6-L0 空间由大变小,速度由慢 ...
- 二进制K8S集群使用Bootstrap Token 方式增加Node
TLS Bootstraping:在kubernetes集群中,Node上组件kebelet和kube-proxy都需要与kube-apiserver进行通信,为了增加传输安全性,采用https方式, ...
- Docker笔记1:Docker 的介绍
目 录 1.Docker 简介 2.Docker 特性 3.Docker 应用场景 4.Docker 优点 1.Docker 简介 Docker 提供了一个可以运行你的应用程序的封套(env ...
- JVM性能调优(4) —— 性能调优工具
前序文章: JVM性能调优(1) -- JVM内存模型和类加载运行机制 JVM性能调优(2) -- 垃圾回收器和回收策略 JVM性能调优(3) -- 内存分配和垃圾回收调优 一.JDK工具 先来看看有 ...
- golang API 请求队列
概要 实现思路 使用方法 启动队列服务 使用队列服务 概要 在调用第三方 API 的时候, 基本都有访问限速的限制条件. 第三方的 API 有多个的时候, 就不太好控制访问速度, 常常会导致 HTTP ...
- mysql 操作数据库
创建数据库 CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name(数据库名字) #添加 IF NOT EXISTS,如果已有数据库,将会提醒,不会出现错 ...
- 联赛%你测试10T2:漫无止境的八月
题意: 思路: 有几个特殊的性质: 在不考虑q里面的单点修改,我们先只判断一个序列是否Yes. 我们注意到每次操作都是对一个长度为k的区间进行区间加减1的操作,所以我们如果将序列里面的数按%k分组,把 ...