基于MVC的RESTful风格的实现
基于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<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.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);
}
}
本文项目地址:https://github.com/946470326/MakerStack/tree/ssm
基于MVC的RESTful风格的实现的更多相关文章
- 基于MVC的RESTFul风格API实战
基于MVC的RESTful风格的实现 1.RESTful风格阐述 REST服务是一种ROA(Resource-Oriented Architecture,面向资源的架构)应用.主要特点是方法信息存在于 ...
- 【Spring学习笔记-MVC-18.1】Spring MVC实现RESTful风格-同一资源,多种展现:xml-json-html
概要 要实现Restful风格,主要有两个方面要讲解,如下: 1. 同一个资源,如果需要返回不同的形式,如:json.xml等: 不推荐的做法: /user/getUserJson /user/get ...
- java之spring mvc之Restful风格开发及相关的配置
1. Restful : 表征状态状态转移. 传统 : url : http://localhost:8080/usersys/delete.do?user.id=12 Restful 风格:url ...
- 基于cxf开发restful风格的Web Service
一.写在前面 webservice一些简单的其他用法和概念,就不在这里赘述了,相信大家都可以在网上查到,我也是一个新手,写这篇文章的目的一方面是想记录自己成长的历程,另一方面是因为学习这个的时候花了点 ...
- SpringMVC+Json构建基于Restful风格的应用(转)
一.spring 版本:spring-framework-3.2.7.RELEASE 二.所需其它Jar包: 三.主要代码: web.xml <?xml version="1.0&qu ...
- MockMVC - 基于RESTful风格的Springboot,SpringMVC的测试
MockMVC - 基于RESTful风格的SpringMVC的测试 对于前后端分离的项目而言,无法直接从前端静态代码中测试接口的正确性,因此可以通过MockMVC来模拟HTTP请求.基于RESTfu ...
- Spring MVC 4.1.4 RESTFUL风格返回JSON数据406错误处理
Spring MVC 4.1.4 RESTFUL风格返回JSON数据406错误处理 今天在使用spring4.1.4,使用ResponseBody注解返回JSON格式的数据的时候遇到406错误. 解决 ...
- Aspnet Mvc 前后端分离项目手记(三)关于restful 风格Url设计
RESTful 不是新东西,简单理解它的核心思想就是最大程度的利用http协议的一些特点,比如uri,比如请求动词,在前后端分离的项目中会有大大的好处 ,好的设计的url简单明了,胜过详细的说明文档. ...
- Restful风格API接口开发springMVC篇
Restful风格的API是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机 ...
随机推荐
- 学习WEBAPI第一天
目录 WebApi: 通过操作对象来实现操作标签的目的 一.DOM 中常用的操作 二.doucument对象 三.获取元素 四.注册事件 五.操作元素的属性 六.当页面加载完时,script代码已经执 ...
- Spring 梳理 - 视图解析器 VS 视图(View,ViewResolver)
View View接口表示一个响应给用户的视图,例如jsp文件,pdf文件,html文件等 该接口只有两个方法定义,分别表明该视图的ContentType和如何被渲染 Spring中提供了丰富的视图支 ...
- setfacl、getfacl
当用户访问一个文件时,权限匹配的顺序为owner--->group--->other.当设置访问控制列表后,owner--->facl_user--->group---> ...
- useradd、id、userdel、usermod、chsh、passwd、pwck
1.useradd [-cdefgGmkMsu] 用户名称 用来添加用户 -c “备注“:加上备注文字 -d 路径:指定家目录 -e 有效期限:指定帐号的有效期限: -f 缓冲天数:指定在密码过期后多 ...
- vue 单页应用点击某个链接,跳转到新页面的方式
<router-link class="goDetail" :to="{name: 'detail',params: {id:item.id}}" tar ...
- 如何决定使用 HashMap 还是 TreeMap?
问:如何决定使用 HashMap 还是 TreeMap? 介绍 TreeMap<K,V>的Key值是要求实现java.lang.Comparable,所以迭代的时候TreeMap默认是按照 ...
- Web调用Linux客户端remmina运维
相信你遇到过这样的场景,在浏览器网页中点击QQ图标咨询,就能唤起本机的装的qq或tim,下载百度网盘的资源的时候,点击链接浏览器会启动本地百度云进行下载. 最近因为项目需要,也要实现类似的操作,不 ...
- Python 命令行参数解析工具 argparse
为什么需要argparse 开门见山,举一个简易计算器代码的例子,其中sys.argv用来读取脚本执行时后面传入的参数. def calculator(x, y, operation): if &qu ...
- CSS 选择符有哪些?哪些属性可以继承?优先级算法如何计算?
CSS 选择符有哪些? 1.id选择器(#id) 2.类选择器(.class) 3.标签选择器(div,h1,p) 4.相邻选择器(h1 + p) 5.子选择器(ul > li) 6.后代选择器 ...
- Xadmin查询
目录 深浅coopy运用 ModelForm的补充 提取模型当中相关属性 getattr和get_field的区别 __ str__,get_field,getattr初识 str ,当用getatt ...