네트워크 통신

ulls12·2024년 1월 4일
0

Swift TIL

목록 보기
27/60
post-thumbnail

URL 구성요소

http://api.example.com:433/users?page=2&sort=desc

프로토콜 도메인 포트 경로 쿼리 매개변수

  • 프로토콜 (Protocol)
    URL은 일반적으로 http:// 또는 https:// 와 같은 프로토콜로 시작한다.
    - http:// -> 보안 없는 통신
    - https:// -> SSL/TLS 암호화를 사용하여 보안된 통신을 나타낸다
  • 도메인 (Domain)
    API 서버가 호스팅되는 서버의 주소를 나타낸다
  • 포트 (Port, 옵션)
    포트 번호는 서버에서 API 요청을 수신하는데 사용되는 포트를 나타낸다. 대부분의 HTTP 기본 포트는 80이고, HTTPS의 기본 포트는 443 이다. 일반적인 경우, 기본 포트는 생략하다.
  • 경로 (Path)
    서버에서 요청된 자원이나 서비스의 위치를 나타낸다. /users 경로는 사용자 지원에 대한 요청을 나타낸다. 경로는 엔드포인트와 관련되어 특정 지원이나 서비스를 식별한다
  • 쿼리 매개변수 (Query Parameters, 옵션)
    URL에 추가 정보를 전달하는데 사용
    ?page=2&sort=desc 와 같이 사용자가 원하는 페이지 번호나 정렬 방법을 서버에 전달할 수 있다

REST API

REST는 HTTP 프로토콜을 기반으로 하며, 클라이언트와 서버 간의 통신을 위한 규칙을 정의한다

HTTP 메서드

  • GET: 자원을 읽기 위해 사용한다
  • POST: 새로운 자원을 생성하기 위해 사용한다 - 역동적이지 않다 ( ex. 유저를 생성(가입)한다)
  • PUT: 기존 자원을 업데이트하기 위해 사용한다 - 역동적 ( ex. 유저를 수정한다)
  • DELETE: 자원을 삭제하기 위해 사용한다
    ** 역동성: 여러번 요청해도 모든 결과값이 동일한 성질

자원 (Resources)

REST API에서는 모든 데이터가 자원으로 표현된다
이러한 자원은 고유한 식별자(URL)를 갖고 있다

URI (Uniform Resource Identifier)

자원은 고유한 식별자인 URI를 갖는다. URI는 자원을 찾을 수 있는 주소를 나타낸다.

  • URL과 URI의 차이
    URI는 리소스를 식별하기 위한 일반적인 용어이며, URL은 리소스의 위치를 나타내는 구체적인 형태의 URI라는 점에서 차이가 있다. https://example.com/users/123

표현 (Representations)

자원의 상태는 여러 형식으로 표현될 수 있다. 일반적으로는 JSON 형식을 사용하여 데이터를 표현한다.

연결 (Stateless Communication)

REST API는 클라이언트와 서버 간의 통신을 위해 연결을 유지하지 않는다. 각 요청은 독립적으로 처리된다


URLSession

네트워크 데이터를 가져오거나 보내는 작업을 수행한다

주요 특징

  • 비동기적 네트워킹 (Asynchronous Networking)
    URLSession은 비동기적으로 네트워크 요청을 처리하므로, 네트워크 작업이 백그라운드에서 수행될 수 있다
  • 다양한 데이터 전송 방식 지원
  • 캐시와 쿠키 관리 가능

GET 예시

import Foundation
// URLSession 인스턴스 생성
let session = URLSession.shared
// URL 생성
if let url = URL(String: "https://api.example.com/data") {
	let task = session.dataTask(with.url) { (data, response, error) in
    	if let error = error {
    		print("Error: \(error)")
        } else if let data = data {
        	print("Received data: \(data)")
        }
	}
    task.resume()
}

URLRequest를 사용한 POST 예시

import Foundation

// URLSession 인스턴스 생성
let session = URLSession.shared

// URL 생성
if let url = URL(string: "https://api.example.com/data") {
  // URLSessionDataTask를 사용하여 비동기적으로 데이터 요청
  
  // URLRequest 생성
  var request = URLRequest(url: url)
  
  // HTTP 메서드 설정 (POST)
  request.httpMethod = "POST" // GET / PUT / DELETE 사용 가능

  // HTTP 헤더 설정
  request.addValue("application/json", forHTTPHeaderField: "Content-Type")
  
  // HTTP Body에 보낼 데이터 설정 (JSON 형식)
  let parameters: [String: String] = [
    "value1": "example value",
    "value2": "example value"
    // 추가적인 필요한 데이터 추가 가능
  ]
  
  // HTTP Body에 JSON 데이터 설정
  request.httpBody = try? JSONEncoder().encode(parameters)
  
  let task = session.dataTask(with: request) { (data, response, error) in
    if let error = error {
      print("Error: \(error)")
    } else if let data = data {
      // 데이터를 받아온 후 처리하는 로직을 작성
      print("Received data: \(data)")
    }
  }
  
  // 네트워크 요청 시작
  task.resume()
}
      
profile
I am 개발해요

0개의 댓글