標籤:
網路編程中有以下幾種方式向伺服器進行提交資料:IOS同步請求、非同步請求、GET請求、POST請求
1、同步請求可以從網際網路請求資料,一旦發送同步請求,程式將停止使用者互動,直至伺服器返回資料完成,才可以進行下一步操作,
2、非同步請求不會阻塞主線程,而會建立一個新的線程來操作,使用者發出非同步請求後,依然可以對UI進行操作,程式可以繼續運行
3、GET請求,將參數直接寫在訪問路徑上。操作簡單,不過容易被外界看到,安全性不高,地址最多255位元組;
4、POST請求,將參數放到body裡面。POST請求操作相對複雜,需要將參數和地址分開,不過安全性高,參數放在body裡面,不易被捕獲。 接下來借用代碼來示範四種請求方式的實現:第一種是使用:GET請求方式
1 -(void)loginByGet 2 { 3 //1.建立NSURL對象,設計串連的地址 4 NSString *strURL =[NSString stringWithFormat:@"http://127.0.0.1/userManager/login.php?username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; 5 NSURL *url = [NSURL URLWithString:strURL]; 6 7 //2.建立NSURLRequest請求對象 8 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 9 /**10 * NSURLReqest 如果是不可變的,則不可設定逾時時間。11 */12 //3.建立NSURLConnection連線物件13 NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];14 15 //4.向伺服器發送請求16 [connection start];17 }
第二種是使用:POST請求方式
1 -(void)loginByPost 2 { 3 //1.建立NSURL對象,設計串連的地址 4 NSString *strURL = @"http://127.0.0.1/userManager/login.php"; 5 NSURL *url = [NSURL URLWithString:strURL]; 6 7 //2.建立NSURLRequest請求對象 8 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 9 [request setTimeoutInterval:5.0];//設定連線逾時的等待時間;10 [request setHTTPMethod:@"post"];//佈建要求方式為POST11 //設定post帶的資料12 NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text];13 NSData *dataBody = [strBody dataUsingEncoding:NSUTF8StringEncoding];14 //通過協議頭進行攜帶資料15 [request setHTTPBody:dataBody];16 17 //3.建立NSURLConnection連線物件18 NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];19 20 //向伺服器發送請求21 [conn start];22 23 }
第三種是使用:同步請求方式
1 -(void)loginByPost 2 { 3 //1.建立NSURL對象,設計串連的地址 4 NSString *strURL = @"http://127.0.0.1/userManager/login.php"; 5 NSURL *url = [NSURL URLWithString:strURL]; 6 //2.建立NSURLRequest請求對象 7 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 8 [request setTimeoutInterval:5.0];//逾時時間 9 [request setHTTPMethod:@"post"];//設定使用post方式10 //設定post帶的資料11 NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text];12 NSData *dataBody = [strBody dataUsingEncoding:NSUTF8StringEncoding];13 //通過協議頭進行攜帶資料14 [request setHTTPBody:dataBody];15 16 //3.建立NSURLConnection連線物件17 NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];18 //4.向伺服器發送請求19 [conn start];20 21 //清理資料22 NSData *data = [@"" dataUsingEncoding:NSUTF8StringEncoding];23 [self.allDatas setData:data];24 25 }
在使用NSURLConnection連線物件時,還需要實現<NSURLConnectionDataDelegate>代理方法
1 #pragma mark - NSURLConnection代理方法 2 //收到伺服器返回的資料,可能會執行很多次,因為資料如果很大的話,會進行分包發送 3 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 4 { 5 //將所有資料區段進行拼接,將新接收的資料區段進行追加 6 [self.allDatas appendData:data]; 7 } 8 //串連過程中出錯處理 9 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error10 {11 NSLog(@"error reason:%@",error);12 }13 //資料接收完畢,做最後的資料處理14 -(void)connectionDidFinishLoading:(NSURLConnection *)connection15 {16 //當傳輸的檔案中,如果含有漢字的,系統無法識別這種編碼17 unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);18 //按照encoding這種編碼方式,將接收到資料區段進行輸出19 NSString *request = [[NSString alloc]initWithData:self.allDatas encoding:encoding];20 NSLog(@"%@",request);21 }
在POST請求方式中,如果希望看到資料轉送的進度,可以通過實現以下方法進行列印輸出。
1 //以post方式傳資料時返回資料轉送的進度,僅限於以post方式2 -(void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite3 {4 NSLog(@"bytes:%ld,totalBytes:%ld,totalBytesExpected:%ld",bytesWritten,totalBytesWritten,totalBytesExpectedToWrite);5 } 知識點補充:GET請求和POST請求方式
GET
- GET的語義是擷取指定URL上的資源
- 將資料按照variable=value的形式,添加到action所指向的URL後面,並且兩者使用“?”串連,各個變數之間使用“&”串連
- 不安全,因為在傳輸過程中,資料被放在請求的URL中
- 傳輸的資料量小,這主要是因為受URL長度限制
POST
- POST的語意是對指定資源“追加/添加”資料
- 將資料放在資料體中,按照變數和值相對應的方式,傳遞到action所指向URL
- 所有資料對使用者來說不可見
- 可以傳輸大量資料,上傳檔案只能使用Post
網路訪問的四個步驟
- 第一步:確定地址——URL
- 第二步:建立請求
- 第三步:開始串連
等待網路處理中……
iOS_網路編程