내배캠 챌린지반 과제
- Github API를 사용해서 사용자의 정보 출력
- Github API를 사용해서 사용자의 Repository 출력
- 등등
REST API
Rest API
는 REST (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)
계층화 (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 {
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")
}
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
}
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)
}
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