Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift 2.0, Alamofire: Set cookies in HTTP Post Request

I want to set cookies in my HTTP POST request.

Something like the cookie field in the HTTP Request below,

version: 0.1.7
Cookie: client=Android; version=0.1.7; sellerId=SEL5483318784; key=178a0506-0639-4659-9495-67e5dffa42de
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 1431

How can I achieve this with Alamofire?

My current Alamofire request is like this,

Alamofire.request(.POST, ServerConfig.ADD_PRODUCT_URL, parameters: productJSON, encoding: .JSON, headers: nil)
     .responseJSON(completionHandler: { responseRequest, responseResponse, responseResult in
         print(responseRequest!.URL)
         print(responseResponse)
         print(responseResult)
     })
like image 305
dashbashrumble Avatar asked Oct 12 '15 14:10

dashbashrumble


4 Answers

I had the same problem on a project and I do something like this to solve it:

let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(response.allHeaderFields as! [String: String], forURL: response.URL!)
Alamofire.Manager.sharedInstance.session.configuration.HTTPCookieStorage?.setCookies(cookies, forURL: response.URL!, mainDocumentURL: nil)

You just have to do this one time, because the Alamofire instance is a singleton, so for all the next request the cookie is set.

Hope it's what you are looking for :)

like image 126
Jérémy Magrin Avatar answered Nov 20 '22 08:11

Jérémy Magrin


Swift 3:

I had an array of cookies saved in my UserDefaults and what I did to attach them to the request was:

var request = URLRequest(url: "https://yourURL.com")
if let cookies = cookies as? [HTTPCookie] {
   let headers = HTTPCookie.requestHeaderFields(with: cookies)
   request.allHTTPHeaderFields = headers
}
like image 25
Nati Lara-Diaz Avatar answered Nov 20 '22 10:11

Nati Lara-Diaz


Thanks to Jérémy, I was able to:

Alamofire.request(.POST, url, ...)
    .responseJSON { 
    response in 
    HTTPClient.updateCookies(response)
    ...
}

static func updateCookies(response: Response<AnyObject, NSError>) {
    if let
        headerFields = response.response?.allHeaderFields as? [String: String],
        URL = response.request?.URL {
        let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(headerFields, forURL: URL)
        //print(cookies)
        // Set the cookies back in our shared instance. They'll be sent back with each subsequent request.
        Alamofire.Manager.sharedInstance.session.configuration.HTTPCookieStorage?.setCookies(cookies, forURL: URL, mainDocumentURL: nil)
    }
}

You could very likely make this an extension on Request, so the .storeCookies() call would be part of the .validate().responseJSON() chaining.

like image 32
Graham Perks Avatar answered Nov 20 '22 10:11

Graham Perks


swift 5 and Xcode 11
let cookies = HTTPCookie.cookies(withResponseHeaderFields: response.response?.allHeaderFields as! [String: String], for: (response.response?.url)!)

Alamofire.SessionManager.default.session.configuration.httpCookieStorage?.setCookies(cookies, for: response.response?.url, mainDocumentURL: nil)
like image 1
Ahmad Moussa Avatar answered Nov 20 '22 08:11

Ahmad Moussa