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