Swift로 iOS 앱에서 HTTP 요청 보내기
iOS 앱에서 HTTP 요청을 처리하려면 URLSession과 dataTask를 활용해야 합니다. 이 과정에서는 설정(configuration), 세션(session), URL, 요청(request), 데이터 태스크(dataTask) 객체를 차례로 생성하게 됩니다.
HTTP 요청에는 여러 종류가 있으며, 서버에 어떤 작업을 수행할지에 따라 달라집니다. 기본적인 요청 유형은 다음과 같습니다.
- GET: 데이터 조회
- POST: 데이터 생성
- PUT: 데이터 수정
- DELETE: 데이터 삭제
API 설계에 따라 위 유형 중 하나를 선택해 사용하면 됩니다. 각 요청의 기본 구조는 모두 동일하며, 이 글에서는 DELETE 방식을 예시로 단계별로 살펴보겠습니다.
1단계: 세션(Session) 객체 생성
먼저 기본 설정(default configuration)으로 세션 객체를 생성합니다.
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration)
2단계: URLRequest 생성
다음으로 필요한 유형(GET, POST, DELETE, PUT 중 하나)의 URLRequest를 생성합니다. 이 예제에서는 DELETE 방식을 사용합니다.
let url = URL(string: URLString)
var request : URLRequest = URLRequest(url: url!)
request.httpMethod = "DELETE"
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)
var request : URLRequest = URLRequest(url: url!)
request.httpMethod = "DELETE"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
let dataTask = session.dataTask(with: url!) { data,response,error in
// 1: 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가 필요하기 때문에 별도의 출력 결과는 표시되지 않습니다.