2015-10-12 16 views
9

Tôi muốn đặt cookie trong yêu cầu HTTP POST của mình.Swift 2.0, Alamofire: Đặt cookie trong Yêu cầu bài đăng HTTP

Something như lĩnh vực cookie trong Yêu cầu HTTP dưới đây,

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 

Làm thế nào tôi có thể đạt được điều này với Alamofire?

yêu cầu Alamofire hiện tại của tôi là như thế này,

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

Trả lời

17

tôi đã cùng một vấn đề trên một dự án và tôi làm điều gì đó như thế này để giải quyết nó:

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) 

Bạn chỉ cần phải làm điều này một lần, bởi vì cá thể Alamofire là một singleton, vì vậy cho tất cả các yêu cầu tiếp theo, cookie được thiết lập.

Hy vọng đó là những gì bạn đang tìm kiếm :)

1

Nhờ Jérémy, tôi đã có thể:

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

Bạn rất có khả năng có thể làm cho này một phần mở rộng theo yêu cầu, vì vậy .storeCookies() cuộc gọi sẽ là một phần của chuỗi .validate(). responseJSON().

2

Swift 3:

Tôi đã có một loạt các cookie lưu trong UserDefaults của tôi và những gì tôi đã làm để đính kèm chúng vào các yêu cầu là:

var request = URLRequest(url: "https://yourURL.com") 
if let cookies = cookies as? [HTTPCookie] { 
    let headers = HTTPCookie.requestHeaderFields(with: cookies) 
    request.allHTTPHeaderFields = headers 
} 
Các vấn đề liên quan