iOS http请求和JSON解析

iOS Networking - 笔记

课程笔记目录:
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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值