Swift 2.0, Alamofire: Set cookies in HTTP Post Request

前端 未结 4 557
长情又很酷
长情又很酷 2021-02-14 00:48

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=         


        
相关标签:
4条回答
  • 2021-02-14 01:23

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

    0 讨论(0)
  • 2021-02-14 01:30

    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
    }
    
    0 讨论(0)
  • 2021-02-14 01:39

    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.

    0 讨论(0)
  • 2021-02-14 01:42

    iOS 11 & Alamofire 4

    let webDataStore = webView.configuration.websiteDataStore
    webDataStore.httpCookieStore.getAllCookies { (cookies) in
        Alamofire.SessionManager.default.session.configuration.httpCookieStorage?.setCookies(
            cookies,
            for: url,
            mainDocumentURL: nil
        )
    }
    
    0 讨论(0)
提交回复
热议问题