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框架