標籤:
前言
一個http請求中,我們經常會涉及到Get請求的URL Param,POST請求的HTTP Body,Response Json,這些都是一個標準REST API標配的元素。
在一些安全驗證的API中,通常會涉及到Cookie。當使用者成功登陸後,伺服器會在Response Header中寫入一個Set-Cookie欄位,用來標識使用者已經登陸(授權)成功,用戶端瀏覽器接收後會把這個Cookie欄位儲存在用戶端本地。當用戶端再次請求API時,就會在Request Header中帶上這個Cookie值,告訴伺服器:嗨,我已經授權過咯,我的cookie值是xxx,我現在要讀取一些資訊,請允許存取~
IOS中的網路請求
一個完整的網路請求,需要先確定Request URL,帶上參數,然後發送Request,然後接收Response,處理Response Data。
在IOS中,分別對應如下:
//Request URLNSURL//一個完整的Request對象NSURLRequest//發送請求串連的主要操作者NSURLConnection//包含返回資料的ResponseNSURLResponse
下面是一個簡單的GET請求代碼:
let request = NSURLRequest(URL: NSURL(string: "http://devonios.com")!) NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (response, nsData, error) -> Void in //處理返回資料nsData}
使用Paw程式觀察HTTP請求中的Cookie
Paw是一個OS X系統下非常棒的測試HTTP REST API的程式。我們用它來看看一個Request和Response中的Cookie是如何表現的。
Response中的Cookie:
Paw程式也是非常的智能的,當一個Response中包含了Cookie,會自動儲存到預設的Cookie Jar中。
可以在這裡看到Paw儲存的Cookie:
儲存的Cookie資料:
Cookie已經儲存下來了,那麼當我們再次發送一個Request時,就會自動帶上Cookie:
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的。
NSHTTPCookieStorage讀取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介紹的文章
開啟我們的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就這樣結束啦,非常的簡單把。
參考資料
http://stackoverflow.com/questions/2053568/managing-http-cookies-on-iphone
tips:
本文由wp2osc匯入,原文連結:http://devonios.com/get-cookie.html
由於OSChina的OpenAPI在處理content參數時會自動過濾img標籤,所以無法顯示圖片,詳見。
使用Swift讀取Cookie內容