HTTP 통신

도윤·2022년 1월 11일
0

http 통신을 하기 위한 절차가 있다.

  1. Session configuration을 결정하고, Session을 생성한다.
  2. 통신할 URL과 Request 객체를 설정한다.
  3. 사용할 Task를 결정하고, 그에 맞는 Completion Handler나 Delegate 메소드들을 작성한다.
  4. 해당 Task를 실행한다.
  5. Task 완료 후 Completion Handler가 실행된다.

URLSession

urlsession은 http/https 기반의 요청을 처리하기 위한 클래스입니다!

class URLSession : NSObject

URLSession HTTP 요청을 보내고 받는 핵심 객체 입니다.

URLSessionConfiguration

  • default: 디스크 지속(disk-persisted) 전역 캐시, 자격 증명(credential) 과 쿠기 저장 객체를 사용하는 기본 구성 객체(default configuration object)를 생성합니다.
  • ephemeral: 메모리에 세션과 관력된 모든 데이터를 저장하는 것을 제외하곤 default와 유사하다."private" 세션이다.
  • background: background에서 upload와 download를 수행하는 세션읻다. 앱이 종료되거나 중지되었을때도 전송을 계속한다.

Types of URL Session Tasks

  • URLSessionDataTask: 서버에서 메모리로 데이터를 검색하는 HTTP GET요청에 사용
  • URLSessionUploadTask: HTTP POST,PUT 메서드를 통해 디스크에서 서버로 데이터를 전송할 때 사용.
  • URLSessionSownloadTask: 임시의 파일 형태에서 데이터를 download 할때, 앱이 실행중이지 않을 때도 다운로드 지원.

이 과정을 일시정지(suspend),재개(resume),취소(cancel) 할 수 있으며, URLSessionDownloadTask는 향후에 재개(resumeption)하기 위해 일시 정지(pause) 할 수 있다.

URLSession은 2가지 형태로 데이터를 반환.

  • 작업을 마쳤을 때, 즉 성공했거나 실패했거나 completion handler를 통해 반환
  • 세션을 만들 때 설정했던 delegate를 호출하여 데이터 반환.

데이터를 조회하고, 업로드하는 메서드들이 URLSession에 있다. 위 메서드를 사용할 때 파라미터로 URLRuqeust를 필요로 하는 메서드와 URL를 필요로 하는 메서드가 있는데 그 중 URLRuquest에 대해서도 알아보겠습니다.

URLRequest

struct URLRequest

URLRequest는 http/https 통신을 위한 방법(GET,POST,PUT)을 설정하고 http header을 포함하고 있다.

URLRequest는 request에 대한 정보만을 담는 구조체이므로, http통신을 하기 위해 URLSession을 사용해야 한다.

중요한 parameter/method

var httpMethod: String? { get set }
//http request 방법을 설정. default는 get.

var url: URL? { get set }
//통신을 하기 위한 url. request생성시 반드시 포함해야 한다.

var httpBody: Data? { get set }
// get이 아닌 post,put처럼 데이터를 전달할때.

http header설정

mutating func addValue(_ value: String, forHTTPHeaderField field: String)

예시

var session = URLSession(configuration: .default)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        request()
    }
    
    func request() {
        let url = URL(string:"https://jsonplaceholder.typicode.com/todos")
        
        let request = URLRequest(url: url!)
        
        let dataTask = session.dataTask(with: request) { (data,response,error) in

            if let error = error {
                print("DEBUG: error is \(error)")
            }
            
            guard let data = data,let reponse = response as? HTTPURLResponse, reponse.statusCode == 200 else {
                print("error")
                return
            }
            
            guard let jsonArray = try? JSONSerialization.jsonObject(with: data, options: []) else { return }
            print(jsonArray)
        }
        dataTask.resume()
    }

결과값은 https://jsonplaceholder.typicode.com/todos에서 볼 수 있는 값들과 위의 request 함수를 실행했을 때 가장 위의 4개 값을 가져왔습니다.

값이 동일한 것을 알 수 있습니다.

가져온 데이터를 json화 하는 함수는 다음에 작성하겠습니다!


ref:
https://developer.apple.com/documentation/foundation/urlsession
https://developer.apple.com/documentation/foundation/urlrequest
https://www.raywenderlich.com/3244963-urlsession-tutorial-getting-started

http통신을 하기 위해 https://jsonplaceholder.typicode.com 사용했습니다!

0개의 댓글