如何装饰添加到所有请求,自定义参数的所有请求?
我想将param键添加到所有请求中。
configure("**", description: "auth") {
$0.decorateRequests(with: { (res, req) -> Request in
?? what to add here?
})
}
我试图添加:
res.withParams(... etc )
但我需要退回请求。
在doc的示例中,它只向主体添加头而不是参数。
答案 0 :(得分:1)
decorateRequests
是错误的API。其目的是添加或包围已完全形成的请求的行为,而不是更改请求本身。
您正在寻找的是mutateRequests
,它允许您在Siesta控制它之前更改原始URLRequest
的任何部分(包括URL本身,其中包括参数)。
不幸的是,URLRequest
用于处理params的Obj-C时代API有点麻烦 - 但它可以完成这项工作。如果要向所有请求添加foo=bar
,并且如果您希望该URL能够正常工作,无论URL是否已具有HTTP参数,最安全的方法是将URL分解为其组件,添加新的URLQueryItem
为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")
返回新资源,其中包含不同于resource
的不同网址,该网址可能包含不同的最新数据,不同正在进行的请求等等。另一方面,mutateRequests
基本上说,“无论你认为是什么,我在与服务器交谈时秘密添加这些额外的参数 - 但额外的params不会使它成为一种独特的资源。“小心你正在使用哪一种。