網絡day01
理論部分
1.GET請求和POST請求總結:
GET:在請求URL后面以?的形式跟上發給服務器的參數,多個參數之間用&隔開
例:http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON
- "協議頭+主機地址+端口號+接口名稱+?+參數1&參數&參數3"
使用場景:當只需要進行簡單索數據,建議使用GET
POST:發給服務器的參數全部放在請求體中,理論上,POST傳遞的數據量沒有限制(具體還得看服務器的處理能力)
- "協議頭+主機地址+端口號+接口名稱"
使用場景:
1.需要傳遞大量的數據(數據上傳)只能使用POST
2.GET的安全性比POST差,故當需要傳遞安全程度需要高的數據時,使用POST
3.如果需要增加\刪除\修改數據時,建議使用POST
2.發送GET請求的步驟
1)確定請求路徑("后面跟參數")
2)創建請求對象(默認就是GET請求)
3)使用NSURLConnection發送請求
4)解析服務器返回的數據
3.發送POST請求的步驟
1)確定請求路徑(后面不跟參數)
2)創建"可變的"請求對象
3)修改請求對象的請求方法為POST
4)設置請求體(把參數轉換為二進制數據設置)
5)使用NSURLConnection發送請求
6)解析服務器返回的數據
4.http請求通信過程
(1)請求:【包括請求頭+請求體·非必選】
(2)響應:【響應頭+響應體】
(3)通信過程:
a.發送請求的時候把請求頭和請求體(請求體是非必須的)包裝成一個請求對象
b.服務器端對請求進行響應,在響應信息中包含響應頭和響應體,響應信息是對服務器端的描述,具體的信息放在響應體中傳遞給客戶端
代碼部分:
一.NSURLConnection的實現
- 1.NSURLConnection發送GET請求(同步請求)
//1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520&pwd=520&type=JSON"];
//2.創建請求對象
NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url];
//3.使用NSURLConnection來發送網絡請求(同步請求-阻塞)
NSURLResponse *response = nil;
NSError *error = nil;//通常定義NSError不使用alloc init的方式
/*
第一個參數:sendSynchronousRequest-->請求對象
第二個參數:returningResponse-->響應頭信息 傳地址
第三個參數:error-->錯誤信息
返回值:響應體信息(解析)
*/
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSLog(@"%@---%@",response,error);
//4.解析服務器返回的數據
NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
- 2.NSURLConnection發送GET請求(異步請求)
//1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520&pwd=520&type=JSON"];
//2.創建請求對象
NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url];
//3.發送異步請求
/*
第一個參數:請求對象
第二個參數:隊列(決定代碼塊在哪個線程中調用)
第三個參數:completionHandler 網絡請求完成(成功|失敗)之后的回調
NSURLResponse:響應頭
data:響應體
connectionError:錯誤信息
*/
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
//先判斷請求是否成功
if (connectionError) {
NSLog(@"請求失敗---%@",connectionError);
return ;
}
//4.解析數據
NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
NSLog(@"%@",response);
}];
NSLog(@"--end---");//因為是異步的關系,導致這句話到時可能優先打印
- 3.NSURLConnection發送GET請求(代理方法)
//1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520&pwd=520&type=JSON"];
//2.創建請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.設置代理,發送網絡請求
//第一種設置代理的方法
[[NSURLConnection alloc]initWithRequest:request delegate:self];
//第二種設置代理的方法
//startImmediately是否馬上發送網絡請求 YES(馬上發送)
NSURLConnection *connect = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:NO];
//若為NO,則需要調用發送請求的方法
//發送網絡請求
[connect start];
//并實現下列代理方法:
//接收到服務器的響應
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
//當接收到服務器返回的數據的時候調用(可能會被調用多次)
//P.S.定義一個成員屬性保存已經獲取獲取的Data,并將獲得的所有data拼接在一起
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
//當請求完成的時候調用
//輸出響應體,使用[[NSString alloc]initWithData:self.resultData encoding:NSUTF8StringEncoding]方式輸出
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
//當請求失敗或者是出現錯誤的時候調用
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- 4.NSURLConnection發送POST請求
//1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];
//2.創建可變的請求對象(需要使用可變類型,因為默認不可變請求方法為GET)
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//3.**修改請求方法POST(大寫)**
request.HTTPMethod = @"POST";
//設置請求對象
//請求超時 --- 設置一個請求的時間限制,如果超過這個時間那么就認為請求失敗
request.timeoutInterval = 15;
//設置請求頭
[request setValue:@"iOS 10.1" forHTTPHeaderField:@"User-Agent"];
//4.設置請求體
//username=520it&pwd=520it&type=JSON
request.HTTPBody = [@"username=520it&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];
//5.發送網絡請求+接收服務器返回的數據
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError)
/*
也可使用 NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)
這樣可以不用創建請求對象
*/
if(connectionError)
{
NSLog(@"請求失敗---%@",connectionError);
return ;
}
//6.解析是服務器返回的數據
NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
}];
二.NSURLSession的實現
- 1.NSURLSession發送GET請求
//1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520&pwd=520&type=JSON"];
//2.創建請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.獲得一個會話對象
NSURLSession *session = [NSURLSession sharedSession];
//4.創建請求任務
/*
第一個參數:請求對象
第二個參數:completionHandler 完成后執行的回調
data:響應體
response:響應頭
error:錯誤信息
*/
//!!!注意:默認情況下completionHandler在子線程中調用
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//6.解析服務器返回的數據
NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
}];
//5.**執行task**需要自己手動開啟
[dataTask resume];
- 2.NSURLSession發送POST請求
//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=520&pwd=520&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];
//3.創建會話對象
NSURLSession *session = [NSURLSession sharedSession];
//4.創建task
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//6.解析數據
NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
}];
//5.執行task
[dataTask resume];
}
- 3.NSURLSession發送請求(代理方法)
//1.確定請求路徑
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login?username=520it&pwd=520it&type=JSON"];
//2.創建會話對象
/*
第一個參數:配置選項
第二個參數:誰成為代理
第三個參數:隊列(線程) 決定的是代理方法在哪個線程中調用
*/
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
//3.創建task
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url];
//4.執行task
[dataTask resume];
//并實現下列代理方法:
//當接收到服務器響應的時候調用
//默認情況下是不會接收服務器返回數據的,如果需要接收應該主動告訴系統(需要在completionHandler中告知系統)
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
/*
NSURLSessionResponseCancel = 0, 取消(默認的做法)
NSURLSessionResponseAllow = 1, 允許(接收數據)
*/
//當接收到服務器返回數據的時候調用(會調用多次)
//解決方式和NSURLConnection的代理方式一致
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data