iOS json 파일 종류별 통신 방법
iOS앱을 만들 때 여러 방식으로 json 데이터를 가져오고, 그것을 Decode해서 사용하는데, 매번 헷갈려서 따로 정리해야겠다는 생각이 매우 강하게
들어서 이번 기회에 정리한다.
이번 글이 기업의 과제 테스트에도 사용될 수 있기 때문에 공개를 해야할까, 하지 말아야 할까 고민이다. 만약 여러분이 이 글을 보고 계신다면 공개하자고 마음을 먹은거겠지요.. 아무튼!! 기본적인 HTTP 통신부터 시작하자.
GET, POST 등 HTTP 통신
RESTful API 통신이라고도 하는(
대부분은 WEB API지만..
) HTTP 통신 방법부터 파헤쳐보자.
주로 다음과 같은 형식으로 url이 들어간다: https://newsapi.org/v2/everything?q=tesla&from=2021-06-09&sortBy=publishedAt&apiKey=something
이 경우에는 아래처럼 dataTask로 data를 가져온 뒤,
JSONDecoder().decode(모델.self(혹은 [모델].self, from: data)
로 모델에 정보를 넣으면서 빼온다.
아래 예제에서는 Articles 자체가 [Article] 타입이기 때문에 굳이 [Articles].self라고 적어주지 않았지만, 배열 형식으로 빼내오고 싶다면 [Article].self 로 대체해도 된다.
GET
func HttpGet(urlString: String) {
guard let url = URL(string: urlString) else {return}
let session = URLSession(configuration: .default)
let dataTask = session.dataTask(with: url) { (data: Data?, response: URLResponse?, error: Error?) in
guard let data = data else {return}
do {
//받은 json데이터 파싱
let result: Articles = try JSONDecoder().decode(Articles.self, from: data)
print(result.articles.first?.author)
} catch(let e) {
print(e)
}
}.resume() //모든 task()는 일시정지 상태로 시작하기 때문에 resume()으로 task()를 시작해야합니다.
}
post
func postComment(movieId: String, rating: Double, writer: String, contents: String) {
let comment = PostComment(movieId: movieId, rating: rating, writer: writer, contents: contents)
guard let uploadData = try? JSONEncoder().encode(comment)
else {return}
let url = URL(string: "https://connect-boxoffice.run.goorm.io/comment")
var request = URLRequest(url: url!)
// URLRequest 객체를 정의
request.httpMethod = "POST"
// HTTP 메시지 헤더
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
// URLSession 객체를 통해 전송, 응답값 처리
let task = URLSession.shared.uploadTask(with: request, from: uploadData) { (data, response, error) in
// 서버가 응답이 없거나 통신이 실패
if let e = error {
NSLog("An error has occured: \(e.localizedDescription)")
return
}
// 응답 처리 로직
print("comment post success")
}
// POST 전송
task.resume()
}
Json 파일 자체에 대한 주소가 있는 경우
json 자체를 받는 것도 비슷하다. 다만 dataTask가 따로 필요없다는 게 특징.
func getImage() {
let url = URL(string:"https://something.json")
if let data = try? Data(contentsOf: url!) {
do {
let result: Song = try JSONDecoder().decode(Song.self, from: data)
print(result)
} catch (let e) {
print(e)
}
}
}
'iOS::스위프트(swift) > just swift' 카테고리의 다른 글
swift 로딩 중 표시하기 (0) | 2021.09.23 |
---|---|
iOS/Swift 앱의 라이프 사이클 (0) | 2021.05.11 |
iOS/Swift 푸시 알림 원리 (0) | 2021.05.11 |
Swift/iOS MapKit 으로 지도에 이동 기록 나타내기(with LocalDB Realm) (1) | 2021.05.07 |
Swift/iOS Naver API 받아 써보기(feat. Nmapsmap 오류 해결) (0) | 2021.05.03 |
최근댓글