Project 20 - API

DaY·2021년 5월 17일
2

iOS

목록 보기
45/52
post-thumbnail

API

  • 프로그램들이 서로 상호작용하는 것을 도와주는 매개체
  • 개발자들이 애플리케이션 코드를 작성하는 방법을 표준화함으로써, 간소화되고 빠른 프로세스 처리 가능
  • 소프트웨어 통합 시 개발자들 간의 협업 용이
  1. 서버와 데이터베이스에 대한 출입구 역할
  2. 애플리케이션과 기기가 원활하게 통신하도록 하는 역할
  3. 모든 접속을 표준화

API유형

  1. private API
    private API는 내부 API로, 회사 개발자가 자체 제품과 서비스를 개선하기 위해 내부적으로 발행한 것. 따라서 제 3자에게 노출되지 않는다.

  2. public API
    public API는 개방형 API로, 모두에게 공개. 누구나 제한 없이 API를 사용할 수 있는 것이 특징.

  3. partner API
    partner API는 기업이 데이터 공유에 동의하는 특정인들만 사용 가능.

URLSession

  • HTTP / HTTPS 기반 요청을 처리하기 위한 클래스 및 클레스의 세트 모음
  • 기본적으로 제공되는 API로서 HTTP를 포함한 여러 가지 프로토콜을 지원하고, 인증, 쿠키, 캐시 등의 관리를 지원
  • URLRequest는 요청에 대한 정보를 표현하는 객체로, 이 객체를 URLSession을 사용하여 서버로 요청 전송

Task

URLSessionDataTask

HTTP의 각종 메서드를 이용해 서버로부터 응답 데이터를 받아서 Data 객체를 가져오는 작업을 수행

URLsessionUploadTask

애플리케이션에서 웹 서버로 Data 객체 또는 파일 데이터를 업로드하는 작업을 수행. 주로 HTTP의 POST 혹은 PUT 메서드를 이용

URLSessionDownloadTask

서버로부터 데이터를 다운로드 받아서 파일의 형태로 저장하는 작업을 수행. 애플리케이션의 상태가 대기 중이거나 실행 중이 아니라면 백그라운드 상태에서도 다운로드가 가능

  1. URL 객체 생성
  2. Request 객체 생성 (+ 메소드 설정)
  3. URLSession을 이용해서 데이터 요청
  4. @escaping Closure을 이용한 외부 함수로 인자 전달

JSON Load

func searchForTerm(_ searchTerm: String, completion : @escaping (_ results: FlickrSearchResults?, _ error : NSError?) -> Void){

    URLSession.shared.dataTask(with: searchRequest, completionHandler: { (data, response, error) in
    
    guard let resultsDictionary = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions(rawValue: 0)) as? [String: AnyObject],
          let stat = resultsDictionary["stat"] as? String else {
          
            let APIError = NSError(domain: "FlickrSearch", code: 0, userInfo: [NSLocalizedFailureReasonErrorKey:"Unknown API response"])
            OperationQueue.main.addOperation({
                completion(nil, APIError)
            })
            return
        }
    })
}

Image Load

func loadImage(_ completion: @escaping (_ flickrPhoto:FlickrPhoto, _ error: NSError?) -> Void) {

    URLSession.shared.dataTask(with: loadRequest, completionHandler: { (data, response, error) in

    }).resume()
}

0개의 댓글