자세 한 iOS-ASIHTP Request 네트워크 요청

12665 단어 iosasihttprequest
머리말
iOS SDK 의 HTTP 네트워크 를 사용 하여 API 를 요청 합 니 다.상당히 복잡 하고 호출 이 번 거 롭 습 니 다.ASIHTTPRequest 는 CFNetwork API 를 패키지 하고 사용 하기에 매우 간단 한 API 입 니 다.별명 은'HTTP 종결자'입 니 다.Objective-C 로 작성 하여 운영 효율 이 높 고 Mac OS X 시스템 과 iOS 플랫폼 의 응용 프로그램 에 잘 응용 할 수 있 습 니 다.ASIHTTPRequest 는 기본 적 인 HTTP 요청 과 REST 기반 서비스 간 의 상호작용 에 적 용 됩 니 다.안 타 깝 게 도 저 자 는 업 데 이 트 를 중단 하고 잠재 적 인 BUG 를 해결 하 는 사람 이 없 었 습 니 다.많은 회사 의 오래된 프로젝트 에 그의 모습 이 남아 있 었 습 니 다.예전 의 많은 iOS 프로젝트 는 ASI+SBJSon 이 었 습 니 다.ASI 를 사용 할 수 있 는 지 없 는 지 는 오래된 iOS 프로그래머 의 기준 중 하나 라 고 할 수 있 습 니 다.iOS 9 부터 CFNetwork 와 관련 된 클래스 와 방법 이 폐기 되 기 시 작 했 으 며,ASIHTTPRequest 의 사용 을 AFNetworking 으로 대체 할 수 있 습 니 다.iOS 9+에서 ASIHTTRequest 를 사용 하면 App Transport Security Settings 에 설정 을 추가 할 필요 가 없습니다.
1、ASIHTTPRequest
1.1 ASI 주요 특징
4.567917.간단 한 인 터 페 이 스 를 통 해 서버 에 데 이 터 를 제출 하고 서버 에서 데 이 터 를 얻 는 작업 을 완성 할 수 있 습 니 다4.567917.다운로드 한 데 이 터 는 메모리 에 저장 하거나 디스크 에 직접 저장 할 수 있 습 니 다4.567917.로 컬 파일 을 서버 에 업로드 할 수 있 습 니 다
  • 편리 하 게 접근 하고 조작 요청 과 되 돌아 갈 수 있 는 Http 헤드 정보.
  • 4.567917.업로드 또는 다운로드 의 진도 정 보 를 얻 고 응용 프로그램 에 더 좋 은 체험 을 제공 할 수 있 습 니 다4.567917.대기 열 을 업로드 하거나 다운로드 할 수 있 으 며 대기 열의 진도 정 보 를 얻 을 수 있 습 니 다
  • 기본,요약 과 NTLM 인증 을 지원 하고 같은 세 션 에서 권한 수여 증명 서 는 자동 으로 유지 되 며 키 체인(Mac 과 iOS 운영 체제 의 암호 관리 시스템)에 저장 할 수 있 습 니 다
  • 쿠키 지원.
  • 4.567917.응용 프로그램(iOS 4+)이 배경 에서 실 행 될 때 계속 실행 할 수 있 도록 요청 합 니 다GZIP 압축 데 이 터 를 지원 합 니 다
  • 내 장 된 ASIDownloadCache 류 는 네트워크 가 없어 도 캐 시 된 데이터 결 과 를 되 돌려 줄 수 있 도록 캐 시 를 요청 할 수 있 습 니 다
  • ASIWebPageRequest 는 웹 페이지,스타일 시트,스 크 립 트 등 자원 파일 을 포함 한 완전한 웹 페이지 를 다운로드 하여 UIWebView/WebView 에 표시 할 수 있 습 니 다.임의의 크기 의 페이지 는 네트워크 가 없어 도 오프라인 으로 탐색 할 수 있 도록 무기한 캐 시 할 수 있 습 니 다
  • 클 라 이언 트 인증 서 를 지원 합 니 다
  • 에이 전 트 를 통 해 Http 요청 을 하 는 것 을 지원 합 니 다
  • 대역 폭 제한 을 지원 합 니 다.iOS 플랫폼 에 서 는 현재 네트워크 상황 에 따라 대역 폭 제한 여 부 를 자동 으로 결정 할 수 있 습 니 다.예 를 들 어 WWAN(GPRS/Edge/3G)네트워크 를 사용 할 때 제한 하고 와 이 파 이 를 사용 할 때 제한 하지 않 습 니 다
  • 정지점 전송 을 지원 합 니 다
  • 동기 화 및 비동기 요청 을 지원 합 니 다1.2 AFN 과 ASI 의 차이
    1.밑바닥 실현
    1)AFN 의 밑바닥 은 OC 기반 NSURLConnection 과 NSURLSession 을 실현 한다.
    2)ASI 의 밑바닥 은 순 C 언어 를 바탕 으로 하 는 CFNetwork 프레임 워 크 를 실현 한다
    3)NSURLConnection 과 NSURLSession 은 CFNetwork 위 에 있 는 패키지 이기 때문에 ASI 의 작 동 성능 은 AFN 보다 높 습 니 다.
    2.서버 에 되 돌아 오 는 데이터 처리
    1)ASI 는 서버 데이터 처리 방식 을 직접 제공 하지 않 고 NSData/NSstring 으로 되 돌 아 왔 다.
    2)AFN 은 다양한 서버 데이터 처리 방식 을 제공 합 니 다(1)JSON 처리-NSDictionary 또는 NSArray 로 직접 되 돌려 줍 니 다.
      (2)XML 처리-xml 형식 데 이 터 를 되 돌려 주 므 로 분석 이 필요 합 니 다.
      (3)기타 유형의 데이터 처리
    3.감청 요청 과정 1
    )AFN 은 success 와 failure 두 블록 을 제공 하여 요청 을 감청 하 는 과정(성공 과 실패 만 감청 할 수 있 습 니 다)
  •  success:요청 성공 후 호출
  • failure:요청 실패 후 호출
  • 2)ASI 는 3 가지 방안 을 제 공 했 는데 모든 방안 이 요청 의 전체 과정 을 감청 할 수 있다(감청 요청 시작,응답 헤드 정보 수신,구체 적 인 데이터 수락,수락 완료,요청 실패)
    4.567917.대리 가 되 고 협 의 를 지 키 며 협의 중의 대리 방법 을 실현 한다
  • 대리 가 되 고 협 의 를 지 키 지 않 으 며 사용자 정의 대리 방법
  • 블록 설정
    4.파일 다운로드 와 파일 업로드 의 사용 난이도
    1)AFN
  •  감청 다운로드 진도 와 업로드 진도 가 쉽 지 않 습 니 다
  • 단점 속전 이 쉽 지 않다
  • 보통 크 지 않 은 파일 만 다운로드 합 니 다
  • 2)ASI
  •  다운로드 와 업로드 가 매우 쉽다.
  • 다운로드 진도 와 업로드 진 도 를 감청 하기 쉽다
  • 4.567917.단점 속전 을 실현 하기 쉽다
  • 큰 파일 이나 작은 파일 을 다운로드 할 수 있 습 니 다
  • 3)다운로드,업로드,추천 사용 가능 ASI
    5.네트워크 모니터링
    1)AFN 은 자체 적 으로 네트워크 모니터링 클래스 를 봉 하여 사용 하기 쉽다
    2)ASI 는 Reachability 를 사용 합 니 다.CocoaPods 를 사용 하여 ASI 를 다운로드 할 때 Reachability 를 동시에 다운로드 하지만 Reachability 는 네트워크 모니터링 으로 사용 하기 가 복잡 합 니 다(AFN 의 네트워크 모니터링 류 에 비해)
    3)AFN 을 사용 하여 네트워크 모니터링 AFNetworkReachability Manager 를 추천 합 니 다.
    6.ASI 가 제공 하 는 기타 실 용적 인 기능
    1)신호 옆 에 있 는 동 그 라 미 를 제어 할 지,요청 중 에 돌 릴 지
    2)요청 간 의존 도 를 쉽게 설정 할 수 있 습 니 다.모든 요청 은 NSOperation 대상 입 니 다.
    3)모든 요청 을 일괄 적 으로 관리 할 수 있 습 니 다.
    전체 대기 열 에서 요청 한 다운로드 진도 와 업로드 진 도 를 감청 합 니 다.
    2.ASIHTTPRequest 의 사용
    2.1 ASIHTTPRequest 추가
    Github 사이트 주소:https://github.com/pokeb/asi-http-request
    https://allseeing-i.com/ASIHTTPRequest/
    ASIHTP Request 시스템 요구 사항:
    ASIHTTPRequest Version
    Minimum iOS Target
    Target Notes
    1.8.1 -> 1.8.2
    iOS 3.0+
    0.2 -> 1.8.0
    ASIHTTPRequest 사용 MRC
    Objective-C
    
      //        
      CFNetwork.framework
      SystemConfiguration.framework
      MobileCoreServices.framework
      CoreGraphics.framework
      libz.1.1.3.tbd
      libxml2.2.tbd
    
      //         
      ASIHTTPRequest-1.8.2
    
      //   TARGETS -> Builed Settings -> Search Paths -> Header Search Paths        
      /usr/include/libxml2
    
      //   TARGETS -> Build Phases -> Compile Sources -> ...in .../ASIHTTPRequest    
      -fno-objc-arc
    
      //      
      #import "ASIHTTPRequest.h"
      #import "ASIFormDataRequest.h"
    
    
    2.2 ASIHTP Request 설정
    Objective-C
    
      //      
      ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"]];
      [request addRequestHeader:@"Referer" value:@"http://www.dreamingwish.com/"];
    
      //                  
      request.shouldContinueWhenAppEntersBackground = YES;
    
      //             
      request.numberOfTimesToRetryOnTimeout = 3;
    
      //    KeepAlive   
    
        // Set the amount of time to hang on to a persistent connection before it should expire to 2 minutes
        request.persistentConnectionTimeoutSeconds = 120;
    
        // Disable persistent connections entirely
        request.shouldAttemptPersistentConnection = NO;
    
      //               status bar  
      [ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:NO];
    
      //       
      BOOL isNetworkInUse = [ASIHTTPRequest isNetworkInUse];
    
    
    3.ASI 동기 GET 요청
    이것 은 ASIHTTPRequest 의 가장 간단 한 사용 모드 입 니 다.startSynchronous 메 시 지 를 보 낸 후 같은 스 레 드 에서 HTTP 요청 을 실행 하기 시 작 했 습 니 다.스 레 드 는 요청 이 끝 날 때 까지 기 다 립 니 다(요청 이 성공 하거나 실 패 했 습 니 다).error 속성 검 사 를 통 해 요청 이 성 공 했 거나 오류 가 발생 했 는 지 판단 할 수 있 습 니 다.
    되 돌아 오 는 텍스트 정 보 를 가 져 오 려 면 responseString 방법 을 호출 하 십시오.그림,MP3 와 같은 바 이 너 리 파일 을 다운로드 하면 responseData 방법 을 사용 하여 NSData 대상 을 얻 을 수 있 습 니 다.
    일반적인 상황 에서 동기 화 요청 대신 비동기 요청 을 우선 사용 해 야 합 니 다.주 스 레 드 에서 ASIHTTPRequest 동기 화 요청 을 사용 하면 주 스 레 드 의 실행 을 막 을 수 있 습 니 다.이 로 인해 사용자 인터페이스 가 사용자 작업 에 응답 하지 않 고 모든 애니메이션 이 요청 이 완 료 될 때 까지 렌 더 링 을 중단 합 니 다.
    Objective-C
    데이터 요청
    
      NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];
    
      //     
      ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    
      //       ,    ,    
      request.timeOutSeconds = 5;
    
      //       
      [request startSynchronous];
    
      //       
      NSError *error = [request error];
    
      //       
      if (error) {
    
        //       
        NSLog(@"      :
    %@", error); } else { // , NSString *responseString = [request responseString]; NSLog(@" :
    %@", responseString); // ,NSData NSData *responseData = [request responseData]; textView.text = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; }
    파일 다운로드
    request 의 setDownloadDestinationPath 를 설정 하면 파일 다운로드 용 다운로드 대상 디 렉 터 리 를 설정 할 수 있 습 니 다.우선 다운로드 프로 세 스 파일 은 temporary FileDownloadPath 디 렉 터 리 에 저 장 됩 니 다.다운로드 가 완료 되면 다음 과 같은 일 을 할 것 입 니 다.
    1.데이터 가 압축 된 경우 압축 을 풀 고 download DestinationPath 디 렉 터 리 에 파일 을 넣 으 면 임시 파일 이 삭 제 됩 니 다.
    2.다운로드 에 실패 하면 임시 파일 은 download DestinationPath 디 렉 터 리 로 직접 이동 하고 같은 이름 의 파일 을 교체 합 니 다.
    다운로드 중인 모든 데 이 터 를 가 져 오 려 면 delegate 의 request:didReceiveData:방법 을 실현 할 수 있 습 니 다.그러나 이 방법 을 실현 한다 면 request 는 다운로드 가 끝 난 후에 request 는 파일 을 download DestinationPath 에 두 지 않 고 수 동 으로 처리 해 야 합 니 다.
    
      NSURL *url = [NSURL URLWithString:@"http://www.dreamingwish.com/wp-content/uploads/2011/10/asihttprequest-auth.png"];
    
      ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    
      //         
      [request setDownloadDestinationPath:@"/Users/JHQ0228/Desktop/asi.png"];
    
      [request startSynchronous];
    
      //       
      NSError *error = [request error];
    
      //       
      if (error) {
    
        NSLog(@"      :
    %@", error); } else { // NSLog(@" :
    "); }
    4.ASI 비동기 GET 요청
    요청 은 배경 스 레 드 에서 실 행 됩 니 다.요청 이 끝 난 후에 호출 된 스 레 드 를 알려 주 십시오.이렇게 하면 메 인 스 레 드 가 네트워크 요청 을 할 때 인터페이스 가 잠 겨 있 는 등 상황 을 초래 하지 않 습 니 다.
    1.협의 방식
    여기에서 두 개의 delegate 방법 을 실 현 했 습 니 다.데이터 요청 이 성공 할 때 requestFinished 를 호출 하고 요청 이 실 패 했 을 때(예 를 들 어 네트워크 문제 나 서버 내부 오류)requestFailed 를 호출 합 니 다.
    
      NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];
    
      //     
      ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    
      //       ,    ,    
      request.timeOutSeconds = 5;
    
      //     ,    <ASIHTTPRequestDelegate>   
      request.delegate = self;
    
      //       
      [request startAsynchronous];
    
      //       ,    
      - (void)requestFinished:(ASIHTTPRequest *)request {
    
      }
    
      //       ,    
      - (void)requestFailed:(ASIHTTPRequest *)request {
    
      }
    
    
    2.Block 방식
    플랫폼 지원 상황 에서 ASIHTTPRequest 1.8 이상 은 block 을 지원 합 니 다.
    
      NSURL *url = [NSURL URLWithString:@"http://api.hudong.com/iphonexml.do?type=focus-c"];
    
      //     ,  __weak    block       
      __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    
      //       ,    ,    
      request.timeOutSeconds = 5;
    
      //       
      [request startAsynchronous];
    
      //       
      [request setCompletionBlock:^{
    
      }];
    
      //       
      [request setFailedBlock:^{
    
      }];
    
    
    5.ASI POST 요청
    1.POST 양식
    ASIFormDataRequest,아 날로 그 폼 제출,제출 형식 과 Header 가 자동 으로 식 별 됩 니 다.파일 의 데 이 터 는 필요 할 때 디스크 에서 불 러 오기 때문에 웹 서버 가 처리 할 수만 있다 면 큰 파일 을 업로드 하 는 것 은 문제 가 없습니다.
    
      //        'application/x-www-form-urlencoded'      ,              ,          ‘multipart/form-data'。
    
        ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://www.dreamingwish.com"]];
    
        //     
        [request setPostValue:@"Ben" forKey:@"first_name"];
        [request setPostValue:@"Copsey" forKey:@"last_name"];
    
        //     
        [request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"];
    
      //     mime        ,         mime ,    :
    
        ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://www.dreamingwish.com"]];
    
        // Upload a file on disk
        [request setFile:@"/Users/ben/Desktop/ben.jpg" withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"photo"]; 
    
        // Upload an NSData instance
        NSData *imageData = UIImagePNGRepresentation([UIImage imageNamed:@"myphoto.jpg"]);
        [request setData:imageData withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"photo"];
    
      //       addPostValue         name      :
    
        ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://www.dreamingwish.com"]];
    
        [request addPostValue:@"Ben" forKey:@"names"];
        [request addPostValue:@"George" forKey:@"names"];
    
    
    2,PUT 요청,사용자 정의 POST 요청
    PUT 요청 을 보 내 거나 POST 요청 을 사용자 정의 하려 면 appendPostData:또는 appendPostDataFromFile 을 사용 하 십시오.
    
      ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://www.dreamingwish.com"]];
    
      [request appendPostData:[@"This is my data" dataUsingEncoding:NSUTF8StringEncoding]];
    
      // Default becomes POST when you use appendPostData: / appendPostDataFromFile: / setPostBody:
      [request setRequestMethod:@"PUT"];
    
    
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기