decorateRequests
是错误的 API。它的目的是添加或包围已经完全形成的请求的行为,而不是改变请求本身。
您正在寻找的是mutateRequests
,它允许您在 Siesta 控制它之前更改原始的任何部分URLRequest
(包括 URL 本身,其中包括参数)。
不幸的是,URLRequest
用于处理参数的 Obj-C-era API 有点麻烦——但它可以完成这项工作。如果要添加foo=bar
到所有请求,并且无论 URL 是否已具有 HTTP 参数,都希望它能够正常工作,最安全的方法是将 URL 分解为其组件,添加一个新URLQueryItem
的 for foo=bar
,然后重建网址:
service.configure {
$0.mutateRequests { req in
guard
let url = req.url,
var components = URLComponents(url: url, resolvingAgainstBaseURL: true)
else {
return
}
components.queryItems =
(components.queryItems ?? [])
+ [URLQueryItem(name: "foo", value: "bar")]
req.url = components.url
}
}
请注意,这是在一组资源中全局添加查询参数的正确方法,覆盖它们各自的逻辑 URL。听起来这确实是您所追求的。
但是,如果您(或任何其他阅读本文的人)想要创建一个资源,其 URL 恰好具有查询参数,这些参数是使其独特的一部分 - 更常见的用例 - 那么resource.withParam(…)
使用正确的方法。
这些方法之间存在细微差别:resource.withParam("foo", "bar")
返回具有不同 URL 的新资源,在逻辑上与 不同resource
,可以具有不同的最新数据、正在进行的不同mutateRequests
请求等。 URL 是,我在与服务器通信时偷偷添加了这些额外的参数——但额外的参数并没有使它成为一个独特的资源。” 小心你使用的是哪一个。