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)
            }
        }
    }
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom