본문 바로가기
아이폰 개발/ios 개념&튜토리얼

ios HTTP POST 방식 요청 - json 타입요청

by 인생여희 2020. 12. 17.

ios POST 방식 요청 - json 타입요청

 

이번포스팅에서는 HTTP POST 방식으로 요청하는 방법에 대해서 알아본다. HTTP 요청 방법에 대해서는 지난 포스팅에서도 다루었으니 참고하면 도움이 될것 같다.

 

IOS NSURLSession으로 Get 요청 Post 요청하기 - 개념

IOS NSURLSession으로 Get 요청 Post 요청 - 구현

 

 

1.화면 생성

스토리 보드에서 화면을 아래와 같이 생성해준다. 요청은 모두 HTTP POST 방식으로 요청을 할 건데, 한번은 application/x-www-form-urlencoded 타입으로 요청하고 한번은 application/json 타입으로 요청한다.

 

 

 

2.변수선언

스토리 보드에서 만든 textfield, textView 객체를 화면과 이어준다.

 

ViewController.h

 

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

//유저 아이디
@property (strong, nonatomic) IBOutlet UITextField *userId;

//유저 이름
@property (strong, nonatomic) IBOutlet UITextField *name;

//응답 텍스트 뷰
@property (strong, nonatomic) IBOutlet UITextView *responseView;


@end

 

3. post 버튼 클릭

먼저 application/x-www-form-urlencoded 타입으로 요청하는 로직을 살펴보자. 전송할 데이터를 준비하고, NSData 객체에 파라미터를 담고 인코딩 해준다. 그리고 NSURL 객체로 요청 URL을 작성해 주고 NSMutableURLRequest 객체를 요청 URL을 이용해서 초기화 해준다. 그리고 HTTP 메세지 헤더를 설정하고 NSURLSession 객체로 요청을 보낸다.

 

//포스트 방식으로 요청
- (IBAction)post:(id)sender {
    
    //1.전송할 데이터 준비
    NSString *userId = self.userId.text;
    NSString *name = self.name.text;
    
    //2.url param 형식 지정
    NSString *param = [NSString stringWithFormat:@"userId=%@&name=%@",userId,name];
    
    //3.파라미터 인코딩
    NSData *paramData = [param dataUsingEncoding:NSUTF8StringEncoding];
    
    //4.요청 URL 작성
    NSURL *url = [NSURL URLWithString:@"http://swiftapi.rubypaper.co.kr:2029/practice/echo"];
    
    //5.요청 객체 생성
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
    //5-1. HTTP 메시지 헤더 설정 -
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:paramData];
    
    //5-2. 콘텐츠 타입
    [request addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    
    //5-3. 콘텐츠 길이
    NSString *length = [NSString stringWithFormat: @"%lu", (unsigned long)paramData.length];
    [request setValue:length forHTTPHeaderField:@"Content-Length"];
    
    
    //6.Session 생성
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task =
    [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
       
        //8.에러 처리
        if (error) {
            NSLog(@"에러 발생 : %@" , error.description);
            return ;
        }
        
        //9.데이터 가공처리
        if (data != nil) {
            
          //9-1. JSON 결과 값 추출
          NSDictionary *json =  [NSJSONSerialization
                                  JSONObjectWithData:data
                                  options:kNilOptions error:&error];
            
            NSString * result = [json objectForKey:@"result"];
            NSString * timestamp = [json objectForKey:@"timestamp"];
            NSString * userId = [json objectForKey:@"userId"];
            NSString * name = [json objectForKey:@"name"];
            
            NSString *resultSTR = [NSString stringWithFormat:@"id : %@ \n name : %@ \n 결과 : %@ \n 응답시간 : %@ \n 요청방식 : %@" , userId, name,result,timestamp,@"x-www-form-urlencoded"];
            
            //9-2. 서버응답 체크
            if ([result isEqualToString:@"SUCCESS"]) {
                
                //10. UI 처리는 메인 스레드에서 비동기로 처리
                dispatch_async(dispatch_get_main_queue(), ^{
                    self.responseView.text = resultSTR;
                });
            }
        }
        
    }];
    
    //7.Post 전송
    [task resume];
    
}

 

4. json 버튼 클릭

내용은 3번과 동일하다. 데이터를 전송할때 위에는 POST 방식으로 파라미터를 BODY 부분에 넣어서 인코딩해서 보냈다면, 여기서는 JSON 형태로 요청한다는게 차이점이다.

 

//JSON 형태로 데이터 전송
- (IBAction)json:(id)sender {
    
    //1.전송할 데이터 준비
    NSString *userId = self.userId.text;
    NSString *name = self.name.text;
    
    //2.JSON 객체로 변환할 딕셔너리 준비
    NSDictionary *param = @{@"userId":userId, @"name":name};
    
    //3.딕셔너리 => JSON객체로 변환
    NSData *paramData = [NSJSONSerialization dataWithJSONObject:param options:NSJSONWritingPrettyPrinted error:nil];

    

    //4.URL 준비
    NSURL *url = [NSURL URLWithString:@"http://swiftapi.rubypaper.co.kr:2029/practice/echoJSON"];
    
    //5.NSMutableURLRequest 객체 생성
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //6. HTTP 메시지 헤더 설정 -
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:paramData];
    
    //6-1. 콘텐츠 타입 - JSON
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    
    //6-2. 콘텐츠 길이
    NSString * length =  [NSString stringWithFormat:@"%lu" , (unsigned long)paramData.length];
    [request setValue:length forHTTPHeaderField:@"Content-Length"];
    
    
    
    //7.Session 생성 및 전송 + 응답값 처리
    NSURLSession *session =  [NSURLSession sharedSession];
    NSURLSessionDataTask *task  = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        
        //9.에러 처리
        if (error) {
            NSLog(@"에러 발생 : %@" , error.description);
            return ;
        }
        
        //10.데이터 가공처리
        if (data != nil) {
        
            //10-1. JSON 결과값 추출
            NSDictionary *json = [NSJSONSerialization
                                  JSONObjectWithData:data
                                  options:kNilOptions error:&error];
            
            NSString * result = [json objectForKey:@"result"];
            NSString * timestamp = [json objectForKey:@"timestamp"];
            NSString * userId = [json objectForKey:@"userId"];
            NSString * name = [json objectForKey:@"name"];
            
            NSString *resultSTR = [NSString stringWithFormat:@"id : %@ \n name : %@ \n 결과 : %@ \n 응답시간 : %@ \n 요청방식 : %@" , userId, name,result,timestamp,@"application/json"];
            
            
            
            //11. 서버응답 체크
            if ([result isEqualToString:@"SUCCESS"]) {
                
                //12. UI 처리는 메인 스레드에서 비동기로 처리
                dispatch_async(dispatch_get_main_queue(), ^{
                    self.responseView.text = resultSTR;
                });
            }
 
        }

    }];
    
    //8.POST 전송
    [task resume];

}

 

5.완성

완성

 

 

예제파일

 

NSURLSessionTest 2.zip
0.05MB

 

 

 

NSURLSession 연재 포스팅

IOS NSURLSession으로 Get 요청 Post 요청하기 - 개념

IOS NSURLSession으로 Get 요청 Post 요청 - 구현

 

 

 

*꼼꼼한 재은 씨의 스위프트 실전편 도서 참고

 

*NSURLSession 참고

https://myksb1223.github.io/develop_diary/2018/10/22/How-to-use-NSURLSession.html

 

*Objective C NSDictionary Json string 변환

https://wefu.tistory.com/76