Search code examples
swiftpostheaderafnetworkingalamofire

How to use Alamofire with custom headers for POST request


I implemented a POST request with Alamofire with a custom header, because we work with OAuth2 and we have to send an access token in every request inside the header. In this case I have to use a custom header.

The access token value for the HTTP header field Authorization does not work for me. The server generates an error because the header information for OAuth with the access token is not available.

But what is the mistake in my code?

Here is my current code:

let URL =  NSURL(string: url + "/server/rest/action")
var mutableURLRequest = NSMutableURLRequest(URL: URL!)
mutableURLRequest.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")

//this method does not work anymore because it returns an error in the response
//Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders = ["Authorization": "Bearer \(accessToken)"]

Alamofire.Manager.sharedInstance
    .request(.POST, mutableURLRequest, parameters: parameters, encoding: .JSON)
    .validate()
    .responseJSON {
                (request, response, data, error) -> Void in

                NSLog("REQUEST: \(request)")
                NSLog("RESPONSE: \(response)")
                NSLog("DATA: \(data)")
                NSLog("ERROR: \(error)")
    }

Solution

  • Here's an example of how I use it with custom headers:

        var manager = Manager.sharedInstance
        // Specifying the Headers we need
        manager.session.configuration.HTTPAdditionalHeaders = [
            "Content-Type": "application/x-www-form-urlencoded",
            "Accept": "application/vnd.lichess.v1+json",
            "X-Requested-With": "XMLHttpRequest",
            "User-Agent": "iMchess"
        ]
    

    Now whenever you make a request, it'll use the specified headers.

    Your code refactored: remember to import Alamofire

        let aManager = Manager.sharedInstance
        manager.session.configuration.HTTPAdditionalHeaders = [
            "Authorization": "Bearer \(accessToken)" ]
    
        let URL =  url + "/server/rest/action"
    
        request(.POST, URL, encoding: .JSON)
            .responseJSON {
                (request, response, data, error) -> Void in
    
                println("REQUEST: \(request)")
                println("RESPONSE: \(response)")
                println("DATA: \(data)")
                println("ERROR: \(error)")
        }
    

    This is request signature request(method: Method, URLString: URLStringConvertible>, parameters: [String : AnyObject]?, encoding: ParameterEncoding)

    As you can see you don't have to pass an NSURL in it, just the string of the URL, Alamofire takes care of the rest.