별명없는 개발자 블로그

42 API 통신을 위한 HTTP request 보내기 본문

Swift

42 API 통신을 위한 HTTP request 보내기

Nonalias 2020. 12. 18. 20:24

지난 16일부터 오늘까지 42Seoul Hackerton 을 참가했습니다.

 

Swift 내에서 42 API 호출이 필요하여 HTTP 통신을 다루어 보았습니다.

 

우선, 코드는 다음과 같습니다.

func getCluster(url: URL, token: String) -> [[String: Any]]? {
    var request: URLRequest = URLRequest(url: url)
    request.httpMethod = "GET"
    let sem = DispatchSemaphore.init(value: 0)
    let appMessage = " Bearer " + token
    request.setValue(appMessage, forHTTPHeaderField: "Authorization")
    request.addValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")
    var json: [[String: Any]]?
    let session: URLSession = URLSession.shared
    session.dataTask(with: request, completionHandler: { (data, response, error) in
        defer { sem.signal() }
        guard let data = data else { print("nothing");return }
        json = try? JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]]
    }).resume()
    sem.wait()
    return json
}

getCluster 함수는 현재 42 Cluster내에 상주하고 있는 Cadet들의 정보를 호출하는 함수입니다.

request는 api요청을 전송할 url을 매개변수로 객체를 생성해줍니다.

이 때, url은 단순 String이 아닌, URL 클래스로 생성된 객체를 의미합니다.

 

그리고, 사전에 받아온 token을 "Bearer "와 합쳐서 appMessage에 저장해 주었습니다.

request.setValue는 http 패킷의 Header를 설정해 주는 것입니다. 

forHTTPheaderField 는 key, appMessage는 value로 한 쌍으로 이루어져 있습니다.

 

그리고 변수 json을 받아올 json의 타입에 맞게 설정해 줍니다.

제가 받아올 Cluster의 JSON 은 다음과 같은 형식으로 되어있습니다.

{
    {
        key: value
        key2: value2
        key3: value3
        key4: { key5: value5 }
    },
    {
    	key: value
        key2: value2
        key3: value3
        key4: { key5: value5 }
    }
}

중괄호가 중첩으로 되어있습니다. Cluster User를 조회할 때 내부 중괄호들은 각각의 유저를 의미합니다.

따라서, 이 형식대로 받아오기 위해

var json: [[String: Any]]? 로 받아줍니다.

왜 Value값이 Any냐고 생각할 수 있는데,

value값은 Int가 올 수 있고, String이 올 수 있고, key4에서 볼 수 있듯 Dictionary가 올  수 있습니다.

따라서 key의 타입은 Any로 해 줍니다.

 

그 후 문법에 맞게 파싱을 해주면 됩니다.

여기서 session은 request에 담긴 내용들을 실제로 수행하기 위한 변수입니다.

 

DispatchSemaphore는 Session통신이 Asyncronize하기 때문에 api통신이 끝날 때 까지 기다려 주기 위해 사용하였습니다