RESTful的详解

Posted Binaire-沐辰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RESTful的详解相关的知识,希望对你有一定的参考价值。

文章目录


1. RESTful是什么?

  • RESTful 也称为REST(英文:Representational State Transfer)即表现层状态传递,它是一种软件架构风格或设计风格,而不是一个标准。

  • REST 是Roy Fielding博士在2000年他的博士论文中提出来的。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。

2. 传统风格与RESTful风格对比

2.1 传统风格

如果是原来的架构风格,需要发送四个请求,分别是?
查询用户:http://localhost:8080/springmvc/selectuser?id=1GET
增加用户: http://localhost:8080/springmvc/insertuserPOST
修改用户: http://localhost:8080/springmvc/updateuserPUT
删除用户: http://localhost:8080/springmvc/deleteuser?id=1 DELETE

2.1 RESTful风格

按照传统方式发送请求的时候比较麻烦,需要定义多种请求,而RESTful在HTTP协议中,有不同的发送请求的方式,分别是GET、POST、PUT和DELETE方式,分别对应查询、修改、添加和删除操作。我们如果能让不同的请求方式表示不同的请求类型就可以简化我们的查询。

查询用户: http://localhost:8080/springmvc/user/1 GET ­­查询
查询多个用户: http://localhost:8080/springmvc/user GET
添加用户: http://localhost:8080/springmvc/user POST ­­­添加
修改用户: http://localhost:8080/springmvc/user PUT ­­修改
删除用户:http://localhost:8080/springmvc/user DELETE ­­删除

注意:RESTful风格中的URL不存在动词形式的路径,如selectuser表示查询用户,是一个动词,要改为名词user。

3. RESTful的实现

RESTful 风格提倡URL地址使用统一的风格设计,各单词之间用斜杠分开。

3.1 GET、POST方式

3.1.1 创建控制器类

@Controller
public class UserController 

    @RequestMapping(value = "/user", method = RequestMethod.GET)
    public String getAllUser()
        System.out.println("查询所有用户信息");
        return "success";
    

    @RequestMapping(value = "/user/id",method = RequestMethod.GET)
    public String getUserById()
        System.out.println("根据用户ID查询用户信息");
        return "success";
    

	@RequestMapping(value = "/user",method = RequestMethod.POST)
    public String insertUser(String username,String password)
        System.out.println("添加用户信息:" + username + ","+ password);
        return "success";
    

3.1.2 创建一个jsp页面

  • 通过超链接的方式进行测试
<a href="$pageContext.request.contextPath/user">查询全部</a><br>
<a href="$pageContext.request.contextPath/user/1">根据id查询信息</a><br>
<form action="$pageContext.request.contextPath/user" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit" value="添加"><br>
</form>
  • 运行之后可以在控制台正常输出

3.2 PUT、DELETE方式

一切看起来都非常美好,但是大家需要注意了,我们在发送请求的时候只能发送post或者get,没有办法发送put和delete请求,那么应该如何处理呢?下面开始进入代码环节:

3.2.1 编写控制器方法

@RequestMapping(value = "/user",method = RequestMethod.PUT)
public String updateUser(String username,String password)
    System.out.println("修改用户信息:" + username + ","+ password);
    return "success";


@RequestMapping(value = "/user",method = RequestMethod.DELETE)
public String deleteUser(String username,String password)
    System.out.println("删除用户信息:" + username + ","+ password);
    return "success";

3.2.2 配置HiddenHttpMethodFilter

  • 在web.xml文件中配置HiddenHttpMethodFilter过滤器来处理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>

3.2.3 编写jsp页面

处理put和delete请求方式注意事项:

  • 请求方式必须为: post
  • 请求参数必须为:_method
<form action="$pageContext.request.contextPath/user" method="post">
    <input name="_method" value="put" type="hidden"/>
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit" value="修改"><br>
</form>
<form action="$pageContext.request.contextPath/user" method="post">
    <input name="_method" value="delete" type="hidden"/>
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit" value="删除"><br>
</form>

