1.網(wǎng)絡基礎
- 1.1 網(wǎng)絡基礎
001 網(wǎng)絡基本概念
1-1 客戶端(就是手機或者ipad等手持設備上面的APP)
1-2 服務器(遠程服務器-本地服務器)
1-3 請求(客戶端索要數(shù)據(jù)的方式)
1-4 響應(需要客戶端解析數(shù)據(jù))
1-5 數(shù)據(jù)庫(服務器的數(shù)據(jù)從哪里來)
-
1.2 Http
001 URL 1-1 如何找到服務器(通過一個唯一的URL) 1-2 URL介紹 a. 統(tǒng)一資源定位符 b. url格式(協(xié)議\主機地址\路徑) 協(xié)議:不同的協(xié)議,代表著不同的資源查找方式怎诫、資源傳輸方式 主機地址:存放資源的主機(服務器)的IP地址(域名) 路徑:資源在主機(服務器)中的具體位置 1-3 請求協(xié)議 【file】訪問的是本地計算機上的資源腊凶,格式是file://(不用加主機地址) 【ftp】訪問的是共享主機的文件資源谜酒,格式是ftp:// 【mailto】訪問的是電子郵件地址驹暑,格式是mailto: 【http】超文本傳輸協(xié)議瓷们,訪問的是遠程的網(wǎng)絡資源界牡,格式是http://(網(wǎng)絡請求中最常用的協(xié)議) 002 http協(xié)議 2-1 http協(xié)議簡單介紹 a.超文本傳輸協(xié)議 b.規(guī)定客戶端和服務器之間的數(shù)據(jù)傳輸格式 c.讓客戶端和服務器能有效地進行數(shù)據(jù)溝通 2-2 http協(xié)議優(yōu)缺點 a.簡單快速(協(xié)議簡單,服務器端程序規(guī)模小碑诉,通信速度快) b.靈活(允許傳輸各種數(shù)據(jù)) c.非持續(xù)性連接(1.1之前版本是非持續(xù)的,即限制每次連接只處理一個請求德挣,服務器對客戶端的請求做出響應后快毛,馬上斷開連接,這種方式可以節(jié)省傳輸時間) 2-3 基本通信過程 a.請求:客戶端向服務器索要數(shù)據(jù) b.響應:服務器返回客戶端相應的數(shù)據(jù) 003 GET和POST請求 3-1 http里面發(fā)送請求的方法 GET(常用)唠帝、POST(常用)、OPTIONS贴铜、HEAD瀑晒、PUT、DELETE苔悦、TRACE、CONNECT灾挨、PATCH 3-2 GET和POST請求的對比【區(qū)別在于參數(shù)如何傳遞】 GET 在請求URL后面以?的形式跟上發(fā)給服務器的參數(shù),多個參數(shù)之間用&隔開劳澄,比如 http://ww.baidi.com/login?username=123&pwd=234&type=JSON 由于瀏覽器和服務器對URL長度有限制,因此在URL后面附帶的參數(shù)是有限制的秒拔,通常不能超過1KB POST 發(fā)給服務器的參數(shù)全部放在請求體中 理論上砂缩,POST傳遞的數(shù)據(jù)量沒有限制(具體還得看服務器的處理能力) 3-3 如何選擇【除簡單數(shù)據(jù)查詢外,其它的一律使用POST請求】 a.如果要傳遞大量數(shù)據(jù)庵芭,比如文件上傳,只能用POST請求 b.GET的安全性比POST要差些眨唬,如果包含機密\敏感信息好乐,建議用POST c.如果僅僅是索取數(shù)據(jù)(數(shù)據(jù)查詢),建議使用GET d.如果是增加岭妖、修改反璃、刪除數(shù)據(jù),建議使用POST 004 iOS中發(fā)送http請求的方案 4-1 蘋果原生 NSURLConnection 03年推出的古老技術 NSURLSession 13年推出iOS7之后淮蜈,以取代NSURLConnection【重點】 CFNetwork 底層技術、C語言的 4-2 第三方框架 ASIHttpRequest AFNetworking 【重點】 MKNetworkKit 005 http請求通信過程 5-1 請求 【包括請求頭+請求體·非必選】 5-2 響應 【響應頭+響應體】 5-3 通信過程 a.發(fā)送請求的時候把請求頭和請求體(請求體是非必須的)包裝成一個請求對象 b.服務器端對請求進行響應蜻韭,在響應信息中包含響應頭和響應體柿扣,響應信息是對服務器端的描述,具體的信息放在響應體中傳遞給客戶端 5-4 狀態(tài)碼 【200】:請求成功 【400】:客戶端請求的語法錯誤俯画,服務器無法解析 【404】:無法找到資源 【500】:服務器內(nèi)部錯誤司草,無法完成請求
2.NSURLConnection使用
- 2.1 NSURLConnection同步請求(GET)
(1)步驟
01 設置請求路徑
02 創(chuàng)建請求對象(默認是GET請求泡仗,且已經(jīng)默認包含了請求頭)
03 使用NSURLSession sendsync方法發(fā)送網(wǎng)絡請求
04 接收到服務器的響應后猜憎,解析響應體
(2)相關代碼
//1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=nume&pwd=key&type=XML"];
// NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"];
//2.創(chuàng)建一個請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.把請求發(fā)送給服務器
//sendSynchronousRequest 阻塞式的方法,會卡住線程
NSHTTPURLResponse *response = nil;
NSError *error = nil;
/*
第一個參數(shù):請求對象
第二個參數(shù):響應頭信息截亦,當該方法執(zhí)行完畢之后柬讨,該參數(shù)被賦值
第三個參數(shù):錯誤信息,如果請求失敗却桶,則error有值
*/
//該方法是阻塞式的蔗牡,會卡住線程
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
//4.解析服務器返回的數(shù)據(jù)
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
- 2.2 NSURLConnection異步請求(GET-SendAsync)
(1)相關說明
01 該方法不會卡住當前線程,網(wǎng)絡請求任務是異步執(zhí)行的
(2)相關代碼
//1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=nume&pwd=key"];
//2.創(chuàng)建一個請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.把請求發(fā)送給服務器,發(fā)送一個異步請求
/*
第一個參數(shù):請求對象
第二個參數(shù):回調(diào)方法在哪個線程中執(zhí)行蛋逾,如果是主隊列則block在主線程中執(zhí)行窗悯,非主隊列則在子線程中執(zhí)行
第三個參數(shù):completionHandlerBlock塊:接受到響應的時候執(zhí)行該block中的代碼
response:響應頭信息
data:響應體
connectionError:錯誤信息蒋院,如果請求失敗,那么該參數(shù)有值
*/
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {
//4.解析服務器返回的數(shù)據(jù)
NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//轉換并打印響應頭信息
NSHTTPURLResponse *r = (NSHTTPURLResponse *)response;
NSLog(@"--%zd---%@--",r.statusCode,r.allHeaderFields);
}];
- 2.3 NSURLConnection異步請求(GET-代理)
(1)步驟
01 確定請求路徑
02 創(chuàng)建請求對象
03 創(chuàng)建NSURLConnection對象并設置代理
04 遵守NSURLConnectionDataDelegate協(xié)議欺旧,并實現(xiàn)相應的代理方法
05 在代理方法中監(jiān)聽網(wǎng)絡請求的響應
(2)設置代理的幾種方法
/*
設置代理的第一種方式:自動發(fā)送網(wǎng)絡請求
[[NSURLConnection alloc]initWithRequest:request delegate:self];
*/
/*
設置代理的第二種方式:
第一個參數(shù):請求對象
第二個參數(shù):誰成為NSURLConnetion對象的代理
第三個參數(shù):是否馬上發(fā)送網(wǎng)絡請求辞友,如果該值為YES則立刻發(fā)送栅哀,如果為NO則不會發(fā)送網(wǎng)路請求
NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
//調(diào)用該方法控制網(wǎng)絡請求的發(fā)送
[conn start];
*/
//設置代理的第三種方式:使用類方法設置代理留拾,會自動發(fā)送網(wǎng)絡請求
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
//取消網(wǎng)絡請求
//[conn cancel];
(3)相關的代理方法
/*
1.當接收到服務器響應的時候調(diào)用
第一個參數(shù)connection:監(jiān)聽的是哪個NSURLConnection對象
第二個參數(shù)response:接收到的服務器返回的響應頭信息
*/
- (void)connection:(nonnull NSURLConnection *)connection didReceiveResponse:(nonnull NSURLResponse *)response
/*
2.當接收到數(shù)據(jù)的時候調(diào)用鲫尊,該方法會被調(diào)用多次
第一個參數(shù)connection:監(jiān)聽的是哪個NSURLConnection對象
第二個參數(shù)data:本次接收到的服務端返回的二進制數(shù)據(jù)(可能是片段)
*/
- (void)connection:(nonnull NSURLConnection *)connection didReceiveData:(nonnull NSData *)data
/*
3.當服務端返回的數(shù)據(jù)接收完畢之后會調(diào)用
通常在該方法中解析服務器返回的數(shù)據(jù)
*/
-(void)connectionDidFinishLoading:(nonnull NSURLConnection *)connection
/*4.當請求錯誤的時候調(diào)用(比如請求超時)
第一個參數(shù)connection:NSURLConnection對象
第二個參數(shù):網(wǎng)絡請求的錯誤信息,如果請求失敗咳蔚,則error有值
*/
- (void)connection:(nonnull NSURLConnection *)connection didFailWithError:(nonnull NSError *)error
- 2.4 NSURLConnection發(fā)送POST請求
(1)發(fā)送POST請求步驟
a.確定URL路徑
b.創(chuàng)建請求對象(可變對象)
c.修改請求對象的方法為POST,設置請求體(Data)
d.發(fā)送一個異步請求
e.補充:設置請求超時侈询,處理錯誤信息堆巧,設置請求頭(如獲取客戶端的版本等等,請求頭是可設置可不設置的)
(2)相關代碼
//1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];
//2.創(chuàng)建請求對象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//2.1更改請求方法
request.HTTPMethod = @"POST";
//2.2設置請求體
request.HTTPBody = [@"username=nume&pwd=key" dataUsingEncoding:NSUTF8StringEncoding];
//2.3請求超時
request.timeoutInterval = 5;
//2.4設置請求頭
[request setValue:@"ios 9.0" forHTTPHeaderField:@"User-Agent"];
//3.發(fā)送請求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) {
//4.解析服務器返回的數(shù)據(jù)
if (connectionError) {
NSLog(@"--請求失敗-");
}else
{
NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
}
}];
- 2.5 URL中文轉碼問題
//1.確定請求路徑
NSString *urlStr = @"http://120.25.226.186:32812/login2?username=用戶名&pwd=key";
NSLog(@"%@",urlStr);
//中文轉碼操作
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@",urlStr);
NSURL *url = [NSURL URLWithString:urlStr];