iOS上的 HTTP 請求和 JSON 解析

iOS Networking -Udacity的筆記

課程筆記目錄:
1.http請求和JSON解析(所在文章)
2.Networking的MVC框架
以上文章的簡介:iOS Networking


以下是lesson 1的筆記

目錄

  • http請求 和 解析JSON
    • 主要步驟
    • 主要步驟對應的函數(shù)
    • 這樣步驟的一個解釋
    • 檢查錯誤的解釋
    • 代碼

http請求 和 解析JSON

以下將分成主要的7步來達到目的

主要步驟

1.設置URL參數(shù)
2.構(gòu)建URL
3.設置request
4.設置request后該做的任務
-- 檢查錯誤
---- 1.檢查request是否有錯誤
---- 2.檢查發(fā)送request后是否成功得到respond
---- 3.檢查respond的數(shù)據(jù)是否為空
-- 5. 解析http request得到的數(shù)據(jù)為JSON
-- 檢查錯誤
---- 1.檢查JSON數(shù)據(jù)是否有錯誤
---- 2.檢查需要的數(shù)據(jù)是否為空
-- 6. 使用數(shù)據(jù)
7.開始發(fā)送request

主要步驟對應的函數(shù)

1.URL參數(shù)字典和escapedParameters(dictionary) //這個是自己定義的函數(shù)
2.NSURL(string:)
3.NSMutableURLRequest(URL:)
4.session.dataTaskWithRequest(:completionHandler:)
5.NSJSONSerialization.JSONObjectWithData(
:options:)
6.使用數(shù)據(jù)
7.NSURLSessionTask.resume()

這步驟的原因

其實反過來思考就可以了。
首先我們要想得到JSON铺然,
就需要用到NSJSONSerialization.JSONObjectWithData(_:options:),而這個函數(shù)需要data這個參數(shù)率拒。
于是就需要用session.dataTaskWithRequest(_:completionHandler:)溜族,而這個函數(shù)需要request這個參數(shù)忘渔。
于是就需要用NSMutableURLRequest(URL:),同理這函數(shù)需要URL參數(shù)族沃。
于是就要用到NSURL(string:)渠牲,而這函數(shù)需要URL的string參數(shù)旋炒。
最后就形成了上面的步驟。

檢查錯誤的解釋
草圖

1.檢查request是否填寫正確
2.3.通過返回值state code签杈,檢查發(fā)送是否成功
4.檢查返回的數(shù)據(jù)data是否為空

以下為代碼(使用課程上的項目代碼)

        /* 1. 設置請求參數(shù) */
        let methodParameters = [
            "api_key": appDelegate.apiKey,
            "request_token": requestToken
        ]
        
        /* 2.構(gòu)建URL  */
        let urlString = appDelegate.baseURLSecureString + "authentication/session/new" + appDelegate.escapedParameters(methodParameters)
        let url = NSURL(string: urlString)!
        
        /* 3.設置request  */
        let request = NSMutableURLRequest(URL: url)
        request.addValue("application/json", forHTTPHeaderField: "Accept")

        /*如果是POST method
        let request = NSMutableURLRequest(URL: url)
        request.HTTPMethod = "POST"
        
        request.addValue("application/json", forHTTPHeaderField: "Accept")
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        
        request.HTTPBody = "{\"media_type\":\"movie\",\"media_id\":\(self.movie!.id),\"favorite\":true}".dataUsingEncoding(NSUTF8StringEncoding)
        */
        
        /* 4.設置request后該做的任務 */
        let task = session.dataTaskWithRequest(request) { (data, response, error) in
            
            /* 以下會有三段檢查 
                1.檢查request是否有錯
                2.檢查發(fā)送request后是否成功
                3.檢查request得到的數(shù)據(jù)是否為空
            */
            /* GUARD: Was there an error?  檢查錯誤*/
            guard (error == nil) else {
                dispatch_async(dispatch_get_main_queue()) {
                    self.debugTextLabel.text = "Login Failed (Session ID)."
                }
                print("There was an error with your request: \(error)")
                return
            }
            
            /* GUARD: Did we get a successful 2XX response? 檢查http 請后 返回的status code国葬,驗證是否請求成功 */
            guard let statusCode = (response as? NSHTTPURLResponse)?.statusCode where statusCode >= 200 && statusCode <= 299 else {
                if let response = response as? NSHTTPURLResponse {
                    print("Your request returned an invalid response! Status code: \(response.statusCode)!")
                } else if let response = response {
                    print("Your request returned an invalid response! Response: \(response)!")
                } else {
                    print("Your request returned an invalid response!")
                }
                return
            }
            
            /* GUARD: Was there any data returned? 檢查是否 返回的數(shù)據(jù)是否不為空*/
            guard let data = data else {
                print("No data was returned by the request!")
                return
            }
            
            /* 5. 解析數(shù)據(jù)為JSON格式 */
            let parsedResult: AnyObject!
            do {
                parsedResult = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments)
            } catch {
                parsedResult = nil
                print("Could not parse the data as JSON: '\(data)'")
                return
            }
            
            /* GUARD: Did TheMovieDB return an error? 返回的JSON是否有錯誤 */
            guard (parsedResult.objectForKey("status_code") == nil) else {
                print("TheMovieDB returned an error. See the status_code and status_message in \(parsedResult)")
                return
            }
            
            /* GUARD: Is the "sessionID" key in parsedResult? 檢查是否有哪個key */
            guard let sessionID = parsedResult["session_id"] as? String else {
                dispatch_async(dispatch_get_main_queue()) {
                    self.debugTextLabel.text = "Login Failed (Session ID)."
                }
                print("Cannot find key 'sessionID' in \(parsedResult)")
                return
            }
            
            /* 6. Use the data! 使用數(shù)據(jù)*/
            self.appDelegate.sessionID = sessionID
            self.getUserID(self.appDelegate.sessionID!)
        }
        
        /* 7. Start the request 開始請求 */
        task.resume()