测试结果:

3.3 Http405 解决方法

在处理put和delete请求方式时,可能会遇到这种情况:控制台能够正常输出,但是浏览器会报405错误

解决办法:
1.加入 @ResponseBody 注解。
2.请求先转给一个Controller,再返回jsp页面。
注意:注解添加位置在控制器方法处

RESTful API使用详解

Restful API是目前比较成熟的一套互联网应用程序的API设计理念,Rest是一组架构约束条件和原则,如何Rest约束条件和原则的架构,我们就称为Restful架构,Restful架构具有结构清晰、符合标准、易于理解以及扩展方便等特点,受到越来越多网站的采用!

Restful API接口规范包括以下部分:

一、协议

API与用户的通信协议,总是使用HTTPs协议。

二、域名

应该尽量将API部署在专用域名之下,如https://api.oldboyedu.com;如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下,如https://oldboyedu.com/api/

三、版本

可以将版本号放在HTTP头信息中,也可以放入URL中,如https://api.oldboyedu.com/v1/

四、路径

路径是一种地址,在互联网上表现为网址,在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"collection),所以API中的名词也应该使用复数,如https://api.oldboyedu.com/v1/students

五、HTTP动词

对于资源的具体操作类型,由HTTP动词表示,HTTP动词主要有以下几种,括号中对应的是SQL命令。

1. GETSELECT):从服务器取出资源(一项或多项);

2. POSTCREATE):在服务器新建一个资源;

3. PUTUPDATE):在服务器更新资源(客户端提供改变后的完整资源);

4. PATCHUPDATE):在服务器更新资源(客户端提供改变的属性);

5. DELETEDELETE):从服务器删除资源;

6. HEAD:获取资源的元数据;

7. OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。

六、过滤信息

如果记录数量很多,服务器不可能都将它们返回给用户,API会提供参数,过滤返回结果,常见的参数有:

1. ?limit=20:指定返回记录的数量为20

2. ?offset=8:指定返回记录的开始位置为8

3. ?page=1&per_page=50:指定第1页,以及每页的记录数为50

4. ?sortby=name&order=asc:指定返回结果按照name属性进行升序排序;

5. ?animal_type_id=2:指定筛选条件。

七、状态码

服务器会向用户返回状态码和提示信息,以下是常用的一些状态码:

1. 200 OK - [GET]:服务器成功返回用户请求的数据;

2. 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功;

3. 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务);

4. 204 NO CONTENT - [DELETE]:用户删除数据成功;

5. 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作;

6. 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误);

7. 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的;

8. 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作;

9. 406 Not Acceptable - [GET]:用户请求的格式不可得;

10. 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的;

11. 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误;

12. 500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

八、错误处理

如果状态码是4xx,就会向用户返回出错信息,一般来说,返回的信息中将error作为键名,出错信息作为键值。

九、返回结果

针对不同操作,服务器向用户返回的结果应该符合以下规范:

1. GET /collection:返回资源对象的列表(数组);

2. GET /collection/resource:返回单个资源对象;

3. POST /collection:返回新生成的资源对象;

4. PUT /collection/resource:返回完整的资源对象;

5. PATCH /collection/resource:返回完整的资源对象;

6. DELETE /collection/resource:返回一个空文档。

十、Hypermedia API

RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。

以上是Restful API设计应遵循的十大规范,除此之外,Restful API还需注意身份认证应该使用OAuth 2.0框架,服务器返回的数据格式,应该尽量使用JSON,避免使用XML。

以上是关于RESTful的详解的主要内容,如果未能解决你的问题,请参考以下文章

Restful

Web开发中怎么用RESTful做后端API

Web开发中怎么用RESTful做后端API

没有收到从 jQuery ajax 到 JAVA RESTful webservice 的任何请求

后端提供给前端restful的接口,前端怎么操作

RESTful详解