Search code examples
iosswiftalamofirensurlconnection

alamofire is not preparing correct url


I am using alamofire for calling webservice.

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

I am getting below log for the same.

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

Params I am passing as below & they are of type [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"]
]

This return me status code as 400 which means Invalid request.

I don't understand why routes are giving wrong output? Routes are coming as below

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

I was expecting routes to be as below.

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

I idea what I am missing?


Solution

  • Below is what I did

    Swift3

    Remove square brackets for GET request

    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())
    

    Remove square brackets for POST request

    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

    Remove square brackets for GET request

    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)
    

    Remove square brackets for POST request

    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