Skip to main content

查询参数

什么是查询参数

查询参数,也叫查询字符串(query string)。

在 URL 地址中,通过 ? 分割,以 键值对 的形式存在,多个查询参数之间通过 & 区分。

查询参数常用于拓展 HTTP 查询能力。

下面我们通过案例来说明 查询参数 的使用。

案例
>>> curl "http://127.0.0.1:8080/query?pageSize=10&pageNum=1&name=pywss"

以上请求中,包含的查询参数有:

  • pageSize:对应值为 10
  • pageNum:对应值为 1
  • name:对应值为 pywss

对于 Pywss 应用来说,它们将转化为键值对数据并存储在字典 ctx.url_params 中。

读取查询参数
>>> print(ctx.url_params)
{
"pageSize": "10",
"pageNum": "1",
"name": "pywss"
}

需要注意的是,Pywss 并没有做任何 类型转化 的操作,你获取到的数据是最原始的 字符串 类型。

但在大多数场景中,我们更希望对他们做类型转化。

比如在此用例中,我们明显可以看出 pageSizepageNum 是属于 int 类型。此时,我们可以借助三方包来解决类型转化与校验问题,此处以 pydantic 举例。

类型转化+校验
import pywss

from pydantic import BaseModel

class HttpGetRequest(BaseModel):
pageSize: int
pageNum: int
name: str

def query(ctx: pywss.Context):
req = HttpGetRequest(**ctx.url_params)

app = pywss.App()
app.get("/query", query)
app.run()

查询参数-重复值

在某些场景下,查询参数可能会存在重复 key 值的情况。比如:

案例
>>> curl "http://127.0.0.1:8080/query?name=pywss&version=v0.1.18&version=v0.1.17"

以上请求中,我们可以看到指定了两个 version 参数。

为什么会有两个version?

或许用户的意思是希望查询 pywss 中 v0.1.18、v0.1.17 这两个版本的信息😵

对于这种情况,Pywss 将原本的字符串类型 str 改成列表 list。从而确保全部的值可以被正确存储。

也就是说在 ctx.url_params 中,你将看到以下值:

读取查询参数
>>> print(ctx.url_params)
{
"name": "pywss",
"version": ["v0.1.18", "v0.1.17"]
}