투케이2K

311. (ios/objc) NSURLSession 사용해 http 요청 수행 및 콜백 (callback) 응답 확인 본문

IOS

311. (ios/objc) NSURLSession 사용해 http 요청 수행 및 콜백 (callback) 응답 확인

투케이2K 2022. 11. 21. 08:16

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : Objc

 

[http 요청 : 소스 코드]

    // [HTTP 통신 콜백 메소드 호출 실시]
    NSString *url = @"http://jsonplaceholder.typicode.com/posts?";
    
    NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
    [params setObject:@"1" forKey:@"userId"];
    [params setObject:@"1" forKey:@"id"];
    
    [self getHttpCallBack:url :params :^(BOOL returnBool, NSString *returnString) {
        if (returnBool == true){
            printf("\n");
            printf("==================================== \n");
            printf("[ViewController >> getHttpCallBack() :: HTTP 통신 콜백 결과 확인 실시] \n");
            printf("[RETURN :: %s] \n", @"SUCCESS".description.UTF8String);
            printf("[DATA :: %s] \n", returnString.description.UTF8String);
            printf("==================================== \n");
            printf("\n");
        }
        else {
            printf("\n");
            printf("==================================== \n");
            printf("[ViewController >> getHttpCallBack() :: HTTP 통신 콜백 결과 확인 실시] \n");
            printf("[RETURN :: %s] \n", @"FAIL".description.UTF8String);
            printf("[DATA :: %s] \n", returnString.description.UTF8String);
            printf("==================================== \n");
            printf("\n");
        }
    }];
 

[http 메소드 : 소스 코드]

// MARK: - [헤더 파일에 정의 없이 : void 메소드 구현]
-(void)getHttpCallBack:(NSString *)urlData :(NSMutableDictionary *)params :(void (^)(BOOL returnBool, NSString *returnString))completion{
    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> getHttpCallBack() :: HTTP 통신 콜백 메소드 수행 실시] \n");
    printf("==================================== \n");
    printf("\n");
    
    
    // [초기 주소 매핑 수행 실시]
    NSString *url = urlData;
    
    
    // [파라미터 삽입 실시]
    if (params != nil && params.count > 0){
        
        // [for 문을 돌면서 순차적으로 key , value 확인 실시]
        for (NSString *keyData in params.allKeys){
            NSString *valueData = [NSString stringWithFormat:@"%@" , params[keyData]];
            
            // [주소 포맷 수행 실시]
            url = [url stringByAppendingString:keyData];
            url = [url stringByAppendingString:@"="];
            url = [url stringByAppendingString:valueData];
            url = [url stringByAppendingString:@"&"];
        }
        
        url = [url substringToIndex:url.length - 1];
    }
    
    
    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> getHttpCallBack() :: HTTP 통신 요청 정보] \n");
    printf("[URL :: %s] \n", url.description.UTF8String);
    printf("==================================== \n");
    printf("\n");
    
    
    // [http 통신 Request 선언]
    NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
    
    // [http 통신 메소드 지정]
    [urlRequest setHTTPMethod:@"GET"];
    
    // [http 통신 Content-Type 설정]
    [urlRequest setValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    
    // [NSURLSession 생성 실시]
    NSURLSession *session = [NSURLSession sharedSession];
    
    // [NSURLSessionDataTask http 통신 요청 처리]
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:urlRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
      
        // [응답 결과]
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
        
        // [리턴 데이터 선언]
        NSString * returnData = @"";
        
        // [에러 체크]
        if (error != nil){
            
            @try
            {
                returnData = error.localizedDescription;
            }
            @catch (NSException *exception)
            {
                NSLog(@"Http Request Exception [Error] :: %@", exception);
            }
            
            // [콜백 반환]
            completion(false, returnData);
        }
        else {
            // [상태 코드 확인]
            if(httpResponse.statusCode >= 200 && httpResponse.statusCode <= 300) {
                
                @try
                {
                    returnData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                }
                @catch (NSException *exception)
                {
                    NSLog(@"Http Request Exception [Response] :: %@", exception);
                }
                
                // [콜백 반환]
                completion(true, returnData);
            }
            else {
                // [상태 코드 에러]
                returnData = [returnData stringByAppendingString:@"State Code Error : "];
                returnData = [returnData stringByAppendingString:[@(httpResponse.statusCode) stringValue]];
                returnData = [returnData stringByAppendingString:@" : "];
                returnData = [returnData stringByAppendingString:[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]];
                
                // [콜백 반환]
                completion(false, returnData);
            }
        }
    }];
    [dataTask resume];
}
 

[결과 출력]

 

 

반응형
Comments