개발 - iOS SwiftUI

iOS SwiftUI HTTP POST 요청 후 JSON 응답 파싱 예제

개미v 2023. 10. 18. 13:24

SwiftUI에서 HTTP POST 요청후 JSON 응답 처리하는 기본 예제 입니다.

가독성 좋게 옵셔널은 Unwrapp 하였습니다.

 

JSON 형식으로 POST 요청 예제

import SwiftUI
import WebKit

struct IntroView: View {
    
    var body: some View {
        VStack {
        }
        .task() {
            await startTask()
        }
    }
    
    func startTask() async {
        // 서버 사용자 정보 확인
        let body: [String: Any] = ["userId": "test01", "authToken": "11111111111111"]
        
        let jsonData = try? JSONSerialization.data(withJSONObject: body)
        
        // HTTP 요청
        let url = URL(string: Define.serverUrl + "/member/select.ajax")!
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.addValue("\(String(describing: jsonData?.count))", forHTTPHeaderField: "Content-Length")
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.httpBody = jsonData
        
        // HTTP 요청 결과 처리
        let dataTask = URLSession.shared.dataTask(with: request) {data, response, error in
            
            // HTTP 응답코드가 400번대, 500번대의 경우 리턴
            let httpResponse = response as! HTTPURLResponse
            if httpResponse.statusCode >= 400 && httpResponse.statusCode <= 599 {
                print(httpResponse.statusCode)
            }
            
            // HTTP 결과
            let httpResponseJson = try! JSONDecoder().decode(HttpResponseJson.self, from: data!)
            
            print(httpResponseJson.code)
            print(httpResponseJson.msg)
            print(httpResponseJson.data)
        }
        dataTask.resume()
    }
}

// HTTP 응답 JSON에 맵핑되는 구조체
struct HttpResponseJson: Decodable {
    let code: String
    let msg: String
    let data: String
}

 

URL 인코딩 형식으로 POST 요청 예제

import SwiftUI
import WebKit

struct IntroView: View {
    
    var body: some View {
        VStack {
        }
        .task() {
            await startTask()
        }
    }
    
    func startTask() async {
        // 서버 사용자 정보 확인
        var requestBodyComponents = URLComponents()
        requestBodyComponents.queryItems = []
        requestBodyComponents.queryItems?.append(URLQueryItem(name: "userId", value: "test01"))
        requestBodyComponents.queryItems?.append(URLQueryItem(name: "authToken", value: "11111111111111"))
        let body = requestBodyComponents.query?.data(using: .utf8)

        // HTTP 요청
        let url = URL(string: Define.serverUrl + "/member/select.ajax")!
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.addValue("\(String(describing: body?.count))", forHTTPHeaderField: "Content-Length")
        request.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        request.httpBody = body
        
        // HTTP 요청 결과 처리
        let dataTask = URLSession.shared.dataTask(with: request) {data, response, error in
            
            // HTTP 응답코드가 400번대, 500번대의 경우 리턴
            let httpResponse = response as! HTTPURLResponse
            if httpResponse.statusCode >= 400 && httpResponse.statusCode <= 599 {
                print(httpResponse.statusCode)
            }
            
            // HTTP 결과
            let httpResponseJson = try! JSONDecoder().decode(HttpResponseJson.self, from: data!)
            
            print(httpResponseJson.code)
            print(httpResponseJson.msg)
            print(httpResponseJson.data)
        }
        dataTask.resume()
    }
}

// HTTP 응답 JSON에 맵핑되는 구조체
struct HttpResponseJson: Decodable {
    let code: String
    let msg: String
    let data: String
}