查询参数
什么是查询参数
查询参数,也叫查询字符串(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 并没有做任何 类型转化 的操作,你获取到的数据是最原始的 字符串 类型。
但在大多数场景中,我们更希望对他们做类型转化。
比如在此用例中,我们明显可以看出 pageSize 和 pageNum 是属于 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"]
}