iOS:网络编程解析协议一:HTTP超文本传输协议
HTTP傳輸數據有四種方式:Get方式、Post方式、同步請求方式、異步請求方式。具體的介紹,前面已經有過系統的講解,這次主要進行具體的舉。
說明:同步和異步請求方式在創建鏈接對象和創建請求對象時,用Get方式或Post方式中的任意一種即可;那么,同步/異步請求方式和Get/Post方式不同的地方是什么呢?區別在于進行連接處理這一步上,Get/Post方式它們均使用相同代理NSURLConnectionDataDelegate的方法傳輸數據,而同步/異步請求方式則不需要使用代理。
?
前提:需要先在本機上搭建一個本地服務器,然后配合一個數據庫創建一個數據庫表,存放用戶登錄名和登陸密碼,并且可以成功登陸即可。這個配置搭建我就不做解釋了,可以自己查資料,以下是我搭建的本機服務器截圖,可以登陸成功。
?
? ? ? ? ? ? ???
?
然后布局故事板,添加登陸文本框和按鈕(并將它們IBOutlet到控制器類中)截圖如下:
?
具體的代碼如下:
導入頭文件并設置相關屬性
1 @interface ViewController ()<NSURLConnectionDataDelegate> 2 @property (weak, nonatomic) IBOutlet UITextField *userNameTextField; 3 @property (weak, nonatomic) IBOutlet UITextField *passwordTextField; 4 @property (strong,nonatomic)NSMutableData *allDatas;初始化:
1 //給allDatas設置一個懶加載的方法 2 -(NSMutableData*)allDatas 3 { 4 if(!_allDatas) 5 { 6 _allDatas = [NSMutableData data]; 7 } 8 return _allDatas; 9 }按鈕事件:
1 - (IBAction)loginButtonClicked:(UIButton *)sender 2 3 { 4 5 [self loginByGet]; //Get方式 6 7 [self loginByPost]; //Post方式 8 9 [self loginBySynchronous]; //同步請求方式 10 11 [self loginByAsynchronous];//異步請求方式 12 13 }?
第1種方式:登陸服務器成功后,用Get方式解析服務器發送回來的數據,需要實現<NSURLConnectionDataDelegate>協議來解析
1 #pragma mark -用Get方法登陸 2 -(void)loginByGet 3 { 4 //1.創建NSURL對象,設置鏈接的地址 5 NSString *strURL = [NSString stringWithFormat:@"http://127.0.0.1/userManager/login.php?username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; 6 NSURL *url = [NSURL URLWithString:strURL]; 7 8 //2.創建NSURLRequest請求對象 9 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 10 11 //3.創建NSURLConnection連接對象 12 NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 13 14 //4.向服務器發送請求 15 [connection start]; 16 }第2種方式:登陸服務器成功后,用Post方式解析服務器發送回來的數據,需要實現<NSURLConnectionDataDelegate>協議來解析
1 #pragma mark -用Post方式登陸 2 -(void)loginByPost 3 { 4 //1.創建NSURL對象,設置鏈接的地址 5 NSString *strURL = @"http://127.0.0.1/userManager/login.php"; 6 NSURL *url = [NSURL URLWithString:strURL]; 7 8 //2.創建NSURLRequest請求對象 9 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 10 [request setTimeoutInterval:5.0];//設置超時時間 11 [request setHTTPMethod:@"post"]; 12 13 //設置post帶的數據 14 NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; 15 NSData *datatBody = [strBody dataUsingEncoding:NSUTF8StringEncoding]; 16 [request setHTTPBody:datatBody]; 17 18 //3.創建NSURLConnection連接對象 19 NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 20 21 //4.向服務器發送請求 22 [connection start]; 23 24 }?不論是Get方式,還是Post方式,都用到的一模一樣的數據解析協議代理<NSURLConnectionDataDelegate>如下:
1 #pragma mark -<NSURLConnectionDataDelagate> 2 //收到服務器的數據,因為數據會分數據包,可能會調用多次 3 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 4 { 5 //將分包組合在一起 6 [self.allDatas appendData:data]; 7 } 8 9 //鏈接出錯時的處理 10 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 11 { 12 NSLog(@"鏈接出錯:%@",error); 13 } 14 15 //數據傳輸完成,做最后的處理 16 -(void)connectionDidFinishLoading:(NSURLConnection *)connection 17 { 18 unsigned long enconding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); 19 20 NSString *strResponse = [[NSString alloc]initWithData:self.allDatas encoding:enconding]; 21 22 NSLog(@"%@",strResponse); 23 24 25 //清理數據 26 NSData *data = [@"" dataUsingEncoding:NSUTF8StringEncoding]; 27 [self.allDatas setData:data]; 28 } 29 30 //post傳輸數據時返回數據傳輸的進度 31 -(void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite 32 { 33 NSLog(@"bytes:%ld,totalBytes:%ld,totalBytesExpected:%ld",bytesWritten,totalBytesWritten,totalBytesExpectedToWrite); 34 }它們倆的運行結果都是:
2015-09-24 12:58:45.053 01-NSURLConnection[1608:80089] admin123456<br /> <b>Notice</b>: Undefined index: userid in <b>/Applications/XAMPP/xamppfiles/htdocs/userManager/login.php</b> on line <b>30</b><br /> admin 歡迎你!進入 <a href="my.php">用戶中心</a><br />點擊此處 <a href="login.php?action=logout">注銷</a> 登錄!<br />?
第3種方式:登陸服務器成功后,用同步請求方式解析服務器發送回來的數據
1 #pragma mark -同步請求(創建URL對象和請求對象時,Get和Post的方法都可以使用) 2 -(void)loginBySynchronous 3 { 4 //1.創建NSURL對象,設置鏈接的地址 5 NSString *strURL = [NSString stringWithFormat:@"http://127.0.0.1/userManager/login.php?username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; 6 NSURL *url = [NSURL URLWithString:strURL]; 7 8 //2.創建NSURLRequest請求對象 9 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 10 [request setTimeoutInterval:1.0]; 11 12 //3.使用同步請求 13 NSError *error = nil; 14 NSURLResponse *response = nil; 15 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 16 if(error) 17 { 18 NSLog(@"數據傳輸錯誤:%@",error); 19 } 20 else 21 { 22 unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); 23 24 NSString *str = [[NSString alloc]initWithData:data encoding:encoding]; 25 NSLog(@"%@",str); 26 } 27 }運行結果:
2015-09-24 13:11:15.010 01-NSURLConnection[1630:83994] admin123456<br /> <b>Notice</b>: Undefined index: userid in <b>/Applications/XAMPP/xamppfiles/htdocs/userManager/login.php</b> on line <b>30</b><br /> admin 歡迎你!進入 <a href="my.php">用戶中心</a><br />點擊此處 <a href="login.php?action=logout">注銷</a> 登錄!<br />?
第4種方式:登陸服務器成功后,用異步請求方式解析服務器發送回來的數據
1 #pragma mark -異步請求(創建URL對象和請求對象時,Get和Post的方法都可以使用) 2 -(void)loginByAsynchronous 3 { 4 //1.創建NSURL對象,設置鏈接的地址 5 NSString *strURL = @"http://127.0.0.1/userManager/login.php"; 6 NSURL *url = [NSURL URLWithString:strURL]; 7 8 9 //2.創建NSURLRequest請求對象 10 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 11 [request setHTTPMethod:@"post"]; 12 NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; 13 NSData *dataBody = [strBody dataUsingEncoding:NSUTF8StringEncoding]; 14 [request setHTTPBody:dataBody]; 15 16 17 //3.異步請求 18 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 19 if(connectionError) 20 { 21 NSLog(@"數據獲取失敗:%@",connectionError); 22 } 23 else 24 { 25 unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); 26 NSString *str = [[NSString alloc]initWithData:data encoding:encoding]; 27 NSLog(@"async:%@",str); 28 } 29 }]; 30 }運行結果:
2015-09-24 13:13:32.407 01-NSURLConnection[1653:85054] async:admin123456<br /> <b>Notice</b>: Undefined index: userid in <b>/Applications/XAMPP/xamppfiles/htdocs/userManager/login.php</b> on line <b>30</b><br /> admin 歡迎你!進入 <a href="my.php">用戶中心</a><br />點擊此處 <a href="login.php?action=logout">注銷</a> 登錄!<br />?
轉載于:https://www.cnblogs.com/XYQ-208910/p/4835014.html
總結
以上是生活随笔為你收集整理的iOS:网络编程解析协议一:HTTP超文本传输协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享 - Social.framewor
- 下一篇: android 电容屏(三):驱动调试之