iOS 의 http 요청:get,post 및 동기 화,비동기

10933 단어 iOS 개발
1、get:
view source print ? 01. "font-size:14px;" >NSString * URLString = @ "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode= " ; 02. NSURL * URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 03.
  04. NSURLRequest * request = [[NSURLRequest alloc]initWithURL:URL]; 05. NSURLResponse * response = nil; 06. NSError * error = nil; 07. NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 08. if   (error) { 09. NSLog(@ "error: %@" ,[error localizedDescription]); 10. } else { 11. NSLog(@ "response : %@" ,response); 12. NSLog(@ "backData : %@" ,[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]); 13. } 14. get URL , , , , 。 URL , , 。

NSURL, URLWithString UTF8 , , 。 NSURL NSURLRequest, NSURLConnection , request get 。

NSError , , , , 。

2、post:

view source print ?
01. NSString * URLString = @ "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getSupportCityString" ; 02. NSURL * URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 03.
  04. NSString * postString = @ "theRegionCode= " ; 05. NSData * postData = [postString dataUsingEncoding:NSUTF8StringEncoding];   // NSData 06.
  07. NSMutableURLRequest * request = [[NSMutableURLRequest alloc]init]; 08. [request setHTTPMethod:@ "post" ];  // 09. [request setURL:URL];  // 10. [request setHTTPBody:postData];   // 11.
  12. NSURLResponse * response; 13. NSError * error; 14. NSData * backData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 15.
  16. if   (error) { 17. NSLog(@ "error : %@" ,[error localizedDescription]); 18. } else { 19. NSLog(@ "response : %@" ,response); 20. NSLog(@ "backData : %@" ,[[NSString alloc]initWithData:backData encoding:NSUTF8StringEncoding]); 21. }
post 방식 의 경우 인 자 는 HTTPBody 에 놓 여 있 고 문자열 을 응답 하 는 NSData 형식 으로 바 꿔 야 합 니 다.인터페이스 문서 에 서 는 일반적으로 디 코딩 방식 을 지적 합 니 다.지정 한 방식 으로 디 코딩 해 야 합 니 다.여기 UTF 8 도 gb 2312 가 있 습 니 다.request 가 구축 되면 get 방법 과 같이 NSURLConnection 요청 데 이 터 를 사용 합 니 다.
3.동기 화 및 비동기 요청:
일반 네트워크 요청 은 데이터 가 아무리 적 고 네트워크 가 아무리 좋아 도 시간 이 걸 리 며 네트워크 가 좋 지 않 을 때 app 상 태 를 고려 해 야 할 때 가 많 습 니 다.동기 화 요청 을 사용 하면 안심 하고 데 이 터 를 기다 리 면 됩 니 다.추가 작업 을 하지 않 아 도 됩 니 다.위의 두 가지 예 는 동기 화 요청 입 니 다.connection 호출 방법 후 요청 한 데 이 터 를 되 돌려 주 고 다른 일 을 하지 않 아 도 됩 니 다.그러나 동기 화 는 스 레 드 를 막 을 수 있 습 니 다.button 을 누 르 면 요청 이 끝 날 때 까지 하 이 라이트 상태 에 머 물 러 app 이 걸 리 고 다운 되 는 느낌 을 줄 수 있 습 니 다.좋 지 않 습 니 다.
비동기 get:
view source print ? 1. NSString * URLString = @ "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode= " ; 2. NSURL * URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 3.
  4. NSURLRequest * request = [[NSURLRequest alloc]initWithURL:URL]; 5.
  6. _connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];  ( 1 )
비동기 post 와 유사 합 니 다.NSURLConnection 호출 방법 으로 데 이 터 를 직접 얻 는 것 이 아니 라(1)위치 방법 으로 NSURLConnection 대상 을 구축 합 니 다.이 방법 은 기본적으로 데 이 터 를 요청 합 니 다.다음은 의뢰 가 관건 이 야.요청 한 시간 이 알 수 없 기 때문에 의뢰 모드 의 리 셋 작용 을 사용 하고 데이터 에서 돌아 오 는 것 은 프로 토 콜 을 호출 하 는 방법 입 니 다.post 는 get 의뢰 방법 과 같 습 니 다.
프로 토 콜 방법:
주의해 야 할 것 은 두 가지 의뢰 가 있 습 니 다.NSURLConnection DataDelegate 와 NSURLConnection Delegate 는 이전 의뢰 에 정 의 된 것 이 므 로 NSURLConnection DataDelegate 를 따 르 면 됩 니 다.
보통 네 가지 의뢰 방법 을 사용 합 니 다.
view source print ? 01.
"code" class="objc">//   respone,      HTTP           ,      、     
02. -( void )connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ NSLog(@ "response = %@" ,response); _backData = [[NSMutableData alloc]init]; 03. } 04.
  05. // , , , NSData , 06. -( void )connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 07. [_backData appendData:data]; 08. } 09.
  10. // , , 11. -( void )connectionDidFinishLoading:(NSURLConnection *)connection{ 12. NSLog(@ "%@" ,[[NSString alloc]initWithData:_backData encoding:NSUTF8StringEncoding]); 13. } 14.
  15. // , 16. -( void )connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 17. if   (error.code == NSURLErrorTimedOut) { 18. NSLog(@ " " ); 19. } 20. NSLog(@ "%@" ,[error localizedDescription]); 21. }
view source print ?
1.
 
view source print ? 1.
 
view source print ? 1.
 
마지막 으로 요청 시간 초과 설정 가능:
view source print ? 1. NSURLRequest * request = [[NSURLRequest alloc]initWithURL:URL cachePolicy: 0   timeoutInterval: 8.0 ];
또는:
view source print ? 1. NSMutableURLRequest * request = [[NSMutableURLRequest alloc]initWithURL:URL]; 2. [request setTimeoutInterval: 8.0 ];
요청 시간 이 설정 한 시간 초과 시간 을 초과 하면 자동 으로 호출 됩 니 다.
view source print ? 1. -( void )connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
그러나 문 제 는 시간 초과 로 인 한 요청 실 패 를 어떻게 판단 하 느 냐 하 는 것 이다.위의 예 에 이미 쓰 여 있 으 며,되 돌아 오 는 error 의 code 에 따라 판단 할 수 있다.서로 다른 상황 을 알 아 보 는 요청 이 실 패 했 습 니 다.사용자 에 게 더 좋 은 힌트 를 줄 수 있 습 니 다.

좋은 웹페이지 즐겨찾기