본문 바로가기
카테고리 없음

[Swift] HTTP 통신 방법과 API 호출

by Joseph Seong 2023. 7. 11.

1. URLSession을 사용한 통신 방법

  • URL 객체를 생성한다.
  • Request 객체를 생성한다.
  • URLSession을 이용하여 데이터를 전달한다.
  • URLSessionTask로 작업을 나타낸다.

   🔎 URLSession

 

  • 앱과 서버 간 데이터를 주고 받는  API를 제공하는 클래스
  • HTTP를 포함한 몇 가지 프로토콜을 지원하고 인증, 쿠키 관리, 캐시 관리 등을 지원      

2. URLSession의 Request와 Response

  • Request
    • URL 인스턴스를 통해 직접 통신하는 형태
    • URLRequest 인스턴스를 만들어 옵션을 설정하여 통신하는 형태
  • Response
    • 설정된 Task의 Completion Handler 형태
    • URLSessionDelegate를 통해 지정된 메서드를 호출하는 형태

3. URLComponents를 이용한 URL 생성

 

    🔎 URLComponents란

 

  • URL을 구성하는 구조
  • URL을 더 쉽게 생성하게 도와준다.                 
import Foundation

// URLComponents를 사용하여 URL 구성
var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "www.example.com"
urlComponents.path = "/api/v1/users"
urlComponents.queryItems = [
    URLQueryItem(name: "page", value: "1"),
    URLQueryItem(name: "per_page", value: "10")
]

// URL 구성 요소를 사용하여 URL 생성
if let url = urlComponents.url {
    print("URL: \(url)") // 출력: "URL: https://www.example.com/api/v1/users?page=1&per_page=10"
}

 

🖍️ URLComponents를 사용하는 이유

 

  • scheme, host, path, queryItems로 나뉘어져 있는데 path와 queryItems가 바뀔 때 마다 전체 주소를 변경하면 번거롭다.
  • URLComponents를 사용하여 따로 관리하면 변경되는 부분만 수정하면 된다!

 

4.  URLRequest 객체 생성

    🔎 구성요소

  • url: 요청의 대상 URL
  • httpMethod: 요청에 사용되는 HTTP 메서드 (예: "GET", "POST", "PUT", "DELETE" 등)
  • allHTTPHeaderFields: 요청의 모든 HTTP 헤더 필드를 포함하는 딕셔너리
  • httpBody: 요청의 HTTP 본문
  • cachePolicy: 요청에 사용되는 캐시 정책
  • timeoutInterval: 요청의 타임아웃 시간 (초)
// URLRequest 인스턴스 생성
var request = URLRequest(url: url)
request.httpMethod = "POST" // 요청에 사용할 HTTP 메서드 설정

// HTTP 헤더 설정
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")

// HTTP 바디 설정
let body = [
    "title": "My first post",
    "body": "This is the content of my first post",
    "userId": 1
] as [String: Any]

do {
    request.httpBody = try JSONSerialization.data(withJSONObject: body, options: [])
} catch {
    print("Error creating JSON data")
}

 

5.  URLSession을 이용하여 요청과 응답 처리

  • URLSession에서 URL에 요청을 한 후 dataTask에서 응답이 오면 코드를 수행한다.
// URLSession을 사용하여 요청 수행
let task = URLSession.shared.dataTask(with: request) { data, response, error in
    if let error = error {
        print("Error: \(error)")
    } else if let data = data, let response = response as? HTTPURLResponse, response.statusCode == 201 {
        do {
            if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
                print("JSON Response: \(json)")
            }
        } catch {
            print("Error parsing JSON response")
        }
    } else {
        print("Unexpected error")
    }
}

task.resume() // 작업 시작

🔎  URLSessionTask 

 

  • URLSession 작업 하나를 나타내는 추상 클래스
  • 작업 유형
    1. URLSessionDataTask (HTTP GET)
      • 서버에서 메모리로 데이터를 받아오는 작업 수행
      • 백그라운드에서는 지원되지 않는다.
    2. URLSessionUploadTask (HTTP POST/PUT)
      • 서버에서 메모리로 데이터를 받아오는 작업 수행
      • DataTask 보다 Upload에 특화되어 있으며, file 형태 업로드할 때 사용
      • 백그라운드에서 업로드 지원
    3. URLSessionDownloadTask
      • file 형태의 데이터를 다운 받을 때 사용
      • 백그라운드에서 업로드 지원
    4. URLSessionStreamTask
      • 양방향의 TCP/IP 연결을 통해 메세지를 교환할 때 사용

 


📌   네트워크 통신 과정 흐름 

 

  • URL생성 → URL에 요청할 정보 입력 → 해당 URL에 작업 요청 → 작업이 완료된 후 응답 처리

 

 

 

 

<출처 : 주코의 iOS 개발일기>