3월 29일 (Rest API 및 JSON)

이승원·2024년 3월 29일
0

TIL

목록 보기
54/75
post-thumbnail

내배캠 챌린지반 과제

  • Github API를 사용해서 사용자의 정보 출력
  • Github API를 사용해서 사용자의 Repository 출력
  • 등등

REST API

  • Rest APIREST (Representational state transfer) 기반으로 만들어진 API 입니다.
  • REST
    • HTTP URI (uniform Resource Identifier)를 통해 자원을 명시하고
    • HTTP METHOD (Post, GET 등) 을 통해 CRUD Operation 을 적용한다.
    • HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 활용하는 아키택쳐이다.
  • REST의 특징은 아래와 같다.
    • 클라이언트 / 서버 구조 (Clinet Server Structure)
      • 각각의 역할이 분리/구분되어 있기 때문에, 서로간 의존성이 줄어든다.
    • 무상태성 (stateless)
      • HTTP의 특성을 이용하기 때문에, 상태정보를 기억할 필요가 없고, 요청이 들어온것에만 처리를 해주면 되기 때문에, 구현/비용 면에서 장점을 갖는다.
    • 캐시 처리 기능 (Cacheable)
      • 대략의 요청을 효율적으로 처리할 수 있는 캐시를 사용할 수 있다.
        • 캐시 사용을 통해 응답시간이 빨라지고, 서버 트랜잭션이 발생하지 않는다.
    • 자체 표현 구조 (Self-descriptiveness)
      • JSON을 이용한 표현구조를 사용한다.
    • 계층화 (Layered System)
      • 클라이언트 서버 분리로 인해 중간에 다른 계층에서 중간매체를 사용할 수 있다.
    • 유니폼 인터페이스 (Uniform)
      • HTTP 프로토콜을 따른다면 어떤 플랫폼에서든 사용가능.
        • 특정 언어나 기술에 종속되지 않음.
  • REST API는 JSON, XML 등 여러 형태의 Representation으로 나타낼수 있다.
  • Github REST API링크 <- 여기서 확인해볼 수 있다.

Swift에서 REST API 사용

  • Swift 에서도 마찬가지로 HTTP 프로토콜을 사용 가능하기 때문에, REST API를 사용할 수 있다.
  • Swift에서의 Networking 은 3월 14일 TIL (비동기 및 네트워킹) 여기를 참고하자
  • 다만 JSON을 파싱하는 방법이 두가지가 있다.
  • JSONSerialization.jSonObject vs JsonDecoder

JSONSerialization.jSonObject

  • Foundation 프레임워크에 속한 JSON 파싱을 위한 클래스이며, Objective-C 스타일의 API이다.
  • JSON 데이터를 Foundation의 기본 데이터 타입인 NSDictionary, NSArray, NSString, NSNumber, NSNull 등의 타입으로 변환한다.
  • JSON 데이터를 파싱할 때, 실제 JSON 데이터의 형태를 직접 다루게 된다.
  • 사용자가 직접 JSON 데이터의 필드를 추출하고 타입으로 캐스팅해야 한다.
if let data = data {
	do {
		// JSON 데이터 파싱
		let json = try JSONSerialization.jsonObject(with: data, options: [])
		if let jsonDict = json as? [String: Any] {
		// 파싱된 데이터 활용
		print("Received JSON data: \(jsonDict)")
		}
	} catch {
		print("JSON parsing error: \(error.localizedDescription)")
		}
}

JSONDecoder

  • Codable 프로토콜과 함께 사용되는 Swift 4 이상에서 도입된 JSON 파싱을 위한 구조체이며, Swift 스타일의 API이다.
  • JSON 데이터를 Codable 프로토콜을 채택한 사용자 정의 Swift 구조체나 클래스로 변환할 수 있다.
  • JSONDecoder를 사용하면 Codable 프로토콜을 따르는 타입의 인스턴스로 변환하는 과정이 자동화되어, 사용자가 직접 파싱 및 타입 캐스팅을 할 필요가 없다.
let decoder = JSONDecoder()
	do{
		let repos = try decoder.decode([Repo].self, from: data!)
		DispatchQueue.main.async{
			self.delegate?.reposRetrieved(repos: repos)
		}
	}catch{
		print("Error Parsing Json")
	}

// Codable Protocol 채택해야함.
struct Repo : Codable {
    var name: String?
    var langauge: String?
    var html_url: String?
}

Codable

  • Codable 프로토콜은 Encodable 과 Decodable를 결합한 것이다.
public typealias Codable = Decodable & Encodable

struct User: Codable {
    let id: Int
    let name: String
    // 다른 프로퍼티들...

	public enum CodingKeys: String, CodingKey {
      case id = "key"
      case name
    }

    // Encodable 프로토콜을 준수하기 위한 커스텀 인코딩 로직
    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(id, forKey: .id)
        try container.encode(name, forKey: .name)
        // 다른 프로퍼티들도 인코딩 가능
    }

    // Decoding - 디코딩
    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        id = try container.decode(Int.self, forKey: .id)
        name = try container.decode(String.self, forKey: .name)
    }
}

Alamofire

  • 챌린지 반 과제 참고 링크
profile
개발자 (진)

0개의 댓글