2016년 4월 21일 목요일

swift 에서 URLRequest, JSON 파싱 (REST API 클라이언트 개발)

2013년 앱개발 알바를 할때는 다음과 같은 기록을 남겼다.

http://mtsparrow.blogspot.kr/2013/04/ios-json.html

2016년 swift 에서는 어떻게 해야 하는가?

http://mtsparrow.blogspot.kr/2016/03/cocoapod.html

코코아 팟을 이용해서 오픈 소스 중에 JSON과  URLRequest를 편리 하게 해주는
오픈 소스 두개를 추가 한다.

SwiftyJSON
https://github.com/swiftjson/SwiftJson


Alamofire

https://github.com/Alamofire/Alamofire


다음은 간단한 예제 코드이다.

    var arrRes = [[String:AnyObject]]() // Array of dictionary
    var reqParam = [ String:AnyObject]()


func RequestRestAPI() {
        // 요청 키 밸류
        reqParam = [
            "--":"--",
            "--":"--",
            "--":"--",
            "--":"--",
            "--":"--",
            "--":"--",
            "--":"--",
            "--":"--",
            "--":"--"
        ]
        
        print(reqParam)
        

        ActIndicator.startAnimating() 
        Alamofire.request(.POST, "https://URL~~~blahblah/api/", parameters: reqParam).responseJSON { (responseData) -> Void in
            self.ActIndicator.stopAnimating()
            if responseData.result.value != nil {
                let swiftyJsonVar = JSON(responseData.result.value!)
                
                print(swiftyJsonVar["result"])
                print(swiftyJsonVar["message"])
                if swiftyJsonVar["result"].stringValue == "true" {
                    if let resData = swiftyJsonVar["data"].arrayObject {
                        self.arrRes = resData as! [[String:AnyObject]]
                    }
                    print(self.arrRes)
                    
                    // 응답 성공 arrRes에  딕셔너리에서 결과 키 밸류를 이용해서 처리 한다.
                    
                } else {
                    // 에러 응답 처리
                }
            } else {
               // 네트워크 에러 처리

            }
        }

    }


간단하게 설명을 하자면

ActIndicator.startAnimation()은 엑티비티 인디케이터를 네트워크 시작시 에니메이션을 시작 한다.

Alamofire.request 로 REST API에 URL을 주고 reqParam으로 정의된 키벨류를 전달 한다.

네트워크 요청이 완료되면 Alamofire.request의 블럭 코딩 부분이 수행되며 액티비티 인디케이터 에니 메이션을 종료 하고 SwiftyJSON을 이용한 결과 데이터를 얻어내면 된다.

위 예제는 응답 결과를 JSON을 받고 약속된 프로코톨로 result, message, data 키로 받게 되어 있다.
REST API마다 JSON의 형태는 다를 것이고 이경우 result, message, data는 동일 하며
data의 형태는 다시 키벨류 쌍으로 REST API tag의 따라 다양하게 정의된 경우 이다.

// 응답 성공의 경우 data의 arrayObject를 self.arrRes에 할당 했으며 데이터 타입은 String:AnyObject이다.

정의된 String Key로 값을 접근하면 된다.


댓글 2개:

케이크류 :

JSON 데이터 포맷이 규격화 되어있고 자주 쓴다면
https://github.com/tristanhimmelman/AlamofireObjectMapper

을 도입해보는 것도 고려할만합니다.

sparrow :

좋은 정보 감사합니다.