Tips:
REST
?格请求是什么样的?REST
?格请求到底提供了怎样的?持请求路径
、Query 参数
、HTTP 协议头
、HTTP 协议体
中。而放在协议体中的参数又有很多格式,比如 json
、form 表单
等。当然,前端也可能选择其他协议,比如 Websocket
、gRPC-Web
等,具体的参数形式跟 HTTP 又不一样。更多前后端请求和响应参数解析可以看我这篇文章:相关常见的http请求参数和响应参数,前后端交互参数说明。面对这么多种技术实现方式,当我们要设计一套 Web 系统时,该如何选择呢?首先,我们来看下三个时间点:
在 HTTP 1.0 出现以前,也就是 HTTP 0.9 时代,HTTP 协议只支持 GET 请求,所有参数只能通过 URL 传递。比如一个获取动态网页的请求可能是这样的 GET
/index.php?pageNum=1&pageSize=10&user=共饮一杯无&action=view
。
在 HTTP 1.0 出现后,开始有了 POST
请求和 HEAD
请求,支持从 HTTP 协议头和协议体传参数。但 HTTP 1.0 并没有解决每次请求都需要建立新连接的问题,然后 HTTP 1.1 很快就出现了。
HTTP 1.1 除了能保持连接外,还新增了多种方法,如 PUT
、DELETE
、PATCH
、OPTIONS
。虽然功能更强大,体验更丰富了,却带来了新的问题:这些方法该如何选择呢?比如我要上传数据,到底是用 POST 、PUT 还是 PATCH 呢?这无疑增加了选择成本。
随后,REST( Representational State Transfer,表现层状态转移)
出现了,简单来说它就是一组架构约束条件和原则,而符合 REST 规则的设计便是 RESTful。
因为 HTTP 协议本身是无状态的,但后端数据是有状态的,如何用无状态的协议来操作有状态的数据就比较有挑战。比如,当只用 GET 请求的时候,你无法从请求参数上直观判断到底是对数据做什么操作,因为大家对 GET 请求参数命名没有统一规范。在前面的例子中,action=view 也有可能被定义成 a=v。
RESTful 是如何解决这个问题的呢?它充分利用了各种 HTTP 请求方法的特点,来表达对数据的具体操作方式。
Restful 是?种 web 软件架构?格,它不是标准也不是协议,它倡导的是?个资源定位及资源操作的?格。
什么是 REST
:
REST(英?:Representational State Transfer,简称 REST,表现层状态转换)
描述了?个架构样式的?络系统, ?如web 应?程序。它?次出现在 2000 年 Roy Fielding 的博?论?中,他是 HTTP 规范的主要编写者之?。在?前主流的三种 Web 服务交互?案中,REST 相?于 SOAP(Simple Object Access protocol,简单对象访问协议)
以及XML-RPC
更加简单明了,?论是对 URL 的处理还是对 Payload 的编码,REST 都倾向于?更加简单轻量的?法设计和实现。值得注意的是 REST 并没有?个明确的标准,?更像是?种设计的?格。
它本身并没有什么实?性,其核?价值在于如何设计出符合 REST ?格的?络接?。
它结构清晰、符合标准、易于理解、扩展?便,所以正得到越来越多?站的采?。
资源(Resources)
:?络上的?个实体,或者说是?络上的?个具体信息。
它可以是?段?本、?张图?、??歌曲、?种服务,总之就是?个具体的存在。可以??个 URI(统?资源定位符)指向它,每种资源对应?个特定的 URI 。要获取这个资源,访问它的 URI 就可以,因此URI 即为每?个资源的独???的识别符。
表现层(Representation)
:把资源具体呈现出来的形式,叫做它的表现层 (Representation)。?如,?本可以? txt 格式表现,也可以? HTML 格式、XML 格式、JSON 格式表现,甚?可以采??进制格式。
状态转化(State Transfer)
:每发出?个请求,就代表了客户端和服务器的?次交互过程。
HTTP 协议,是?个?状态协议
,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器, 必须通过某种?段,让服务器端发?“状态转化”(State Transfer)。?这种转化是建?在表现层之上的,所以就是 “ 表现层状态转化” 。具体说, 就是 HTTP 协议??,四个表示操作?式的动词:
GET 、POST 、PUT 、DELETE
。它们分别对应四种基本操作:GET ?来获取资源
,POST ?来新建资
源,PUT ?来更新资源
,DELETE ?来删除资源
。
REST是?个url请求的?格,基于这种?格设计请求的URL。
http://localhost:8080/user/queryUserById.action?id=3
url中定义了动作(操作),参数具体锁定到操作的是谁
rest中,认为互联?中的所有东?都是资源,既然是资源就会有?个唯?的uri标识它,代表它http://localhost:8080/user/3 代表的是id为3的那个?户记录(资源)
锁定资源之后如何操作它呢?常规操作就是增删改查
根据请求?式不同,代表要做不同的操作
REST?格带来的直观体现:就是传递参数?式的变化,参数可以在uri中了
/account/1 HTTP GET :得到 id = 1 的 account
/account/1 HTTP DELETE:删除 id = 1 的 account
/account/1 HTTP PUT:更新 id = 1 的 account
URL:资源定位符,通过URL地址去定位互联?中的资源(抽象的概念,?如图?、视频、app服务
等)。
RESTful ?格 URL:互联?所有的事物都是资源,要求URL中只有表示资源的名称,没有动词。
RESTful?格资源操作:使?HTTP请求中的method?法put、delete、post、get来操作资源。分别对应添加、删除、修改、查询。不过?般使?时还是 post 和 get。put 和 delete?乎不使?。
RESTful ?格资源表述:可以根据需求对URL定位的资源返回不同的表述(也就是返回数据类型,?如XML、JSON等数据格式)。
Spring MVC ?持 RESTful ?格请求,具体讲的就是使? @PathVariable
注解获取 RESTful ?格的请求URL中的路径变量。
示例代码
<div>
<h2>SpringMVC对Restful?格url的?持</h2>
<fieldset>
<p>测试?例:SpringMVC对Restful?格url的?持</p>
<a href="/demo/handle/15">rest_get测试</a>
<form method="post" action="/demo/handle">
<input type="text" name="username"/>
<input type="submit" value="提交rest_post请求"/>
</form>
<form method="post" action="/demo/handle/15/lisi">
<input type="hidden" name="_method" value="put"/>
<input type="submit" value="提交rest_put请求"/>
</form>
<form method="post" action="/demo/handle/15">
<input type="hidden" name="_method" value="delete"/>
<input type="submit" value="提交rest_delete请求"/>
</form>
</fieldset>
</div>
/*
* restful get /demo/handle/15
*/
@RequestMapping(value = "/handle/{id}",method =
{RequestMethod.GET})
public ModelAndView handleGet(@PathVariable("id") Integer id) {
Date date = new Date();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("date",date);
modelAndView.setViewName("success");
return modelAndView;
}
/*
* restful post /demo/handle
*/
@RequestMapping(value = "/handle",method = {RequestMethod.POST})
public ModelAndView handlePost(String username) {
Date date = new Date();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("date",date);
modelAndView.setViewName("success");
return modelAndView;
}
/*
* restful put /demo/handle/15/lisi
*/
@RequestMapping(value = "/handle/{id}/{name}",method =
{RequestMethod.PUT})
public ModelAndView handlePut(@PathVariable("id") Integer
id,@PathVariable("name") String username) {
Date date = new Date();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("date",date);
modelAndView.setViewName("success");
return modelAndView;
}
/*
* restful delete /demo/handle/15
*/
@RequestMapping(value = "/handle/{id}",method =
{RequestMethod.DELETE})
public ModelAndView handleDelete(@PathVariable("id") Integer id) {
Date date = new Date();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("date",date);
modelAndView.setViewName("success");
return modelAndView;
}
<!--配置springmvc请求?式转换过滤器,会检查请求参数中是否有_method参数,如果有就
按照指定的请求?式进?转换-->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filterclass>org.springframework.web.filter.HiddenHttpMethodFilter</filterclass>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
RESTful 请求规范定义了如何构建和处理 HTTP 请求以实现资源的创建、读取、更新和删除(CRUD)
操作。以下是一些常见的 RESTful 请求规范定义:
GET /users
GET /users/{id}
POST /users
PUT /users/{id}
DELETE /users/{id}
GET /users?status=active
GET /users?sort=name
GET /users?page=2&pageSize=10
这些规范定义了如何设计和使用 RESTful API,以便实现清晰、可维护和可扩展的 API。设计一个良好的 RESTful API 对于构建可靠的分布式应用程序至关重要。
本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注??,您的鼓励是我最大的动力。
如有错误?疑问💬欢迎各位指出。
主页:共饮一杯无的博客汇总👨?💻保持热爱,奔赴下一场山海。🏃🏃🏃