본문 바로가기
Ios

RESTful API 사용하기

by 잘먹는 개발자 에단 2024. 8. 21.

1. URLSession

URLSession은 Swift에서 HTTP 요청을 처리하기 위한 기본 클래스입니다.

이 클래스는 서버에 요청을 보내고, 서버로부터 응답을 받아서 처리하는 역할을 합니다.

 

URLSession은 네트워크 작업을 처리하는 다양한 메서드를 제공하며, 

데이터 작업, 파일 작업, 다운로드 작업 등을 지원합니다.

 

예를 들어서, GET 요청을 통해서 서버에서 데이터를 가져오고 싶다면, 

URLSession의 dataTask(with : completionHandler:) 메서드를 사용할 수 있습니다.

 

이 메서드는 지정된 URL로 요청을 보내고, 응답 데이터를 클로저를 통해 처리할 수 있게 해줍니다.

 

 

 

2. Codable

Codable 프로토콜은 Swift에서 데이터를 쉽게 인코딩하고 디코딩할 수 있도록 도와주는 프로토콜입니다.

RESTful API를 통해 서버에서 JSON형식의 데이터를 받을 때, 이 데이터를 Swift 객체로 변환하거나, 

Swift 객체를 JSON 데이터로 변환할때 Codable을 사용할 수 있습니다.

 

Codable은 Encodable과 Decodable 프로토콜의 결합체로, 데이터를 인코딩하고 디코딩할 수 있는 타입임을 나타냅니다.

JSON 데이터를 Swift 객체로 디코딩할 때는 Decodable을 사용하고, Swift 객체를 Json데이터로 인코딩할 때는 Encodable을 사용합니다.

 

import Foundation

// 데이터를 구조화하기 위해 Codable을 채택한 구조체 정의
struct User: Codable {
    let id: Int
    let name: String
    let username: String
    let email: String
}

// 서버에 GET 요청을 보내는 함수
func fetchUsers() {
    // 요청을 보낼 URL을 정의
    guard let url = URL(string: "https://jsonplaceholder.typicode.com/users") else { return }

    // URLSession을 통해 요청을 생성하고, 응답을 처리하는 작업을 정의
    let task = URLSession.shared.dataTask(with: url) { data, response, error in
        // 오류가 발생했는지 확인
        if let error = error {
            print("Error: \(error.localizedDescription)")
            return
        }

        // 응답 데이터가 있는지 확인
        guard let data = data else {
            print("No data received.")
            return
        }

        // JSON 데이터를 디코딩하여 User 객체 배열로 변환
        do {
            let users = try JSONDecoder().decode([User].self, from: data)
            print("Users: \(users)")
        } catch {
            print("Decoding error: \(error.localizedDescription)")
        }
    }

    // 작업 실행
    task.resume()
}

// 함수 호출
fetchUsers()

 

 

 

 

다음은 GET 요청의 예제입니다.

import Foundation

// 1. URL 객체 생성 - 요청할 URL을 문자열로 초기화하여 URL 객체를 생성합니다.
let url = URL(string: "https://example.com/api")!

// 2. Request 설정 - URLRequest 객체를 생성하고, 해당 요청의 HTTP 메서드를 "GET"으로 설정합니다.
var request = URLRequest(url: url)
request.httpMethod = "GET"  // GET 요청으로 설정

// 3. 데이터 태스크 생성 - URLSession의 dataTask 메서드를 사용하여 서버에 요청을 보낼 태스크를 만듭니다.
let task = URLSession.shared.dataTask(with: request) { data, response, error in
    // 4. 에러 체크 - 요청 중 에러가 발생했는지 확인합니다.
    if let error = error {
        print("에러 발생: \(error.localizedDescription)")
        return
    }

    // 5. 응답 데이터 처리 - 응답으로 받은 데이터가 존재하는지 확인합니다.
    if let data = data {
        do {
            // 6. JSON 데이터 파싱 - 응답 데이터를 JSON 형식으로 변환합니다.
            let json = try JSONSerialization.jsonObject(with: data, options: [])
            // 7. JSON 데이터 처리 - 파싱한 JSON 데이터를 이용해 무언가를 합니다.
            print("응답 데이터: \(json)")
        } catch {
            // 8. 에러 핸들링 - JSON 파싱 중 에러가 발생한 경우 이를 처리합니다.
            print("JSON 파싱 실패: \(error.localizedDescription)")
        }
    } else {
        print("데이터가 없습니다.")  // 응답 데이터가 없는 경우 처리
    }
}

// 9. 태스크 실행 - 위에서 구성한 태스크를 실행하여 서버에 요청을 보냅니다.
task.resume()

 

 

다음은 POST 요청의 예제입니다.

 

import Foundation

// 1. URL 생성
let url = URL(string: "https://example.com/api")!

// 2. Request 설정
var request = URLRequest(url: url)
request.httpMethod = "POST"  // POST 요청으로 설정

// 3. 요청에 포함될 데이터 생성
let parameters: [String: Any] = [
    "username": "exampleUser",
    "password": "examplePass"
]

// 4. JSON 데이터로 변환
do {
    request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: [])
} catch {
    print("JSON 변환 실패: \(error.localizedDescription)")
}

// 5. Content-Type 헤더 추가
request.addValue("application/json", forHTTPHeaderField: "Content-Type")

// 6. 데이터 태스크 생성
let task = URLSession.shared.dataTask(with: request) { data, response, error in
    if let error = error {
        print("에러 발생: \(error.localizedDescription)")
        return
    }

    guard let data = data else {
        print("데이터가 없습니다.")
        return
    }

    // 7. JSON 응답 파싱
    do {
        let json = try JSONSerialization.jsonObject(with: data, options: [])
        // json 데이터를 이용하여 작업 수행
        print("응답 데이터: \(json)")
    } catch {
        print("JSON 파싱 실패: \(error.localizedDescription)")
    }
}

// 8. 태스크 시작
task.resume()

'Ios' 카테고리의 다른 글

Ad Hoc으로 IOS 어플리케이션 내부 배포하기  (3) 2024.09.09
클로저에 대해서 알아보자  (0) 2024.08.16
self에 대해서 알아보자  (0) 2024.08.16
struct 그리고 class  (0) 2024.08.16
as에 대해서 알아보자  (0) 2024.08.16