Computer >> 컴퓨터 >  >> 프로그래밍 >> iOS

Swift로 iOS/iPhone에서 RESTful API 호출하기: URLSession과 DataTask 활용법

iOS에서 RESTful 서비스에 접근하는 기본 원리

Swift에서 REST API에 접근하려면 네이티브 네트워킹 방식인 URLSessionDataTask를 사용해 일련의 단계를 거쳐야 합니다.

REST는 Representational State Transfer(표현 상태 전송)의 약자로, 웹 서비스가 따라야 할 일련의 제약 조건을 정의합니다. Swift에서는 다음과 같은 순서로 웹 서비스에 접근할 수 있습니다.

1단계: 세션(Session) 객체 생성

가장 먼저 기본 설정(default configuration)으로 세션 객체를 생성해야 합니다.

let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration)

2단계: URLRequest 객체 생성

다음으로 필요한 타입의 URL 요청(Request)을 만듭니다. 요청 타입은 GET, POST, DELETE, PUT 등이 있으며, 이 예제에서는 GET 방식을 사용합니다.

let url = URL(string: URLString)
//let url = NSURL(string: urlString as String)
var request : URLRequest = URLRequest(url: url!)
request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")

3단계: DataTask 실행

요청 객체를 생성한 후에는 앞서 만든 URL로 dataTask를 수행해야 합니다. 완성된 dataTask 메서드는 다음과 같은 형태입니다.

let dataTask = session.dataTask(with: url!) {
    data,response,error in
    guard let httpResponse = response as? HTTPURLResponse, let receivedData = data
    else { print("error: not a valid http response")
        return
    }
    switch (httpResponse.statusCode) {
        case 200: //성공 응답
            break
        case 400:
            break
        default:
            break
    }
}
dataTask.resume()

4단계: 함수로 재사용 가능하게 만들기

위 과정을 하나의 함수로 감싸면 코드 어디에서든 손쉽게 재사용할 수 있습니다.

func hitAPI(_for URLString:String) {
    let configuration = URLSessionConfiguration.default
    let session = URLSession(configuration: configuration)
    let url = URL(string: URLString)
    //let url = NSURL(string: urlString as String)
    var request : URLRequest = URLRequest(url: url!)
    request.httpMethod = "GET"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    let dataTask = session.dataTask(with: url!) {
        data,response,error in
        // 1: GET 요청 성공 여부를 HTTP 응답으로 확인
        guard let httpResponse = response as? HTTPURLResponse, let
        receivedData = data
        else {
            print("error: not a valid http response")
            return
        }
        switch (httpResponse.statusCode) {
            case 200:
                //성공 응답
                break
            case 400:
                break
            default:
                break
        }
    }
    dataTask.resume()
}

참고 사항

주의: 일부 API에 접근하려면 info.plist 파일에서 ATS(App Transport Security) 예외 설정을 허용해야 할 수 있습니다.

이 예제는 실제 데이터를 반환하는 API가 필요하기 때문에 별도의 출력 결과는 표시되지 않습니다. 실제 프로젝트에서는 위 함수에 유효한 API 엔드포인트 URL을 전달하여 사용하면 됩니다.