如何将 ParameterEncoding 与 URLRequestConvertible 一起使用?

How to use `ParameterEncoding` together with `URLRequestConvertible`?

我正在将我的代码迁移到 Swift 3 并将 Alamofire 更新到 swift 3 分支。 在那里,处理参数编码的建议方法是使用一种新的 ParameterEncoding 符合结构,例如 URLEncoding,它有一个 encode 方法。

问题是这个方法现在 throws,这是有道理的,但是 URLRequestConvertible 协议仍然期望 urlRequest 属性 return 是构建的请求,所以我们不能只调用 encode 和 return 结果,也不能 return 为 nil。

如果路由器不会发生故障,建议的处理方法是什么?

这就是 Alamofire 内部处理它的方式:

open func request(
    _ urlString: URLStringConvertible,
    method: HTTPMethod = .get,
    parameters: Parameters? = nil,
    encoding: ParameterEncoding = URLEncoding.default,
    headers: [String: String]? = nil)
    -> DataRequest
{
    let urlRequest = URLRequest(urlString: urlString, method: method, headers: headers)

    do {
        let encodedURLRequest = try encoding.encode(urlRequest, with: parameters)
        return request(resource: encodedURLRequest)
    } catch {
        let request = self.request(resource: urlRequest)
        request.delegate.error = error
        return request
    }
}

基本上就是使用不带参数的request。我不知道它可以在您自己的实现(或 的 OP)中使用多远。 如果不可能,我建议向 Alamofire 提出问题。新的 ParameterEncoding 实际上已经存在两天 (PR 1465),并且仍处于 4.0.0 测试版周期。 在任何情况下,如果您设置自己的 URLRequest,使用 URLEncoding.encode() 很少会失败,因为抛出的唯一错误是请求中没有提供 URL。

编辑:给您,4.0.0 已发布,问题已解决! (PR 1505)。 URLRequestConvertible 还有其他更改,但所有更改都在迁移指南和自述文件中。