HTTP 将增加一个新的方法类型!

大家好,我是 ConardLi

在传统的 HTTP 协议中,GETPOST 是最常用于请求数据的两种方法。然而,它们各自有着一定的局限性。特别是当请求数据量较大时,通过 GET 方法将参数嵌入 URL 中显得不够灵活。另一方面,尽管 POST 方法允许在请求体中传递大量数据,却无法保证操作的幂等性和安全性。

为了弥补这些不足,HTTP 工作组提出了一种新的方法------QUERY,该方法既能承载大量请求数据,又能保证请求的幂等性和安全性。

QUERY 方法的定义

QUERY 是一种安全且幂等的 HTTP 请求方法,它允许携带请求内容。与 GET 方法不同,QUERY 方法并不请求服务器返回指定 URI 资源的表示,而是要求服务器根据请求内容进行查询操作。简单来说,QUERY 方法通过请求体来定义查询操作,并将操作结果作为响应返回。

使用场景

当请求参数较多或数据量较大时,通过 URL 传递参数显得困难。这时,QUERY 方法能够更好地解决此问题。举个例子:

http 复制代码
GET /search?q=example&limit=10&sort=desc HTTP/1.1
Host: conardli.top

如果查询参数非常多,可能会导致 URL 长度超出限制,或者在某些系统中无法正常传递。这时可以使用 QUERY 方法:

http 复制代码
QUERY /search HTTP/1.1
Host: conardli.top
Content-Type: application/json

{
    "q": "ConardLi",
    "limit": 17,
    "sort": "desc"
}

以上代码展示了如何通过请求体传递参数,避免了 URL 过长的问题。

幂等性和安全性

POST 方法不同,QUERY 方法明确表示查询操作是安全的,不会改变服务器上的资源状态。这意味着,无论请求多少次,服务器资源的状态都不会因为 QUERY 请求而发生变化。

另外,QUERY 方法的幂等性保证了相同的请求会得到相同的结果,这对于缓存和自动重试等操作非常有用。

缓存机制

QUERY 方法的响应是可缓存的,缓存机制与其他 HTTP 方法类似。为了提高缓存效率,应对请求内容进行规范化处理,例如移除内容编码、基于格式规范化请求内容等。

Accept-Query 响应头

服务器可以通过在响应中包含 Accept-Query 头字段来明确支持 QUERY 方法,并指定可用的查询格式媒体类型。例如:

http 复制代码
Accept-Query: application/json, application/xml

示例

以下是一些 QUERY 方法的典型使用示例:

简单查询直接响应

http 复制代码
QUERY /contacts HTTP/1.1
Host: conardli.top
Content-Type: example/query
Accept: text/csv

select surname, givenname, email limit 17

响应:

http 复制代码
HTTP/1.1 200 OK
Content-Type: text/csv

surname, givenname, email
Smith, John, john.smith@conardli.top
Jones, Sally, sally.jones@conardli.top
Dubois, Camille, camille.dubois@example.net

带有 LocationContent-Location 的响应

http 复制代码
QUERY /contacts HTTP/1.1
Host: conardli.top
Content-Type: example/query
Accept: text/csv

select surname, givenname, email limit 17

响应:

http 复制代码
HTTP/1.1 200 OK
Content-Type: text/csv
Content-Location: /contacts/responses/42
Location: /contacts/queries/17

surname, givenname, email
Smith, John, john.smith@conardli.top
Jones, Sally, sally.jones@conardli.top
Dubois, Camille, camille.dubois@example.net

通过 GET 请求 Content-Location 返回的资源,将得到相同的响应内容。

简单查询间接响应(303 See Other)

http 复制代码
QUERY /contacts HTTP/1.1
Host: conardli.top
Content-Type: example/query
Accept: text/csv

select surname, givenname, email limit 17

响应:

http 复制代码
HTTP/1.1 303 See Other
Location: http://conardli.top/contacts/query123

随后,客户端可以通过 GET 请求 Location 返回的资源来获取查询结果:

http 复制代码
GET /contacts/query123 HTTP/1.1
Host: conardli.top
Accept: text/csv

响应:

http 复制代码
HTTP/1.1 200 OK
Content-Type: text/csv

surname, givenname, email
Smith, John, john.smith@conardli.top
Jones, Sally, sally.jones@conardli.top
Dubois, Camille, camille.dubois@example.net

最后

与其他 HTTP 方法类似,QUERY 方法也需要注意一些安全性问题。例如,避免在 URL 中暴露敏感信息,尽量使用请求体传递查询参数。当服务器创建临时资源来表示 QUERY 请求结果时,应该避免在 URI 中以明文形式暴露原始请求内容。

QUERY 方法的引入为 HTTP 协议提供了更灵活的查询机制,解决了大数据量请求传递的难题,同时保证了请求的安全性和幂等性。对于开发者来说,这是一种非常实用的方法,可以在各种应用场景中发挥作用。

了解草案详细内容:www.ietf.org/archive/id/...

抖音前端架构团队目前放出不少新的 HC ,有看起会的小伙伴可以看看这篇文章:抖音前端架构团队正在寻找人才! FE/Client/Server/QA,25 届校招同学可以直接用内推码:DRZUM5Z,或者加我微信联系。

如果你想加入高质量前端交流群,或者你有任何其他事情想和我交流也可以添加我的个人微信 ConardLi

相关推荐
Lsx-codeShare22 分钟前
前端无感刷新token机制(一文说明白)
前端·javascript·axios
爱米的前端小笔记44 分钟前
前端面试:项目细节重难点问题分享(17)
前端·经验分享·学习·面试·求职招聘
是Yu欸1 小时前
【前端】前端数据转化为后端数据
前端
m0_733881251 小时前
门窗对象检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
前端·yolo
DT——2 小时前
前端基础面试题·第四篇——Vue(其二)
前端·javascript·vue.js
Jiaberrr2 小时前
如何在uniapp(vue2)中使用Vue Router和router-view进行页面管理
前端·javascript·vue.js·uni-app
就叫飞六吧2 小时前
dockerpull
前端·javascript·css·vue.js·css3
我不会画饼鸭2 小时前
vue快速上手
前端·javascript·vue.js
深情废杨杨2 小时前
前端vue-安装pinia,它和vuex的区别
前端·javascript·vue.js
TttHhhYy3 小时前
echarts的option,设置折线图鼠标悬浮显示数据
前端·javascript·echarts