iOS에서의 네트워킹
•
HTTP 메세지 형태
•
데이터를 어떻게 주고 받을지에 대한 약속
간단한 지식
GET
•
리소스 취득 (조회)
•
게시판 글 읽어오기 (데이터 표시)
•
READ
POST
•
엔티티 (등록)
•
게시판 글쓰기, 댓글 달기, 새로운 주문 생성
•
CREATE
PUT
•
파일 전송 (데이터 대체 / 없으면 생성)
•
게시글 수정 (데이터 전부 대체)
•
UPDATE
DELETE
•
파일 삭제 (삭제)
•
게시물 삭제
•
DELETE
응답 상태 코드
•
2xx (Success)
◦
리퀘스트를 정상적으로 처리 했음
•
3xx (Redirection)
◦
리퀘스트를 완료하기 위해서 추가 동작이 필요
•
4xx (Client Error)
◦
서버는 리퀘스트 이해 불가능 (클라이언트 에러)
◦
잘못된 요청
•
5xx (Server Error)
◦
서버는 리퀘스트 처리 실패 (서버 에러)
◦
서버 내부의 문제
HTTP 프로토콜
iOS의 네트워킹
1. URL
2. URLSession
3. dataTask
4. 시작 (resume)
import Foundation
let movieURL = "http://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?targetDt=20120101&key=0f86e52d90629f68901f6c965cd922ab"
let structUrl = URL(string: movieURL)!
URLSession.shared.dataTask(with: structUrl) { data, response, error in
if error != nil {
print(error!)
return
}
if let safeData = data {
let str = String(decoding: safeData, as: UTF8.self)
print(str)
}
}.resume()
Swift
복사
영화 데이터 출력해보기!
import UIKit
// Session(세션)
// 일정 시간동안 같은 브라우저(사용자)로부터 들어오는 연결 상태를 일정하게 유지시키는 기술(상태)
// MARK: - iOS에서의 네트워킹의 기본
// 0. URL 주소 - 문자열로
let movieURL =
"http://kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?&key=0f86e52d90629f68901f6c965cd922ab&targetDt=20230701"
// 1. URL 구조체 만들기
let url = URL(string: movieURL)!
// 2. URLSession 만들기 (네트워킹을 하는 객체 - 브라우저 같은 역할)
let session = URLSession.shared
// 3. 세션에 (일시정지 상태로) 작업 부여
let task = session.dataTask(with: url) { (data, response, error) in
if error != nil {
print(error!)
return
}
guard let safeData = data else {
return
}
// 데이터를 그냥 한번 출력해보기
// print(String(decoding: safeData, as: UTF8.self))
dump(parseJSON1(safeData)!)
}
// 4. 작업시작
task.resume() // 일시정지 된 상태로 작업이 시작하기 때문
// 비동기적으로 동작함
// 받아온 데이터를 우리가 쓰기 좋게 변환하는 과정(분석)
// 현재의 형태
func parseJSON1(_ movieData: Data) -> [DailyBoxOfficeList]? {
do {
// 자동으로 원하는 클래스/구조체 형태로 분석
// JSONDecoder
let decoder = JSONDecoder()
let decodedData = try decoder.decode(MovieData.self, from: movieData)
return decodedData.boxOfficeResult.dailyBoxOfficeList
}
catch {
return nil
}
}
// 서버에서 주는 데이터의 형태
struct MovieData: Codable {
let boxOfficeResult: BoxOfficeResult
}
// MARK: - BoxOfficeResult
struct BoxOfficeResult: Codable {
let dailyBoxOfficeList: [DailyBoxOfficeList]
}
// MARK: - DailyBoxOfficeList
struct DailyBoxOfficeList: Codable {
let rank: String
let movieNm: String
let audiCnt: String
let audiAcc: String
let openDt: String
}
Swift
복사