0

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

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

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

我试图添加:

res.withParams(... etc )

但我需要返回请求。

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

4

1 回答 1

1

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 是,我在与服务器通信时偷偷添加了这些额外的参数——但额外的参数并没有使它成为一个独特的资源。” 小心你使用的是哪一个。

于 2017-12-02T21:19:49.070 回答