일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- TCA
- Swift
- composable architecture
- widget
- SwiftUI
- dispatchqueue
- widgetkit
- 영남대
- cs
- 문법
- 위젯킷
- 스유
- uikit
- 멋쟁이사자처럼
- Protocol
- ReactorKit
- 컴퓨터그래픽스
- 백준
- 대외활동
- c++
- 멋사
- 웹
- 리액트
- 운영체제
- 알고리즘
- 스위프트
- swift concurrency
- 네트워크
- spritekit
- 후기
- Today
- Total
맛동산이
Swift) URLSession, async await을 사용하여(parameter, header, body 세팅까지) 본문
Swift) URLSession, async await을 사용하여(parameter, header, body 세팅까지)
진ddang 2024. 2. 25. 17:21예전에 urlSession을 간단하게 사용해본적은 있지만, 명확하게 사용을 깔끔하게 헤더와, 다양한 파라미터를 넣어서 사용해본적은 없기때문에 정리를 하게 됐다.
URLSession의 큰틀은 다음과 같다.
- URL 생성
- URL Request 생성
- URLSession 생성
- URLtask생성
- resum
하지만, 여기에서 URLRequest 를 생성하는 시점에서 다양한 헤더, request body, parameter, query를 추가해서 다양한 내용을 전달할수 있기 때문에 이를 한번 디테일하게 정리해보자 한다.
URLRequest
struct Body: Codable {
let page: Int
let results: String
let totalPages: Int
enum CodingKeys: String, CodingKey {
case page, results
case totalPages = "total_pages"
}
}
struct DecodingType: Codable {
let result: String
}
func urlRequest() async throws -> String {
guard var url = URL(string: "this is url") else { return "" }
url.append(queryItems: [URLQueryItem(name: "쿼리", value: "값")])
var urlRequset = URLRequest(url: URL(string: "hi")!)
urlRequset.httpMethod = "GET"
urlRequset.allHTTPHeaderFields = ["key": "value", "key2": "value2"]
urlRequset.httpBody = try JSONEncoder().encode(Body(page: 12, results: "결과", totalPages: 12))
let (data, _) = try await URLSession.shared.data(for: urlRequset)
let result = try JSONDecoder().decode(DecodingType.self, from: data)
return result.result
}
func someRequest(by userID: String) async throws -> String {
return ""
}
func realUsingSessions() {
Task {
do {
let result = try await urlRequest()
let changeCardStatus = try await someRequest(by: result)
}
catch {
print("error!")// 혹은 여기에서 네트워크 에러를 보여준다.
}
}
}
쿼리 , parmeter
쿼리 스트링이란, url 에서 물음표 뒤에 오는것을 의미한다.
파라미터와 쿼리스트링은 동일한 의미이다.
hettps://www.inflearn.com/course?order=hi
- 여기에서 order=hi 가 쿼리스트링
Swift에서는
url.append(queryItems: [URLQueryItem(name: "쿼리", value: "값")])
이러한 방법으로 url 에 쿼리를 추가해줄수 있다.
Header
헤더란 http 통신에서 요청 응답에 관한 정보를 포함한 부분을 의미한다.
Swift URLRequest를 생성할때 추가해줄수 있으며, 다음과 같이 추가해줄수 있다.
///이렇게 한번에 추가해줄때, 혹은 외부에서 딕셔너리를 생성해서 넣어줄경우
urlRequset.allHTTPHeaderFields = ["key": "value", "key2": "value2"]
///한개씩 추가해줄때
urlRequset.addValue("value", forHTTPHeaderField: "key")
Body
바디란, http 통신 해당 request에 넘겨줄 데이터 부분을 의미한다.
Swift URLRequst에서는 Codable을 채택하는, 구조체를 통해서 endcoding을 해서 body(JSON타입) data를 생성해주고, 이 결과값을 가지고 URLSession에서 request를 보내게 된다.
Swift에서는 JSONEncodable()을 통해서 데이터를 encoding해서 바디를 생성해줄수 있다.
struct Body: Codable {
let page: Int
let results: String
let totalPages: Int
enum CodingKeys: String, CodingKey {
case page, results
case totalPages = "total_pages"
}
}
struct DecodingType: Codable {
let result: String
}
urlRequset.httpBody = try JSONEncoder().encode(Body(page: 12, results: "결과", totalPages: 12))
Async await을 사용한 URLSession
위에서 생성한 url(쿼리를 포함한)과 urlRequst(header, body를 설정한) 를 통해서 이제 reuqest를 보내기 위해서는 URLSession을 사용해야한다.
이때 기존의 completionHandler 방법을 이용하면, 연쇄적으로 데이터를 받아서, 다시한번 urlsession을 보낸다고 했을 때 코드가 굉장히 더러워질수 있기 때문에, 이를 aync await을 통해서 해결할수 있다.
방법은 간단하다.
- 해당 메소드를 사용할 함수를 asnyc로 선언
- try await을 사용한 URLSession.shared.data(for: urlRequest)를 사용
- 결과값을 JSONDecoder를 통해서 디코딩해서 다음 asnyc메소드로 전달.
func some() async throws -> String {
let (data, _) = try await URLSession.shared.data(for: urlRequset)
let result = try JSONDecoder().decode(DecodingType.self, from: data)
return result.result
}
///그리고 실제로 사용하는 부분
func realUsingSessions() {
Task {
do {
let result = try await urlRequest()
let changeCardStatus = try await someRequest(by: result)
}
catch {
print("error!")// 혹은 여기에서 네트워크 에러를 보여준다.
}
}
}
실제로 호출하는 부분에서 async메소드를 사용해야 하기 때문에 Task로 감싸주고,
do catch를 통해서 urlReqeust함수가 발생하는 error를 catch해서 핸들링 해준다.
이후 do 문에서는 urlReqeust가 주는 결과값을 동일한 async함수의 파라미터로 넣어주면 연쇄적으로 동작하는 urlsession을 사용할수 있게 된다.
'앱 > Swift' 카테고리의 다른 글
앱사이즈 최적화 하는 5가지 방법 (0) | 2024.02.25 |
---|---|
Swift) RxDataSource 사용하는법 정리 (0) | 2024.02.25 |
Combine과 Rx가 잘 이해가 안가는 사람을 위한 설명(feat. SwiftUI에 비유해서) (2) | 2024.01.01 |
Swift) NSAttributedString, NSMutableAttributedString (1) | 2024.01.01 |
UIKit) lineBreakMode에 대해서 (1) | 2024.01.01 |