(1)步驟ios
01 設置請求路徑 02 建立請求對象(默認是GET請求,且已經默認包含了請求頭) 03 使用NSURLSession sendsync方法發送網絡請求 04 接收到服務器的響應後,解析響應體
(2)相關代碼服務器
//1.肯定請求路徑 NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=XML"]; // NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/video?type=XML"]; //2.建立一個請求對象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //3.把請求發送給服務器 //sendSynchronousRequest (同步)阻塞式的方法,會卡住線程 NSHTTPURLResponse *response = nil; NSError *error = nil; /* 第一個參數:請求對象 第二個參數:響應頭信息,當該方法執行完畢以後,該參數被賦值 第三個參數:錯誤信息,若是請求失敗,則error有值 */ //該方法是阻塞式的,會卡住線程 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; //4.解析服務器返回的數據 NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
(1)相關說明網絡
01 該方法不會卡住當前線程,網絡請求任務是異步執行的
(2)相關代碼框架
//1.肯定請求路徑 NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it"]; //2.建立一個請求對象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //3.把請求發送給服務器,發送一個異步請求 /* 第一個參數:請求對象 第二個參數:回調方法在哪一個線程中執行,若是是主隊列則block在主線程中執行,非主隊列則在子線程中執行 第三個參數:completionHandlerBlock塊:接受到響應的時候執行該block中的代碼 response:響應頭信息 data:響應體 connectionError:錯誤信息,若是請求失敗,那麼該參數有值 */ [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) { //4.解析服務器返回的數據 NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; //轉換並打印響應頭信息 NSHTTPURLResponse *r = (NSHTTPURLResponse *)response; NSLog(@"--%zd---%@--",r.statusCode,r.allHeaderFields); }];
(1)步驟異步
01 肯定請求路徑 02 建立請求對象 03 建立NSURLConnection對象並設置代理 04 遵照NSURLConnectionDataDelegate協議,並實現相應的代理方法 05 在代理方法中監聽網絡請求的響應
(2)設置代理的幾種方法ide
/* 設置代理的第一種方式:自動發送網絡請求 [[NSURLConnection alloc]initWithRequest:request delegate:self]; */ /* 設置代理的第二種方式: 第一個參數:請求對象 第二個參數:誰成爲NSURLConnetion對象的代理 第三個參數:是否立刻發送網絡請求,若是該值爲YES則馬上發送,若是爲NO則不會發送網路請求 NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO]; //調用該方法控制網絡請求的發送 [conn start]; */ //設置代理的第三種方式:使用類方法設置代理,會自動發送網絡請求 NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self]; //取消網絡請求 //[conn cancel];
(3)相關的代理方法oop
/* 1.當接收到服務器響應的時候調用 第一個參數connection:監聽的是哪一個NSURLConnection對象 第二個參數response:接收到的服務器返回的響應頭信息 */ - (void)connection:(nonnull NSURLConnection *)connection didReceiveResponse:(nonnull NSURLResponse *)response /* 2.當接收到數據的時候調用,該方法會被調用屢次 第一個參數connection:監聽的是哪一個NSURLConnection對象 第二個參數data:本次接收到的服務端返回的二進制數據(多是片斷) */ - (void)connection:(nonnull NSURLConnection *)connection didReceiveData:(nonnull NSData *)data /* 3.當服務端返回的數據接收完畢以後會調用 一般在該方法中解析服務器返回的數據 */ -(void)connectionDidFinishLoading:(nonnull NSURLConnection *)connection /*4.當請求錯誤的時候調用(好比請求超時) 第一個參數connection:NSURLConnection對象 第二個參數:網絡請求的錯誤信息,若是請求失敗,則error有值 */ - (void)connection:(nonnull NSURLConnection *)connection didFailWithError:(nonnull NSError *)error
(4)其它知識點url
01 關於消息彈窗第三方框架的使用 SVProgressHUD 02 字符串截取相關方法 - (NSRange)rangeOfString:(NSString *)searchString; - (NSString *)substringWithRange:(NSRange)range;
(1)發送POST請求步驟spa
a.肯定URL路徑 b.建立請求對象(可變對象) c.修改請求對象的方法爲POST,設置請求體(Data) d.發送一個異步請求 e.補充:設置請求超時,處理錯誤信息,設置請求頭(如獲取客戶端的版本等等,請求頭是可設置可不設置的)
(2)相關代碼線程
//1.肯定請求路徑 NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"]; //2.建立請求對象 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; //2.1更改請求方法 request.HTTPMethod = @"POST"; //2.2設置請求體 request.HTTPBody = [@"username=520it&pwd=520it" dataUsingEncoding:NSUTF8StringEncoding]; //2.3請求超時 request.timeoutInterval = 5; //2.4設置請求頭 [request setValue:@"ios 9.0" forHTTPHeaderField:@"User-Agent"]; //3.發送請求 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * __nullable response, NSData * __nullable data, NSError * __nullable connectionError) { //4.解析服務器返回的數據 if (connectionError) { NSLog(@"--請求失敗-"); }else { NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]); } }];
1.使用主線程發送:
代理方法一:
代理方法二:
1.使用子線程發送:(考慮到下載耗時)
代理方法一:
代理方法二:
注意點:代理方法一和方法二之間的區別就是代理方法是否立刻發送請求.
1)若沒有設置,則默認的是立刻發送請求,可是問題來了,子線程並不會開啓?
解決方案:手動開啓子線程的RunLoop
[[NSRunLoop currentRunLoop] run];
2)如有設置,且設置爲NO,那麼咱們就得手動去發送請求:
[connect start];
//該方法內部會自動將當前的請求對象添加到runloop中,指定運行模式爲默認
//若是子線程對應的runloop沒有建立,那麼會自動建立