JSON 형식의 API를 GET하고 POST하는 방법에 대해서 알아보겠습니다.
Header의 유무에 따라서 GET은 조금 다르게 작성해도 되는 것 같더라구요.
(Header가 없는 경우에는 코드가 더 간략해집니다.)
더미 API를 사용할 수 있는 jsonplaceholder에서 제공하는 api url을 사용했습니다.
https://jsonplaceholder.typicode.com/posts
이렇게 생긴 단순한 형태의 API 입니다.
**혹시 JSON parsing 시 데이터 구조 작성?법에 대해 궁금하신 분들은 아래 포스팅을 참고하시면 됩니다.
https://ittingz.tistory.com/68
1. GET
1) Header가 없는 경우
1-1. URLSession(with: url) 방식
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
import UIKit
//JSON 자료를 structure 형태로 만들기 위한 struct 생성
//(API에 있는 모든 데이터를 변수로 만들 필요는 없습니다. 다만 변수명은 사용하는 api의 데이터들의 이름과 반드시 일치해야합니다.)
struct DataModel: Codable {
let userId: Int
let id: Int
let title: String
let body: String
}
//Array에 정보를 저장하기 위해 array 생성
var JSONData: [DataModel]?
//GET하기 위한 함수 작성
func getRequest() {
//사용하고자 하는 api url 주소 입력
let jsonUrlString = "https://jsonplaceholder.typicode.com/posts"
guard let url = URL(string: jsonUrlString) else { return }
//data, response, error 처리
URLSession.shared.dataTask(with: url) { data, response, error in
//error 처리
if let error = error {
print("Error took place \(error)")
return
}
//response 상태 확인(생략가능)
if let response = response as? HTTPURLResponse {
print("Response HTTP Status code: \(response.statusCode)")
}
//data 처리
guard let data = data else { return }
do {
let posts = try JSONDecoder().decode([DataModel].self, from: data)
JSONData = posts
} catch let jsonErr {
print("Error serializing json:", jsonErr)
}
//API 속 정보를 잘 불러왔는지 확인(생략가능)
print(JSONData ?? "")
print("Number of data: \(JSONData!.count)")
}.resume()
}
getRequest()
|
cs |
이렇게 playground에 실행하면
아래와 같이 API가 정상적으로 GET 된다는 것을 확인 할 수 있습니다. 제가 사용한 더미 API에서는 100개의 데이터를 제공해주는데, 아래에 보시면 id가 1부터 100까지 잘 들어왔다는 것을 확인할 수 있습니다.
Response HTTP Status code: 200 [__lldb_expr_600.DataModel(userId: 1, id: 1, title: "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", body: "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"),...{생략}...DataModel(userId: 10, id: 100, title: "at nam consequatur ea labore ea harum", body: "cupiditate quo est a modi nesciunt soluta\nipsa voluptas error itaque dicta in\nautem qui minus magnam et distinctio eum\naccusamus ratione error aut")] Number of data: 100 |
1-2. URLSession(with: request) 방식
위에서는 URLSession(with: url)을 사용했지만, URLSession(with: request)를 사용하는 경우도 있습니다.
with: request는 어떻게 사용하는지 한 번 살펴보겠습니다.
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
29
30
31
|
func getRequest() {
let jsonUrlString = "https://jsonplaceholder.typicode.com/posts"
guard let url = URL(string: jsonUrlString) else { return }
//request 변수를 생성해주고 httpMethod를 명시해줍니다.
var request = URLRequest(url: url)
request.httpMethod = "GET"
//URLSession 시에 url 대신 생성한 request 변수를 사용해줍니다.
URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("Error took place \(error)")
return
}
if let response = response as? HTTPURLResponse {
print("Response HTTP Status code: \(response.statusCode)")
}
guard let data = data else { return }
do {
let posts = try JSONDecoder().decode([DataModel].self, from: data)
JSONData = posts
} catch let jsonErr {
print("Error serializing json:", jsonErr)
}
print(JSONData ?? "")
print("Number of data: \(JSONData!.count)")
}.resume()
}
|
cs |
결국 동작하는 것은 with: url이었을 때와 동일합니다.
request 변수를 따로 만들어 주면 httpMethod를 GET으로 명시해 둘 수 있다는 차이점이 있습니다.
(POST도 같이 사용해야 하는 경우에는 GET으로 명시하여 헷갈리지 않게 사용하면 되지 않을까 생각이 듭니다.)
**이렇게 불러온 데이터를 TableView에 어떻게 나타낼 수 있는지 다음번에 추가로 작성해 보겠습니다!
2.POST
'Swfit' 카테고리의 다른 글
TableViewCell 만드는 방법 정리-등록(Register)하기 (0) | 2022.03.18 |
---|---|
Core Data or Realm? 어떤 것을 선택해야 할까? (0) | 2022.03.17 |
UIButton 코드로 작성하기 (0) | 2022.03.03 |
NumberOfLines 값 설정이 안될 때 (0) | 2022.02.28 |
Navigation Large Title 버그 해결하기 (0) | 2022.02.26 |