Search code examples
swiftalamofirensurlrequesturlrequest

Encode parameters for URL Request


I created a Router to generate URL Requests.

enum Router: URLRequestConvertible {
    static let baseURLString = "SERVERIP"

    case GetAEDInRange(String) 
    // match URLRequest routes to Alamofire methods
    var URLRequest: NSMutableURLRequest {
        var method: Alamofire.Method {
            switch self {

            case .GetAEDInRange:
                return .GET
            }
        }

        // The output contains the path and parameters like ("aeds", newAED)
        let result: (path: String, parameters: [String: AnyObject]?) = {
            switch self {

            case .GetAEDInRange(let parameters):
                return ("aeds", parameters)
        }()

        // Generate URL Request
        let URL = NSURL(string: Router.baseURLString)!

        // Append the path components from the result
        print(result.path)
        let URLRequest = NSURLRequest(URL: URL.URLByAppendingPathComponent(result.path))

        // Create URLRequest inclunding the encoded parameters
        let encoding = Alamofire.ParameterEncoding.JSON
        let (encodedRequest, _) = encoding.encode(URLRequest, parameters: result.parameters)
        encodedRequest.HTTPMethod = method.rawValue
        return encodedRequest
    }
}

The output I expect is: http://BASEURL/v1/aed?latitude=100&longitude=100

When I use Alamofire to make a GET request with parameters attached, it works fine:

    Alamofire.request(.GET, "http://SERVER/v1/aeds", parameters: parameters).responseJSON { (response) -> Void in
        print(response.result.value)
    }

When I use my router instead, the output is not generated as expected:

    Alamofire.request(Router.GetAEDInRange(parameters)).responseJSON { (response) -> Void in
        print(response.result.value)
    }

When I print the URL String, I get: `http://SERVER/v1/aeds/`` How do I need to change my router? I struggle with the parameter component somehow.


Solution

  • Change this line

    let encoding = Alamofire.ParameterEncoding.JSON
    

    to this:

    let encoding = Alamofire.ParameterEncoding.URLEncodedInURL
    

    To understand the difference between Parameter Encodings in Alamofire take a look here.