跳到主要内容

QueryParams

名称区分大小写,保留重复值和插入顺序。查询字符串解析百分号转义,并将 + 解释为空格。

import req


def main() raises:
var params = req.QueryParams("tag=mojo&tag=http")
params.set("q", "hello world")
print(params.get_all("tag"))
print(params.encode())
print(params.encode(form=True))

QueryParams()​

构造空映射;唯一键使用 Dict[String, String],重复值使用 List[Tuple[String, String]]。String 重载解析不带前导 ? 的查询字符串;没有 = 的键取空值,空字符串创建空映射。错误的百分号转义抛出 InvalidURL;解码后不是有效 UTF-8 时抛出 DecodeError。

def __init__(out self)

def __init__(out self, pairs: StringPairs) raises HTTPError

def __init__(out self, pairs: Dict[String, String]) raises HTTPError

def __init__(out self, query: String) raises HTTPError

get​

返回第一个匹配值的 Optional[String],不存在则为 None。存在的空值是 Some(""),不是 None。需要重复值时使用 get_all()。

def get(self, name: String) -> Optional[String]
var page = params.get("page")
if page:
print(page.value())

get_all​

按存储顺序返回所有匹配值的新 List[String],名称不存在时返回空列表;返回列表是副本。

def get_all(self, name: String) -> List[String]
for tag in params.get_all("tag"):
print(tag)

params[name]​

通过名称下标访问第一个 String 值。名称不存在时抛出 InvalidRequest,与返回 None 的 get() 不同。

def __getitem__(self, name: String) raises HTTPError -> String
print(params["q"])

name in params​

表达式 name in mapping 返回 Bool,判断是否存在匹配名称,包括值为空的字段。

def __contains__(self, name: String) -> Bool
print("q" in params)

len(params)​

len(mapping) 统计存储的键值对数量,包括重复项,不是不同名称的数量。

def __len__(self) -> Int
print(len(params))

items​

按插入顺序返回复制的 List[Tuple[String, String]],可枚举字段而不丢失重复值。修改返回列表不会修改原映射。

def items(self) -> StringPairs
for pair in params.items():
print(pair[0], pair[1])

add​

追加新键值对,不删除旧值,适用于协议或接口允许重复字段的场景。值按解码后的字符串保存,序列化时才编码。

def add(mut self, name: String, value: String) raises HTTPError
params.add("tag", "mojo")
params.add("tag", "http")

set​

将所有匹配值替换成一个键值对。替换项占据第一个匹配项的位置;新名称追加到末尾,无返回值。

def set(mut self, name: String, value: String) raises HTTPError
params.set("page", "2")

remove​

删除所有匹配的键值对。名称不存在时不做操作,无返回值,不因缺失抛错。

def remove(mut self, name: String)
params.remove("page")

merge​

按名称合并另一映射:删除本映射中对应名称的现有值,再按顺序追加对方该名称的所有值。对方没有的名称保留;这不是无条件拼接所有键值对。

def merge(mut self, other: Self) raises HTTPError
params.merge(req.QueryParams({"page": "3"}))

encode​

序列化为百分号编码的查询 String。form=False 时空格为 %20;form=True 时空格为 +,用于 application/x-www-form-urlencoded 请求体。重复值分别输出,空映射返回空字符串,不添加前导 ?。

def encode(self, *, form: Bool = False) -> String
var search = req.QueryParams({"q": "hello world"})
print(search.encode())
print(search.encode(form=True))

String(params)​

Writable 序列化采用 encode(form=False),明确需要表单编码时使用 encode(form=True)。

def write_to(self, mut writer: Some[Writer])