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

相关推荐
程序员码歌2 小时前
短思考第261天,浪费时间的十个低效行为,看看你中了几个?
前端·ai编程
Swift社区2 小时前
React Navigation 生命周期完整心智模型
前端·react.js·前端框架
若梦plus2 小时前
从微信公众号&小程序的SDK剖析JSBridge
前端
用泥种荷花3 小时前
Python环境安装
前端
Light603 小时前
性能提升 60%:前端性能优化终极指南
前端·性能优化·图片压缩·渲染优化·按需拆包·边缘缓存·ai 自动化
Jimmy3 小时前
年终总结 - 2025 故事集
前端·后端·程序员
烛阴3 小时前
C# 正则表达式(2):Regex 基础语法与常用 API 全解析
前端·正则表达式·c#
roman_日积跬步-终至千里3 小时前
【人工智能导论】02-搜索-高级搜索策略探索篇:从约束满足到博弈搜索
java·前端·人工智能
GIS之路4 小时前
GIS 数据转换:使用 GDAL 将 TXT 转换为 Shp 数据
前端
多看书少吃饭4 小时前
从Vue到Nuxt.js
前端·javascript·vue.js