alamofire не готовит правильный URL - PullRequest
0 голосов
/ 07 мая 2018

Я использую 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"]
]

Возвращает код состояния 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

Я представляю, чего мне не хватает?

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

%5B%5D имеет кодировку UrlQueryAllowed []. Это снова удар Alamofire - он видит, что routes param - это словарь, поэтому он передает routes[]=foo&routes[]=bar вместо routes=foo&routes=bar, и ваш бэкэнд жалуется на неправильный параметр (routes является обязательным?). Не совсем уверен, почему Alamofire делает это, и если HTTP требует, чтобы параметры массива имели [] в конце своего ключа - никогда не приходилось передавать массив в качестве параметра запроса. Я бы просто попытался кодировать routes вручную и передать routes: <String> с некоторым разделителем.

Или измените мой бэкэнд, чтобы ожидать routes[] вместо routes. Это кажется легче исправить.

0 голосов
/ 27 мая 2018

Вот что я сделал

Swift3

Снять квадратные скобки для запроса 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())

Swift2

Снять квадратные скобки для запроса 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)

Ссылка

0 голосов
/ 07 мая 2018

Я полагаю, что веб-метод равен .post и пытается изменить его следующим образом: JSONEncoding.default, в этом случае запрос отправляет данные не через URL, а из данных тела.Это потому, что сложные данные не могут быть отправлены через URL.Также попытайтесь проверить, что ваша конечная точка получает объект с такими же именами свойств и что типы совпадают.Я выполнил несколько почтовых запросов с Alamofire, и они работали как ожидалось.

...