ios xcode에서 REST API 요청하기
2023. 9. 19. 23:12ㆍ- IOS/swift
REST API를 요청하여 데이터를 응답받는 과정을 간단히 구현해볼건데요 서버에 db를 만들어서 쓰기에는 복잡해 질수 있으니 nasa open api를 사용하여 테스트 해보겠습니다.
https://api.nasa.gov/ 에 접속해서 api key값을 발급 받으면 됩니다.
SpaceData 만들기
우선 데이터를 받아올수 있는 struct를 하나 만들어주겠습니다.
import Foundation
struct SpaceData: Codable { // json형식 파싱하기위해 Codable 프로토콜
var date: String?
var explanation: String?
var hdurl: String?
var mediaType: String?
var serviceVersion: String?
var title: String?
var url: String?
}
https://api.nasa.gov/planetary/apod?api_key={api key 값}
나사 오픈 api에서 받은 키 값을 넣어 url에 접속해 보면 아래와 같은 json 데이터를 확인 할수 있습니다. 그 json데이터 key값에 맞춰 SpaceData를 만들었습니다.
SpaceModel 만들기
import Foundation
protocol SpaceModelProtocol {
func articlesRetrieved(space: SpaceData)
}
class SpaceModel {
var del: SpaceModelProtocol?
func getSpace() {
// 1. 먼저 요청할 url를 string으로 담아둡니다.
let urlString = "https://api.nasa.gov/planetary/apod?api_key={api key 값}"
// 2. 해당 스트링으로 URL 인스턴스를 생성해주세요
let url = URL(string: urlString)
// 3. 해당 url이 만약에 nil 값이라면 이곳에서 중지할거에요.
guard url != nil else {
print("Couldn't create url object")
return
}
// 4. URLSession을 만들어줍니다.
let session = URLSession.shared
// 5. URLSession을 이용해서 dataTask를 만들어줍니다.
let datatask = session.dataTask(with: url!) { (data, response, error) in
// 6. error가 없고 data를 성공적으로 불러왔을때에만 동작합니다.
if error == nil && data != nil {
// 7. JSON 데이터를 swift 인스턴스 객체로 바꿔주기 위해서 decoder 객체를 생성합니다.
let decoder = JSONDecoder()
// 8. decode함수는 예기치못한 에러를 발생할 수 있으므로 try-catch문을 작성해줍니다. swift문에서는 do-catch문이라고 불러요.
do{
// 9. try 문을 앞에 붙여서 JSON 데이터를 이전에 만들어준 SpaceData 모양의 swift 인스턴스로 파싱해줍니다.
let spaceData = try decoder.decode(SpaceData.self, from: data!)
// 10. 데이터를 성공적으로 받아왔다면 일전에 만들어놓은 SpaceModelProtocol의 articlesRetrieved 함수를 이용해서 spaceData를 ViewController에 보내줍니다. 여기서 주의하셔야 할 점은 SpaceModel의 getSpace() 함수는 background thread에서 동작하고 있습니다. 하지만 ViewController에서 articles를 받아오면 바로 화면에 띄워줘야 하기 때문에, UI관련 로직은 많은 프로세스사양을 요구하므로 main thread에서 articlesRetrieved 함수를 동작시켜주어야 합니다. 때문에 DispatchQueue.main.async 구문을 써주었습니다.
DispatchQueue.main.async {
self.del?.articlesRetrieved(space: spaceData)
}
}
catch {
print("Error parsing the json")
}
}
}
// 11. datatask 준비가 완료되었다면 datatask를 실행시켜줍니다.
datatask.resume()
}
}
- URLSession
- 앱에서 서버와 통신하기 위해 애플이 제공하는 API
- HTTP를 포함한 몇 가지 프로토콜을 지원하고 인증, 쿠키 관리, 캐시 관리 등을 지원 - dataTask
- Data를 받는 작업, Response 데이터를 메모리 상에서 처리하게 됩니다.
- URL 요청을 실시하고 완료 시 핸들러를 호출하는 Task 형식
- Task가 실행된 후 핸들러가 실행되기 때문에 탈출 Closure 형태로 받아와야 합니다.
ViewController 만들기
import UIKit
class ViewController: UIViewController {
var model = SpaceModel()
@IBOutlet weak var label_contecn: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
model.del = self
model.getSpace()
}
}
extension ViewController: SpaceModelProtocol {
func articlesRetrieved(space: SpaceData) {
let spac = space
DispatchQueue.main.async {
self.label_contecn.text = "\(String(describing: spac.date!))\n\n\(String(describing: spac.explanation!))\n\n\(String(describing: spac.hdurl!))\n\n\(String(describing: spac.title!))"
}
}
}
SpaceModelProtocol의 함수를 viewController에서 구현시켰기 때문에 viewController에서 비동기적으로 접근이 가능합니다.
그러면 인자로 전달받은 space를 이용해서 SpaceModel 파일에서 불러온 spaceData를 ViewController 파일에서도 비동기적으로 접근이 가능하게 됩니다. spaceData를 파라미터로 받아 view label에 데이터를 띄워 주면 아래와 같이 표현 됩니다.
'- IOS > swift' 카테고리의 다른 글
zsh : command not found : adb (0) | 2023.10.31 |
---|---|
mac os 맥북 JAVA 환경변수 설정하기 (0) | 2023.10.31 |
ios view controller 생명주기 (life-cycle) (0) | 2023.09.12 |
xcode remove reference 한 파일 복구 하기 (0) | 2022.09.22 |
http통신 (0) | 2022.05.24 |