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

Swift로 iOS 앱에서 HTTP POST 요청 보내는 방법 완벽 가이드

iOS 앱에서 서버와 통신하려면 HTTP 요청을 보낼 수 있어야 합니다. Swift에서는 URLSessiondataTask를 활용해 GET, POST, PUT, DELETE 등 다양한 방식의 네트워크 요청을 처리할 수 있습니다. 이 글에서는 그중 POST 요청을 보내는 방법을 단계별로 살펴보겠습니다.

HTTP POST 요청의 기본 흐름

POST 요청을 구현하려면 크게 세 가지 객체가 필요합니다.

  • URLSessionConfiguration – 세션의 동작 방식을 정의하는 설정 객체
  • URLRequest – 요청 대상 URL, HTTP 메서드, 헤더 정보를 담는 객체
  • dataTask – 실제 네트워크 통신을 수행하고 응답을 처리하는 작업 객체

이제 각 단계를 자세히 알아보겠습니다.

1단계: URLSession 세션 생성하기

먼저 기본 설정(default configuration)으로 세션 객체를 생성합니다. URLSessionConfiguration은 타임아웃, 캐시 정책 등 네트워크 동작을 제어하는 역할을 합니다.

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

2단계: URLRequest 객체 만들기

다음으로 요청할 URL을 기반으로 URLRequest 객체를 생성합니다. HTTP 메서드는 GET, POST, DELETE, PUT 중 목적에 맞게 지정할 수 있으며, 여기서는 POST 방식을 사용합니다. 또한 JSON 데이터를 주고받기 위해 Content-Type과 Accept 헤더를 설정합니다.

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

참고: POST 요청 시 본문(body)에 데이터를 담아 보내야 한다면 request.httpBody = try? JSONSerialization.data(withJSONObject: parameters) 형태로 추가할 수 있습니다.

3단계: dataTask로 요청 실행하기

요청 객체가 준비되면 세션의 dataTask 메서드를 호출해 실제 통신을 수행합니다. 응답이 도착하면 클로저 내부에서 상태 코드를 확인해 성공(200), 잘못된 요청(400) 등을 분기 처리할 수 있습니다.

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: //success response.
            break
        case 400:
            break
        default:
            break
    }
}
dataTask.resume()

주의: dataTask는 생성만으로는 실행되지 않으며, 반드시 resume()을 호출해야 네트워크 작업이 시작됩니다.

4단계: 함수로 묶어 재사용하기

위 과정을 하나의 함수로 감싸면 프로젝트 어디에서든 손쉽게 API를 호출할 수 있습니다.

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 = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    let dataTask = session.dataTask(with: url!) {
        data,response,error in
        // 1: Check HTTP Response for successful GET request
        guard let httpResponse = response as? HTTPURLResponse, let receivedData = data
        else {
            print("error: not a valid http response")
            return
        }
        switch (httpResponse.statusCode) {
            case 200:
                //success response.
                break
            case 400:
                break
            default:
                break
        }
    }
    dataTask.resume()
}

App Transport Security 예외 처리

HTTPS가 아닌 HTTP API에 접속해야 하는 경우, Info.plist 파일에서 ATS(App Transport Security) 예외를 허용해 주어야 합니다. NSAppTransportSecurity 키 아래에 NSAllowsArbitraryLoadstrue로 설정하면 됩니다. 단, 보안상 가능한 한 HTTPS 통신을 사용하는 것이 권장됩니다.

마무리

이 예제는 실제로 데이터를 전송할 API 서버가 필요하기 때문에 별도의 출력 결과는 표시되지 않습니다. 실제 프로젝트에서는 위 함수에 유효한 API 엔드포인트를 전달하고, 응답 데이터를 파싱하여 화면에 반영하면 됩니다. 더 나아가 Codable 프로토콜과 결합하면 JSON 디코딩까지 깔끔하게 처리할 수 있으니 참고해 보세요.