在IOS中,每一個Cookie數據都一個NSHTTPCookie對象,那咱們就要手動建立一個NSHTTPCookie對象。ios
let cookie = NSHTTPCookie(properties: [ NSHTTPCookieName:"username", NSHTTPCookieValue:"devonios.com", NSHTTPCookiePath:"/", NSHTTPCookieDomain:"http://devonios.com"])
NSHTTPCookie類有一個構造函數,參數是一個字典類型,只須要提供幾個必須的鍵便可。在DASH中,原話是這麼說的:瀏覽器
To successfully create a cookie, you must provide values for (at least) the NSHTTPCookiePath, NSHTTPCookieName, and NSHTTPCookieValue keys, and either the NSHTTPCookieOriginURL key or the NSHTTPCookieDomain key.安全
很明顯,前三個是必須的,後兩個選一個。NSHTTPCookie提供了預置的常量字符串,咱們在字典的鍵中能夠直接寫。服務器
let NSHTTPCookieComment: String let NSHTTPCookieCommentURL: String let NSHTTPCookieDiscard: String let NSHTTPCookieDomain: String let NSHTTPCookieExpires: String let NSHTTPCookieMaximumAge: String let NSHTTPCookieName: String let NSHTTPCookieOriginURL: String let NSHTTPCookiePath: String let NSHTTPCookiePort: String let NSHTTPCookieSecure: String let NSHTTPCookieValue: String let NSHTTPCookieVersion: String
須要注意的是,若是字典的格式寫錯了,那麼獲得的對象將會是nil。字典的鍵必須都是上面常量中的。cookie
有了NSHTTPCookie對象,咱們就能夠把它交給NSHTTPCookieStorage對象了,它是IOS中專門用來管理Cookie的。網絡
let storage = NSHTTPCookieStorage.sharedHTTPCookieStorage() storage.setCookie(cookie!)
經過SetCookie方法,就能夠把Cookie保存起來。ide
當程序在發送請求時,若是URl正是建立NSHTTPCookie時指定的NSHTTPCookieDomain值時,就會自動發送這個cookie了。函數
能夠寫個簡單循環來讀取下保存的Cookie內容:測試
//讀 //println(storage.cookies?.count) let cookieArray = storage.cookies! for cookie in cookieArray { print("name:\(cookie.name),value:\(cookie.value)") }
===========================================spa
一個http請求中,咱們常常會涉及到Get請求的URL Param,POST請求的HTTP Body,Response Json,這些都是一個標準REST API標配的元素。
在一些安全驗證的API中,一般會涉及到Cookie。當用戶成功登錄後,服務器會在Response Header中寫入一個Set-Cookie字段,用來標識用戶已經登錄(受權)成功,客戶端瀏覽器接收後會把這個Cookie字段保存在客戶端本地。當客戶端再次請求API時,就會在Request Header中帶上這個Cookie值,告訴服務器:嗨,我已經受權過咯,個人cookie值是xxx,我如今要讀取一些信息,請放行~
一個完整的網絡請求,須要先肯定Request URL,帶上參數,而後發送Request,而後接收Response,處理Response Data。
在IOS中,分別對應以下:
//Request URL NSURL //一個完整的Request對象 NSURLRequest //發送請求鏈接的主要操做者 NSURLConnection //包含返回數據的Response NSURLResponse
下面是一個簡單的GET請求代碼:
let request = NSURLRequest(URL: NSURL(string: "http://devonios.com")!) NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (response, nsData, error) -> Void in //處理返回數據nsData }
Paw是一個OS X系統下很是棒的測試HTTP REST API的程序。咱們用它來看看一個Request和Response中的Cookie是如何表現的。
Response中的Cookie:
Paw程序也是很是的智能的,當一個Response中包含了Cookie,會自動保存到默認的Cookie Jar中。
能夠在這裏看到Paw保存的Cookie:
保存的Cookie數據:
Cookie已經保存下來了,那麼當咱們再次發送一個Request時,就會自動帶上Cookie:
你可能會發現,在NSURLRequest和NSURLResponse中並無Cookie相關的方法或者屬性。
不用納悶。由於IOS爲咱們設計了一個獨立的專門用來管理Cookie數據的類:NSHTTPCookieStorage,其中一個Cookie數據對應一個NSHTTPCookie類。
NSHTTPCookie是對一個Cookie數據的封裝,以便咱們讀取Cookie內容。
其實默認狀況下,咱們能夠不用管Cookie的,若是Response中帶有Cookie,IOS會自動調用NSHTTPCookieStorage,把Cookie數據保存下來。當有新的請求時,NSURLRequest會自動帶上相應的Cookie數據。
可是,重點來了,我想讀取下Cookie呢,我想判斷下Cookie值呢?我該如何手動在Request中插入一個Cookie呢?
IOS安全因素,不一樣APP之間是沒法共享Cookie的。
首先咱們要先獲取存放Cookie數據的Storage:
public class func GetCookieStorage()->NSHTTPCookieStorage{ return NSHTTPCookieStorage.sharedHTTPCookieStorage() }
有了Storage獲取Cookie就很簡單了:
public class func GetCookieArray()->[NSHTTPCookie]{ let cookieStorage = GetCookieStorage() let cookieArray = cookieStorage.cookies if let arr = cookieArray{ return cookieArray as! [NSHTTPCookie] } else{ return [] } }
在這個func中,咱們經過使用NSHTTPCookieStorage的cookie對象來獲取全部Cookie,類型是一個包含NSHTTPCookie的Array。
暫停下,NSHTTPCookie是什麼鬼?它有哪些屬性和方法,我讀Cookie值該怎麼寫?別懼怕,這時該是咱們的Dash大神上場啦!
打開咱們的Dash,在左上角輸入NSHTTPCookie,接着就是這樣了:
徹底沒有難度:
/// 獲取Cookie值 public class func GetCookieByName(let cookieName:String)->String? { let cookieArray:[NSHTTPCookie] = GetCookieArray() var value:String? if cookieArray.count > 0 { for cookie in cookieArray { if cookie.name == cookieName { value = cookie.value break } } } return value }
這個func中,咱們經過傳一個cookie名稱,即可以拿到對應的值。
關於IOS中怎麼讀cookie就這樣結束啦,很是的簡單把。