ios - Moya/Alamofire - 具有相同键的 URL 编码参数

标签 ios swift alamofire

我正在使用 Moya构建在 Alamofire 之上的网络层 Swift 框架.

目前,我正在尝试使用具有相同 key 的 URL 编码参数发送请求。

http://some-site/request?param=v1¶m=v2¶m=v3

我已经尝试像这样将这些参数分组到 Set 或 NSSet 或 Array 中,但没有任何方法可以帮助实现预期的结果。

["param": ["v1", "v2", "v3"]];

["param": Set(arrayLiteral: "v1", "v2", "v3")]

Moya 或 Alamofire 本身的任何帮助将不胜感激。

编辑:下面是一些示例代码以提供基本概念:

Api 路由器设置

import Moya

// MARK:- Enum Declaration

enum ApiRouter {
    case XAuth(login: String, password: String)
    case SomeRequest(params: [String])
}

// MARK:- Moya Path

extension ApiRouter: MoyaPath {
    var path: String {
        switch self {
        case .XAuth:
            return "/authorization"
        case .SomeRequest:
            return "/some-request"
        }
    }
}

// MARK:- Moya Target

extension ApiRouter: MoyaTarget {
    private var base: String {
        return "http://some-site"
    }
    var baseURL: NSURL {
        return NSURL(string: base)!
    }

    var parameters: [String: AnyObject] {
        switch self {
        case .XAuth(let login, let password):
            return [
                "email": login,
                "password": password
            ]
        case .SomeRequest(let params):
            return [
                "params": params
            ]
    }

    var method: Moya.Method {
        switch self {
        case .XAuth:
            return .POST
        case .SomeRequest,
            return .GET
        }
    }

    var sampleData: NSData {
        switch self {
        case .XAuth:
            return "{}".dataUsingEncoding(NSUTF8StringEncoding)
        case .ServiceRequests:
            return "{}".dataUsingEncoding(NSUTF8StringEncoding)
        }
    }
}

API 供应商设置

    let endpointsClosure = { (target: ApiRouter) -> Endpoint<ApiRouter> in
    let endpoint = Endpoint<ApiRouter>(
        URL: target.baseURL.URLByAppendingPathComponent(target.path).absoluteString!,
        sampleResponse: EndpointSampleResponse.Success(200, { target.sampleData }),
        method: target.method,
        parameters: target.parameters,
        parameterEncoding: parameterEncoding(target)
    )
    switch target {
    case .XAuth:
        return endpoint
    default:
        let token = "some-token"
        return endpoint.endpointByAddingHTTPHeaderFields(["Authorization": "Bearer: \(token)"])
    }
}

func parameterEncoding(target: ApiRouter) -> Moya.ParameterEncoding {
    switch target {
    case .XAuth:
        return .JSON
    case .SomeRequest:
        return .URL
    }
}

let apiProvider = MoyaProvider(endpointsClosure: endpointsClosure)

apiProvider.request(ApiRouter.SomeRequest(params: ["v1", "v2", "v3"], completion: { (data, statusCode, response, error) in
    /* ... */
})

谢谢。

最佳答案

所以我找到了一个非常简单明了的解决方案。 读书Alamofire的文档我发现了这个:

Since there is no published specification for how to encode collection types, Alamofire follows the convention of appending [] to the key for array values (foo[]=1&foo[]=2), and appending the key surrounded by square brackets for nested dictionary values (foo[bar]=baz).

因此,对于这种情况,有Custom ParameterEncoding 选项,它采用闭包,您可以在其中实际指定您自己的参数形成方式的实现。

Here相同的问题,相同的答案。

关于ios - Moya/Alamofire - 具有相同键的 URL 编码参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31910683/

相关文章:

ios - AVAudioSession红色状态栏,带有路线更改

ios - UITableView 滚动后单元格 UIProgressView 不更新

html - 防止 iOS 上的溢出/橡皮筋滚动

ios - 等待 alamofire 完成获取请求并创建对象

swift - 使用 alamofire 排队

c# - 发送 webRequest 时出错

ios - Firebase 快速登录不正确

ios - 如何创建一个随机的 if else 语句 swift 3

ios - 自定义 UITableViewCell 中的按钮 Segue

swift - Alamofire 抛出 fatal error : unexpectedly found nil while unwrapping an Optional value