| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 프로젝트 기본경로
- default location
- Project default
- project location
- 안드로이드 스튜디오
- save location
- 경로 바꾸기
- 새 프로젝트 생성
- 이노베이션아카데미#42서울#42seoul#42Hackerton#Hackerton#swift#httpconnection#httprequest
- 안드로이드
- Today
- Total
별명없는 개발자 블로그
42 API 통신을 위한 HTTP request 보내기 본문
지난 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통신이 끝날 때 까지 기다려 주기 위해 사용하였습니다