背景介绍
概念
URI
统一资源定位符, 表示一个资源在互联网中的位置, 一起都可以是资源, 比如一个标, 一个用户等
表现层
表现层指的是资源的格式, 比如: html, json等, 一般 URI 是没有后缀的, 我们加上的后缀实际上是表现层的东西
方法
GET, POST 等, 我们要删除一个资源的时候是直接表现在 URL 中的, 但是标准的 REST 规范是使用方法进行删除
方法及其作用
方法名 | 作用 |
---|---|
GET(SELECT) | 从服务器取出资源(一项或多项)。 |
POST(CREATE) | 在服务器新建一个资源。 |
PUT(UPDATE) | 在服务器更新资源(客户端提供改变后的完整资源)。 |
PATCH(UPDATE) | 在服务器更新资源(客户端提供改变的属性【补丁】)。 |
DELETE(DELETE) | 从服务器删除资源。 |
HEAD | 获得一个资源的元数据,比如一个资源的hash值或者最后修改日期; |
OPTIONS | 获得客户针对一个资源能够实施的操作; |
方法及其返回值
方法名 | 返回值 |
---|---|
GET /zoos | 列出所有动物园 |
POST /zoos | 新建一个动物园 |
GET /zoos/ID | 获取某个指定动物园的信息 |
PUT /zoos/ID | 更新某个指定动物园的信息(提供该动物园的全部信息) |
PATCH /zoos/ID | 更新某个指定动物园的信息(提供该动物园的部分信息) |
DELETE /zoos/ID | 删除某个动物园 |
GET /zoos/ID/animals | 列出某个指定动物园的所有动物 |
DELETE /zoos/ID/animals/ID | 删除某个指定动物园的指定动物 |
方法及其返回值类型
方法名 | 返回值类型 |
---|---|
GET /collection | 返回资源对象的列表(数组) |
GET /collection/resource | 返回单个资源对象 |
POST /collection | 返回新生成的资源对象 |
PUT /collection/resource | 返回完整的资源对象 |
PATCH /collection/resource | 返回完整的资源对象 |
DELETE /collection/resource | 返回一个空文档 |
状态码及其含义
状态码 | 含义 |
---|---|
200 OK - [GET] | 服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。 |
201 CREATED - [POST/PUT/PATCH] | 用户新建或修改数据成功。 |
202 Accepted - [*] | 表示一个请求已经进入后台排队(异步任务) |
204 NO CONTENT - [DELETE] | 用户删除数据成功。 |
400 INVALID REQUEST - [POST/PUT/PATCH] | 用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。 |
401 Unauthorized - [*] | 表示用户没有权限(令牌、用户名、密码错误)。 |
403 Forbidden - [*] | 表示用户得到授权(与401错误相对),但是访问是被禁止的。 |
404 NOT FOUND - [*] | 用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。 |
406 Not Acceptable - [GET] | 用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。 |
410 Gone -[GET] | 用户请求的资源被永久删除,且不会再得到的。 |
422 Unprocesable entity - [POST/PUT/PATCH] | 当创建一个对象时,发生一个验证错误。 |
500 INTERNAL SERVER ERROR - [*] | 服务器发生错误,用户将无法判断发出的请求是否成功。 |
测试方法
谷歌浏览器安装「postman」应用
操作
搭建 SSM 项目之后, 编写 Controller
请求方式的改变
1. 请求一个列表「GET」
「web.xml」中 Spring MVC 匹配的路径是 *.do
- 方法: 「get」
- URL: /emps
/**
* 员工控制器
* Created by nyy on 2017/8/24.
*/
@RestController //相当于 @Controller + @ResponseBody
@RequestMapping("/emps") //这个控制器的方法的路径的前缀
public class EmployeeController {
/**
* 获取所有的员工
*
* @return
*/
@RequestMapping(method = RequestMethod.GET)
public List<Employee> getEmployees() {
List<Employee> emps = new ArrayList<>();
emps.add(new Employee(1L, "Hanzo"));
emps.add(new Employee(2L, "Genji"));
return emps;
}
}
使用 GET
请求
![](https://img.haomeiwen.com/i1218612/206fd163508974c0.png)
使用 POST
方式请求
![](https://img.haomeiwen.com/i1218612/20b12b5bf5c0a59f.png)
2. 请求一个数据「GET」
已经将「web.xml」中 Spring MVC 匹配的路径改为 /
/**
* 获取一个员工
*
* 路径中的「{}」是匹配参数, 在方法的形参列表中使用 @PathVariable 标签指定要将路径中的参数指定给那个形参
* @param id
* @return
*/
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Employee getEmployee(@PathVariable("id") Long id) {
return new Employee(id, "Genji");
}
使用 GET
请求
![](https://img.haomeiwen.com/i1218612/db98a901c4ff51d6.png)
3. 更新一个数据「PUT|PATCH」
/**
* 更新一个员工对象
*
* @param id
* @param name
* @return
*/
@RequestMapping(method = RequestMethod.PUT)
public Employee update(Long id, String name) {
return new Employee(id, name);
}
使用 PUT
加上参数请求
![](https://img.haomeiwen.com/i1218612/4be15e6974198433.png)
4. 删除一个数据「DELETE」
/**
* 删除一个员工对象
*
* @param id
* @return
*/
@RequestMapping(method = RequestMethod.DELETE)
public AjaxResult update(Long id) {
return new AjaxResult("删除成功, id为:" + id);
}
使用 DELETE
格式删除数据
![](https://img.haomeiwen.com/i1218612/da1070989fefa114.png)
5. 创建一个数据「POST」
/**
* 创建一个员工对象
*
* @param id
* @param name
* @return
*/
@RequestMapping(method = RequestMethod.POST)
public Employee create(Long id, String name) {
return new Employee(id, name);
}
使用 POST
创建对象
![](https://img.haomeiwen.com/i1218612/ef3a5ca79882ce8d.png)
请求头/实体头的改变
Accept 和 Content-Type
- Accept 属于请求头, Content-Type 属于实体头。
Http 报头分为通用报头,请求报头,响应报头和实体报头。
-
请求方的 http 报头结构:通用报头|请求报头|实体报头
-
响应方的 http 报头结构:通用报头|响应报头|实体报头
-
Accept 代表发送端(客户端)希望接受的数据类型. 比如:
Accept:text/xml;
代表客户端希望接受的数据类型是xml类型
- Content-Type 代表发送端(客户端|服务器)发送的实体数据的数据类型. 比如:
Content-Type:text/html;
代表发送端发送的数据格式是html。
- 二者合起来
Accept:text/xml;
Content-Type:text/html
即代表希望接受的数据类型是 xml 格式,本次请求发送的数据的数据格式是html。
Accept
xml数据
/**
* 希望返回xml类型的数据
*
* @return
*/
// @RequestMapping(method = RequestMethod.GET, headers = "Accept=application/xml")
@RequestMapping(method = RequestMethod.GET, produces = "application/xml")
public void createByXml(HttpServletResponse response) {
response.setContentType("application/xml");
try {
response.getOutputStream().write("<Employee><id>1</id><username>D.VA</username></Employee>"
.getBytes("utf-8"));
} catch (IOException e) {
e.printStackTrace();
}
}
测试结果
![](https://img.haomeiwen.com/i1218612/dd940a58baed12cc.png)
json数据
/**
* 希望返回json类型的数据
*
* @return
*/
// @RequestMapping(method = RequestMethod.GET, headers = "Accept=application/json")
@RequestMapping(method = RequestMethod.GET, produces = "application/json")
public AjaxResult createByJson() {
return new AjaxResult("请返回 json 格式");
}
测试结果
![](https://img.haomeiwen.com/i1218612/e7905316c196df3b.png)
Content-Type
表单类型
![](https://img.haomeiwen.com/i1218612/5a38e8d6b63c96e4.png)
等同于
![](https://img.haomeiwen.com/i1218612/ffe1d2e5e1bcfd4d.png)
表示使用普通表单提交数据
/**
* 携带表单类型的数据
*
* @return
*/
@RequestMapping(method = RequestMethod.POST, headers = "Content-Type=application/x-www-form-urlencoded")
public Employee contentTypeForm(Employee employee) {
return employee;
}
测试结果
![](https://img.haomeiwen.com/i1218612/cbac136e14b81ec8.png)
Json 数据
/**
* 携带json类型的数据
*
* @return
*/
@RequestMapping(method = RequestMethod.POST, headers = "Content-Type=application/json")
public Employee contentTypeJson(@RequestBody Employee employee) {
return employee;
}
测试结果
![](https://img.haomeiwen.com/i1218612/0b279f29b6abae84.png)
页面中的操作
上边都是测试工具中改变类型的, 那么怎么在实际应用中改变提交参数的类型和提交方式, 往下看
改变表单的提交方式
普通表单请求
「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>springMVC</servlet-name>
</filter-mapping>
JSP 中给表单加一个隐藏域
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>表单提交</title>
</head>
<body>
<form action="/emps" method="post">
<input type="hidden" name="_method" value="DELETE">
<input type="text" name="id" value="1">
<input type="text" name="username" value="D.VA">
<input type="submit">
</form>
</body>
</html>
使用异步请求
异步请求只要设置请求的类型就好
$(function () {
$("#click").click(function () {
$.ajax({
url: '/emps',
type: 'DELETE',
dataType: 'json',
success: function (data) {
alert(data);
}
})
});
})
参考项目: 码云查看
网友评论