摘要:REST,即Representational State Transfer的缩写。直接翻译的意思是"表现层状态转化"。它是一种互联网应用程序的API设计理念:URL定位资源,用HTTP动词(GET,POST,DELETE,PUT)描述操作。本文将介绍Restful风格API在SSM系统中的使用,我将实现如下几种常用风格的API
GET --> /ssm/basicUser/1 查看某个具体的用户
POST --> /ssm/basicUser/user 新建一个用户
PUT --> /ssm/basicUser/1 更新某个具体的用户
DELETE --> /ssm/basicUser/1 删除某个具体的用户
在开始实现案例之前简单介绍下相关概念
1. REST原则,围绕资源展开介绍
从资源的定义、获取、表述、关联、状态变迁等角度,列举一些关键概念并加以解释。
(1.1)资源与URI
其实指的就是资源。任何事物,它就是一个资源。资源可以是实体(用户),也可以只是一个抽象概念(例如用户价值)
(1.2)统一资源接口
RESTful架构应该遵循统一接口原则,统一接口包含了一组受限的预定义的操作,不论什么样的资源,都是通过使用相同的接口进行资源的访问。接口应该使用标准的HTTP方法如GET,PUT和POST,并遵循这些方法的语义。
(1.3)资源的表述
接口请求,客户端获取的可以说是资源的表述而已。 资源在外界的具体呈现,可以有多种表述形式,在客户端和服务端之间传送的也是资源的表述,而不是资源本身。 如文本的html、xml、json等格式,图片可以使用PNG或JPG展现出来
(1.4)状态的转移
类似"下一页"之类的链接起的就是这种推进状态的作用——指引你如何从当前状态进入下一个可能的状态
2. SSM系统构建RESTFul API
(2.1)GET 查看用户具体实现
package com.ssm.;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ssm.entity.BasicUser;
import com.ssm.entity.Page;
import com.ssm.service.BasicUserService;
import com.ssm.util.FinalData;
import com.ssm.util.ResultModel;
/**
* 用户控制器
* @author https://blog.csdn.net/caiqing116
*/
@Controller
@RequestMapping("/ssm/basicUser")
public class BasicUserController {
@Autowired
private BasicUserService basicUserService;
/**
* 查
* @param id 用户id
* @return
*/
@RequestMapping(value="/{id}", method = RequestMethod.GET)
@ResponseBody
public ResultModel selectById(@PathVariable("id")Integer id) {
BasicUser basicUser = basicUserService.selectById(id);
return new ResultModel(200, basicUser, "获取成功");
}
}
(2.2)POST 创建用户具体实现
/**
* 增
* @param basicUser 用户对象
* @return
*/
@RequestMapping(value="/user", method = RequestMethod.POST)
@ResponseBody
public ResultModel insertBasicUser(BasicUser basicUser) {
int row = basicUserService.insert(basicUser);
if(row > 0) {
return new ResultModel(201, row, "新增成功");
}
return new ResultModel(200, row, "新增失败");
}
(2.3)PUT更新某个用户实现
对于put和delete请求浏览器form请求时需要在web.xml文件中配置过滤器,在请求时使用POST请求,额外传递参数 _method=“PUT”
form请求例子
<form method="POST" action="<%=request.getServletContext().getContextPath()%>/ssm/basicUser/1">
<input type="hidden" name="_method" value="PUT">
<p>姓名:</p><input type="text" name="username" /><br/>
<p>真实姓名:</p><input type="text" name="realname" /><br/>
<button type="submit">提交</button>
</form>
配置过滤器HiddenHttpMethodFilter
<!-- 配置过滤器 将POST请求转换为PUT和DELETE请求 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
更新某个用户实现
* 改
* @param id 用户id
* @param realname 用户真实姓名
* @return
*/
@RequestMapping(value="/{id}", method = RequestMethod.PUT)
@ResponseBody
public ResultModel updateById(@PathVariable("id")Integer id, String realname) {
BasicUser basicUser = new BasicUser();
basicUser.setId(id);
basicUser.setRealname(realname);
int row = basicUserService.updateById(basicUser);
if(row > 0) {
return new ResultModel(201, row, "更新成功");
}
return new ResultModel(200, row, "更新失败");
}
(2.4)DELETE删除用户具体实现
在请求时使用POST请求,额外传递参数 _method=”DELETE"
form请求示例如下:
<form method="POST" action="<%=request.getServletContext().getContextPath()%>/ssm/basicUser/1">
<input type="hidden" name="_method" value="DELETE">
<button type="submit">提交</button>
</form>
接口实现如下:
/**
* 删
* @param id 用户id
* @return
*/
@RequestMapping(value="/{id}", method = RequestMethod.DELETE)
@ResponseBody
public ResultModel deleteById(@PathVariable("id")Integer id) {
int row = basicUserService.deleteById(id);
if(row > 0) {
return new ResultModel(200, row, "删除成功");
}
return new ResultModel(404, row, "删除失败");
}
3. 状态码总结
GET状态码
200(OK) - 表示已在响应中发出
204(无内容) - 资源有空表示
301(Moved Permanently) - 资源的URI已被更新
303(See Other) - 其他(如,负载均衡)
304(not modified)- 资源未更改(缓存)
400 (bad request)- 指代坏请求(如,参数错误)
404 (not found)- 资源不存在
406 (not acceptable)- 服务端不支持所需表示
500 (internal server error)- 通用错误响应
503 (Service Unavailable)- 服务端当前无法处理请求
POST状态码
200(OK)- 如果现有资源已被更改
201(created)- 如果新资源被创建
202(accepted)- 已接受处理请求但尚未完成(异步处理)
301(Moved Permanently)- 资源的URI被更新
303(See Other)- 其他(如,负载均衡)
400(bad request)- 指代坏请求
404 (not found)- 资源不存在
406 (not acceptable)- 服务端不支持所需表示
409 (conflict)- 通用冲突
412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)
415 (unsupported media type)- 接受到的表示不受支持
500 (internal server error)- 通用错误响应
503 (Service Unavailable)- 服务当前无法处理请求
PUT状态码
200 (OK)- 如果已存在资源被更改
201 (created)- 如果新资源被创建
301(Moved Permanently)- 资源的URI已更改
303 (See Other)- 其他(如,负载均衡)
400 (bad request)- 指代坏请求
404 (not found)- 资源不存在
406 (not acceptable)- 服务端不支持所需表示
409 (conflict)- 通用冲突
412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突)
415 (unsupported media type)- 接受到的表示不受支持
500 (internal server error)- 通用错误响应
503 (Service Unavailable)- 服务当前无法处理请求
DELETE状态码
200 (OK)- 资源已被删除
301 (Moved Permanently)- 资源的URI已更改
303 (See Other)- 其他,如负载均衡
400 (bad request)- 指代坏请求
404 (not found)- 资源不存在
409 (conflict)- 通用冲突
500 (internal server error)- 通用错误响应
503 (Service Unavailable)- 服务端当前无法处理请求
4 利用Postman测试接口功能
测试新增接口
测试查询接口
测试修改接口
再调用下查询接口验证
测试删除接口
再调用下查询接口验证,如下data为空说明删除成功