如何用参数装饰请求?

时间:2017-11-24 16:43:33

标签: siesta-swift

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

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

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

我试图添加:

res.withParams(... etc )

但我需要退回请求。

在doc的示例中,它只向主体添加头而不是参数。

1 个答案:

答案 0 :(得分:1)

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

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

不幸的是,URLRequest用于处理params的Obj-C时代API有点麻烦 - 但它可以完成这项工作。如果要向所有请求添加foo=bar,并且如果您希望该URL能够正常工作,无论URL是否已具有HTTP参数,最安全的方法是将URL分解为其组件,添加新的URLQueryItemfoo=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不会使它成为一种独特的资源。“小心你正在使用哪一种。