alamofire 准备不正确 url

alamofire is not preparing correct url

我正在使用 alamofire 调用网络服务。

request(url, method: webMethod, parameters: webParams, encoding: URLEncoding.default, headers: headers)
        .validate(statusCode: 200..<300)
        .responseJSON { (response) in
            print("responseresponse===\(response.request)")

我的成绩低于记录。

responseresponse===http://www.mywebsite.com/api/searchFlight?
    adults=3&charter=true&directFlight=true&
    flexibleDays=0&flightClass=PREMIUM_ECONOMY&
    offerLimit=10&refundableOnly=false&
    routes%5B%5D=KWI-BOM%2C2018-08-09&routes%5B%5D=BOM-KWI%2C2018-08-25

我传递的参数如下 & 它们的类型是 [String: Any]

[
    "adults": 3, 
    "directFlight": "true", 
    "flightClass": "PREMIUM_ECONOMY", 
    "refundableOnly": "false", 
    "offerLimit": 10, 
    "flexibleDays": "0", 
    "charter": "true", 
    "routes": ["KWI-BOM,2018-08-09", "BOM-KWI,2018-08-25"]
]

这个 return 我的状态码为 400,表示请求无效。

我不明白为什么路由输出错误?路线如下

routes%5B%5D=KWI-BOM%2C2018-08-09&routes%5B%5D=BOM-KWI%2C2018-08-25
      ^^^^^^                            ^^^^^^

我原以为路线如下。

routes=KWI-BOM%2C2018-08-09&routes=BOM-KWI%2C2018-08-25

我知道我错过了什么吗?

我假设 webmethod 等于 .post 并尝试更改编码:JSONEncoding.default,在这种情况下,请求不会通过 url 发送数据,而是从body 数据。那是因为复杂的数据不能通过url发送。还要尝试验证您的 end-point 收到具有相同 属性 名称的 object 并且类型匹配。我已经用 Alamofire 执行了几个 post 请求,它们按预期工作。

%5B%5D 是 UrlQueryAllowed 编码 []。那是 Alamofire 再次引人注目 - 它看到 routes 参数是一个字典,所以它传递 routes[]=foo&routes[]=bar 而不是 routes=foo&routes=bar 并且你的后端抱怨错误参数(routes 是强制性的?)。不太清楚为什么 Alamofire 会这样做,如果 HTTP 需要一个数组参数在其键的末尾有 [] - 永远不必将数组作为查询参数传递。我只是尝试手动编码 routes 并使用一些定界符传递 routes: <String>

或者更改我的后端以期望 routes[] 而不是 routes。这似乎更容易修复。

下面是我做的

斯威夫特3

移除 GET 请求的方括号

struct CustomGetEncoding: ParameterEncoding {
    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
        var request = try URLEncoding().encode(urlRequest, with: parameters)
        request.url = URL(string: request.url!.absoluteString.replacingOccurrences(of: "%5B%5D=", with: "="))
        return request
    }
}

...

Alamofire.request("http://example.com", method: .get, parameters: ["foo": ["bar1", "bar2"]], encoding: CustomGetEncoding())

移除 POST 请求的方括号

struct CustomPostEncoding: ParameterEncoding {
    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
        var request = try URLEncoding().encode(urlRequest, with: parameters)
        let httpBody = NSString(data: request.httpBody!, encoding: String.Encoding.utf8.rawValue)!
        request.httpBody = httpBody.replacingOccurrences(of: "%5B%5D=", with: "=").data(using: .utf8)
        return request
    }
}

...

Alamofire.request("http://example.com", method: .post, parameters: ["foo": ["bar1", "bar2"]], encoding: CustomPostEncoding())

斯威夫特2

移除 GET 请求的方括号

let parameterEncoding = ParameterEncoding.Custom { requestConvertible, parameters in
    let (mutableRequest, error) = ParameterEncoding.URL.encode(requestConvertible, parameters: parameters)
    mutableRequest.URL = NSURL(string: mutableRequest.URLString.stringByReplacingOccurrencesOfString("%5B%5D=", withString: "="))
    return (mutableRequest, error)
}

Alamofire.request(.GET, "http://example.com", parameters: ["foo": ["bar1", "bar2"]], encoding: parameterEncoding)

移除 POST 请求的方括号

let parameterEncoding = ParameterEncoding.Custom { requestConvertible, parameters in
    let (mutableRequest, error) = ParameterEncoding.URL.encode(requestConvertible, parameters: parameters)
    let httpBody = NSString(data: mutableRequest.HTTPBody!, encoding: NSUTF8StringEncoding)!
    mutableRequest.HTTPBody = httpBody.stringByReplacingOccurrencesOfString("%5B%5D=", withString: "=").dataUsingEncoding(NSUTF8StringEncoding)
    return (mutableRequest, error)
}

Alamofire.request(.POST, "http://example.com", parameters: ["foo": ["bar1", "bar2"]], encoding: parameterEncoding)

Reference