본문 바로가기
Swfit

GET, POST 방법

by GGShin 2022. 3. 9.

JSON 형식의 API를 GET하고 POST하는 방법에 대해서 알아보겠습니다.

Header의 유무에 따라서 GET은 조금 다르게 작성해도 되는 것 같더라구요.

(Header가 없는 경우에는 코드가 더 간략해집니다.)

더미 API를 사용할 수 있는 jsonplaceholder에서 제공하는 api url을 사용했습니다.

https://jsonplaceholder.typicode.com/posts

jsonplaceholder에서 제공하는 api

이렇게 생긴 단순한 형태의 API 입니다.

 

**혹시 JSON parsing 시 데이터 구조 작성?법에 대해 궁금하신 분들은 아래 포스팅을 참고하시면 됩니다.

https://ittingz.tistory.com/68

 

Swift JSON Parsing하기

저는 Parsing하는 과정을 좋아합니다. 예쁘게 잘 짜여진 API에서 원하는 자료를 꺼내오는 게 마치 보물을 찾아오는 것 같아요 ㅎㅎ 보통 JSON이 많이 사용이 되고 있기 때문에 JSON 형태일 때 어떻게

ittingz.tistory.com

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

반응형