iOS上的 HTTP 请求和 JSON 解析

iOS Networking -Udacity的笔记

课程笔记目录:
1.http请求和JSON解析(所在文章)
2.Networking的MVC框架
以上文章的简介:iOS Networking


以下是lesson 1的笔记

目录

  • http请求 和 解析JSON
    • 主要步骤
    • 主要步骤对应的函数
    • 这样步骤的一个解释
    • 检查错误的解释
    • 代码

http请求 和 解析JSON

以下将分成主要的7步来达到目的

主要步骤

1.设置URL参数
2.构建URL
3.设置request
4.设置request后该做的任务
-- 检查错误
---- 1.检查request是否有错误
---- 2.检查发送request后是否成功得到respond
---- 3.检查respond的数据是否为空
-- 5. 解析http request得到的数据为JSON
-- 检查错误
---- 1.检查JSON数据是否有错误
---- 2.检查需要的数据是否为空
-- 6. 使用数据
7.开始发送request

主要步骤对应的函数

1.URL参数字典和escapedParameters(dictionary) //这个是自己定义的函数
2.NSURL(string:)
3.NSMutableURLRequest(URL:)
4.session.dataTaskWithRequest(:completionHandler:)
5.NSJSONSerialization.JSONObjectWithData(
:options:)
6.使用数据
7.NSURLSessionTask.resume()

这步骤的原因

其实反过来思考就可以了。
首先我们要想得到JSON,
就需要用到NSJSONSerialization.JSONObjectWithData(_:options:),而这个函数需要data这个参数。
于是就需要用session.dataTaskWithRequest(_:completionHandler:),而这个函数需要request这个参数。
于是就需要用NSMutableURLRequest(URL:),同理这函数需要URL参数。
于是就要用到NSURL(string:),而这函数需要URL的string参数。
最后就形成了上面的步骤。

检查错误的解释
草图

1.检查request是否填写正确
2.3.通过返回值state code,检查发送是否成功
4.检查返回的数据data是否为空

以下为代码(使用课程上的项目代码)

        /* 1. 设置请求参数 */
        let methodParameters = [
            "api_key": appDelegate.apiKey,
            "request_token": requestToken
        ]
        
        /* 2.构建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.检查发送request后是否成功
                3.检查request得到的数据是否为空
            */
            /* 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? 检查是否 返回的数据是否不为空*/
            guard let data = data else {
                print("No data was returned by the request!")
                return
            }
            
            /* 5. 解析数据为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! 使用数据*/
            self.appDelegate.sessionID = sessionID
            self.getUserID(self.appDelegate.sessionID!)
        }
        
        /* 7. Start the request 开始请求 */
        task.resume()

下一章节将教如何构建框架,使得代码更加重用和使Controller轻便iOS Networking的MVC框架

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • JSON JSON和XML都是需要解析的 JSON是一种轻量级的数据格式,一般用于数据交互服务器返回给客户端的数据...
    JonesCxy阅读 1,838评论 2 10
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,263评论 7 249
  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,652评论 0 15
  • 『正念』是佛教词汇,本书对『正念』的解读是:『对当下的实相保有觉知』。 『正念』是一种让人心平气和地察觉当下、珍惜...
    惜她阅读 3,154评论 1 18