iOS에서 RESTful 서비스에 접근하는 기본 원리
Swift에서 REST API에 접근하려면 네이티브 네트워킹 방식인 URLSession과 DataTask를 사용해 일련의 단계를 거쳐야 합니다.
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을 전달하여 사용하면 됩니다.