iOS上的 HTTP 請(qǐng)求和 JSON 解析

iOS Networking -Udacity的筆記

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


以下是lesson 1的筆記

目錄

  • http請(qǐng)求 和 解析JSON
    • 主要步驟
    • 主要步驟對(duì)應(yīng)的函數(shù)
    • 這樣步驟的一個(gè)解釋
    • 檢查錯(cuò)誤的解釋
    • 代碼

http請(qǐng)求 和 解析JSON

以下將分成主要的7步來達(dá)到目的

主要步驟

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

主要步驟對(duì)應(yīng)的函數(shù)

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

這步驟的原因

其實(shí)反過來思考就可以了。
首先我們要想得到JSON,
就需要用到NSJSONSerialization.JSONObjectWithData(_:options:),而這個(gè)函數(shù)需要data這個(gè)參數(shù)。
于是就需要用session.dataTaskWithRequest(_:completionHandler:),而這個(gè)函數(shù)需要request這個(gè)參數(shù)。
于是就需要用NSMutableURLRequest(URL:),同理這函數(shù)需要URL參數(shù)。
于是就要用到NSURL(string:),而這函數(shù)需要URL的string參數(shù)。
最后就形成了上面的步驟。

檢查錯(cuò)誤的解釋
草圖

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

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

        /* 1. 設(shè)置請(qǐng)求參數(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.設(shè)置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.設(shè)置request后該做的任務(wù) */
        let task = session.dataTaskWithRequest(request) { (data, response, error) in
            
            /* 以下會(huì)有三段檢查 
                1.檢查request是否有錯(cuò)
                2.檢查發(fā)送request后是否成功
                3.檢查request得到的數(shù)據(jù)是否為空
            */
            /* GUARD: Was there an error?  檢查錯(cuò)誤*/
            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 請(qǐng)后 返回的status code,驗(yàn)證是否請(qǐng)求成功 */
            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是否有錯(cuò)誤 */
            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? 檢查是否有哪個(gè)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 開始請(qǐng)求 */
        task.resume()

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容