URL Session을 이용한 HTTP통신
웹 통신과 Protocol
- 인터넷 상에서의 통신을 말한다.(소식을 전한다)
- 많은 정보들이 주고 받기에 인터넷에는 엄격한 규약이 존재한다. 이것을 Protocol 이라고 부른다.
ex)
메일을 주고받을때 - SMTP
파일을 주고받을때 - FTP
브라우저, 웹서버와 통신할 때 - HTTP
HTTP(Hyper Text Transfer Protocol)
- Hyper Text를 전송하기 위한 프로토콜
- HTML문서를 주고받을 때 사용
요청: request
응답: response
클라이언트에서 서버에 요청을 하면 그에 맞는 응답 결과를 돌려준다.
Http패킷
헤더에는 보내는사람의 주소 받는사람의 주소, 생존시간
바디에는 우리가 전하고자하는 실제 내용이 담겨있다.
Http Method
- GET: 클라이언트가 서버에 리소스를 요청할 때 사용(정보를 받아올 때)
- POST: 클라이언트가 서버의 리소스를 새로 만들 때 사용(로그인, 게시글 업로드)
- PUT: 클라이언트가 서버의 리소스를 전체 수정 할 때 사용(회원정보를 전체 수정할 때)
- PATCH: 클라이언트가 서버의 리소스를 일부 수정 할 때 사용(회원정보를 일부 수정할 때)
- DELETE: 클라이언트가 서버의 리소스를 삭제 할 때 사용
- HEAD: 클라이언트가 서버의 정상 작동 여부를 확인 할 때 사용
- OPTIONS: 클라이언트가 서버에 해당 URL이 어떤 메소드를 지원하는지 확인 할 때 사용
- CONNECT: 클라이언트가 프록시를 통하여 서버와 SSL통신을 하고자 할 때 사용
- TRACE: 클라이언트와 서버간 통신 관리 및 디버깅을 할 때 사용
Http Status
서버는 클라이언트 요청에 응답하면서 요청이 성공적으로 완료되었는지 알려주는 상태코드를 함께 보낸다.
- 100번 대 Informational: 요청 정보를 처리중 (현재는 거의 사용되지 않는 코드)
- 200번 대 Success: 요청을 정상적으로 처리함
- 300번 대 Redirection: 요청을 완료하기 위해 추가 동작 필요
- 400번 대 Client Error: 서버가 요청을 이해하지 못함(클라이언트가 서버에 잘못된 요청을 했을 때)
- 500번 대 Server Error: 서버가 요청 처리 실패함.(대부분의 error코드는 500번대로 처리됨.)
URLSession
- 특정url을 이용하여 데이터를 다룬로드하고 업로드하기 위한 API
- Request와 Response를 기본 구조로 가지고 있다.
- Request는 서버에 요청을 보낼 때 어떤 http method를 사용 할 것인지, 캐싱정책을 어떻게 할 것인지등의 설정을 할 수 있다.
- Response는 URL요청에 응답을 나타내는 객체
URLSession은 URLSessionConfiguration을 통해 생성할 수 있다.
이렇게 생성된 URLSession을 통해 한개 이상의 URLSessionTask를 생성할 수 있으며 URLSessionTask를 통해 실제 서버와 통신할 수 있다.
URLSession API는 여러가지유형의 세션을 제공한다.
이 타입은 URLSession객체가 소유한 configuration프로퍼티 객체에 의해 결정됨.
URLSessionConfiguration을 사용하면 timeout값, 캐싱정책과 추가적인 Http헤더와같은 세션프로퍼티를 생성할 수 있다.
URLSession의 종류
1. 공유세션(Shared Session)
- URLSession.shared()
- 싱글톤으로 사용할 수 있고, 기본요청을 하기위한 세션
- 직접만든 세션만큼 맞춤설정을 할 순 없지만 쉽게만들어 사용할 수 있다.
2. 기본세션(Default Session)
- URLSession(configuration: .default)
- 공유세션과 유사하게 작동하지만 직접 원하는 설정을 할 수 있고, 캐시와 쿠키인증등을 디스크에 저장함.
- 순차적으로 데이터를 처리하기 위해 Delegate를 지정할 수 있다.
3. 임시세션(Ephemeral Session)
- URLSession(configuration: .ephemeral)
- 공유세션과 비슷하지만 캐시, 쿠키, 사용자인증정보를 디스크에 저장하지 않는다
- 메모리에 올려서 세션을 연결하고 세션 만료시 데이터가 사라진다.
4. 백그라운드세션(Background Session)
- URLSession(configuration: .background)
- 앱이 실행되지 않는동안 background에서 컨텐츠 업로드 및 다운로드를 실행할 수 있다.
URLSessionTask
URLSession구성이 완료되면 URLSessionTask를 이용해서 각 세션내의 작업들을 추가할 수 있다.
Task의 종류:
- URLSessionDataTask
데이터 객체를 사용하여 데이터를 요청하고 응답받음, 주로 짧고 빈번하게 요청되는데 사용
- URLSessionUploadTask
데이터 객체 또는 파일 형태의 데이터를 업로드 할 때 사용, 앱이 실행되지 않았을 때 Background업로드를 지원
- URLSessionDownloadTask
데이터를 다운로드 받아서 파일의 형태로 저장하는 작업을 수행, 앱이 실행되지 않았을때 Background다운로드를 지원
- URLSessionStreamTask
TCP/IP 연결을 생성할 때 사용되는 Task
- URLSessionWebSocketTask
WebSocket Protocol 표준을 통해 통신하는 Task
URLSession Life Cycle
1. Session Configuration을 결정하고, Session을 생성
let session = URLSession(configuration: .default)
2. 통신할 URL과 Request 객체를 설정
//옵셔널로 리턴되기 때문에 guard문으로 바인딩
guard let url = URL(string: "https://api.openweathermap.org/data/2.5/weather?q=\(cityName)
&appid=53108a9b43202998b9a6e7fde6134e11") else { return }
3. 사용할 Task를 결정하고 그에 맞는 Completion Handler나 Delegate 메소드들을 작성
dataTask가 api를 호출하고 서버에서 응답이 오면 Completion Handler(data, response, errror) in 이하가 호출이 됨
//data: 서버에서 응답받은 데이터
//response: http헤더 및 상태코드같은 응답 메타데이터
//error: 요청을 실패하게되면 애러겍체가 전달, 만약 요청에 성공한다면 nil이 반환
session.dataTask(with: url){ data, response, error in
guard let data = data, error == nil else { return }
let decoder = JSONDecoder()
let weatherInformation = try? decoder.decode(WetherInformation.self, from: data)
debugPrint(weatherInformation)
}.resume()//4. resume()로 dataTask 실행
4. 해당 Task를 실행
5. Task 완료 후 Completion Handler클로저가 호출이 됨.
상단 코드의 in 이하 코드, .resume()이전 코드