首页 > 解决方案 > url 路径中的 Alamofire 变量或参数支持

问题描述

Alamofire 是否支持 url 路径中的变量,我已经寻找了一个示例,但我找不到它。我查看了他们的文档和单元测试。使用以下 url 支持编写 api 是很常见的:

http://someapi.com/users/{user}/profile

我在 URLEncoding 中查看了他们的示例,但我找不到上述任何内容,示例似乎只是添加了查询参数。

标签: swiftalamofire

解决方案


Alamofire 依赖于 Foundation URL结构,因此您需要查看那里。

URL 提供了几种不同的机制来构建它们,您可以使用的一种是路径组件,例如:

var url = URL(string: "http://someapi.com/users")
let user = "user"
url?.appendPathComponent(user)
url?.appendPathComponent("profile")

此外,您可以利用枚举进行一些清理,并可能从字符串构造 URL,如下所示:

enum MyURLScheme {
    case profile(user: String)

    var url: URL? {
        switch self {
        case .profile(let user):
            let url = URL(string: "http://someapi.com/users/\(user)/profile")
            return url
        }
    }
}

let profileURL = MyURLScheme.profile(user: "user").url

编辑:您还可以使用 Alamofire Router 类来构建请求,取自此处

enum Router: URLRequestConvertible {
    case search(query: String, page: Int)

    static let baseURLString = "https://example.com"
    static let perPage = 50

    // MARK: URLRequestConvertible

    func asURLRequest() throws -> URLRequest {
        let result: (path: String, parameters: Parameters) = {
            switch self {
            case let .search(query, page) where page > 0:
                return ("/search", ["q": query, "offset": Router.perPage * page])
            case let .search(query, _):
                return ("/search", ["q": query])
            }
        }()

        let url = try Router.baseURLString.asURL()
        let urlRequest = URLRequest(url: url.appendingPathComponent(result.path))

        return try URLEncoding.default.encode(urlRequest, with: result.parameters)
    }
}

Alamofire.request(Router.search(query: "foo bar", page: 1))

推荐阅读