下一章節(jié)將教如何構(gòu)建框架,使得代碼更加重用和使Controller輕便iOS Networking的MVC框架

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芹壕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子接奈,更是在濱河造成了極大的恐慌踢涌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件序宦,死亡現(xiàn)場離奇詭異睁壁,居然都是意外死亡,警方通過查閱死者的電腦和手機互捌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門潘明,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秕噪,你說我怎么就攤上這事钳降。” “怎么了腌巾?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵遂填,是天一觀的道長。 經(jīng)常有香客問我澈蝙,道長吓坚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任灯荧,我火速辦了婚禮礁击,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逗载。我一直安慰自己哆窿,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布撕贞。 她就那樣靜靜地躺著更耻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捏膨。 梳的紋絲不亂的頭發(fā)上秧均,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天食侮,我揣著相機與錄音,去河邊找鬼目胡。 笑死锯七,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的誉己。 我是一名探鬼主播眉尸,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼巨双!你這毒婦竟也來了噪猾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤筑累,失蹤者是張志新(化名)和其女友劉穎袱蜡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慢宗,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡坪蚁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了镜沽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敏晤。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缅茉,靈堂內(nèi)的尸體忽然破棺而出嘴脾,到底是詐尸還是另有隱情,我是刑警寧澤蔬墩,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布统阿,位于F島的核電站,受9級特大地震影響筹我,放射性物質(zhì)發(fā)生泄漏扶平。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一蔬蕊、第九天 我趴在偏房一處隱蔽的房頂上張望结澄。 院中可真熱鬧,春花似錦岸夯、人聲如沸麻献。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勉吻。三九已至,卻和暖如春旅赢,著一層夾襖步出監(jiān)牢的瞬間齿桃,已是汗流浹背惑惶。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留短纵,地道東北人带污。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像香到,于是被迫代替她去往敵國和親鱼冀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理悠就,服務發(fā)現(xiàn)千绪,斷路器,智...
    卡卡羅2017閱讀 134,699評論 18 139
  • JSON JSON和XML都是需要解析的 JSON是一種輕量級的數(shù)據(jù)格式梗脾,一般用于數(shù)據(jù)交互服務器返回給客戶端的數(shù)據(jù)...
    JonesCxy閱讀 1,862評論 2 10
  • Swift版本點擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,414評論 7 249
  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 13,785評論 0 15
  • 『正念』是佛教詞匯鹉究,本書對『正念』的解讀是:『對當下的實相保有覺知』宇立。 『正念』是一種讓人心平氣和地察覺當下、珍惜...
    惜她閱讀 3,217評論 1 18