如何使用参数修饰请求?



如何装饰添加到所有请求的所有请求,自定义参数?

我想将参数键添加到所有请求中。

configure("**", description: "auth") {
$0.decorateRequests(with: { (res, req) -> Request in
?? what to add here?
})
}

我试图添加:

res.withParams(... etc )

但是我需要返回请求。

在文档中的示例中,它只向正文添加标头而不是参数。

decorateRequests是错误的API。其目的是添加或围绕已经完全形成的请求的行为,而不是更改请求本身。

您正在寻找的是mutateRequests,它允许您在 Siesta 控制它之前更改原始URLRequest的任何部分(包括 URL 本身,其中包括参数)。

不幸的是,URLRequest用于处理参数的 Obj-C 时代 API 有点麻烦——但它可以完成这项工作。如果要向所有请求添加foo=bar,并且无论URL是否已具有HTTP参数,都希望正常工作,则最安全的方法是将URL分解为其组件,为foo=bar添加新URLQueryItem,然后重建URL:

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 的新资源,该 URL 在逻辑上与resource不同,可以具有不同的最新数据、正在进行的不同请求等。另一方面,mutateRequests基本上是说,"无论你认为URL是什么,我在与服务器交谈时都会偷偷添加这些额外的参数 - 但额外的参数并不能使其成为独特的资源。小心你使用的是哪一个。

相关内容

  • 没有找到相关文章

最新更新