Jiwift

[iOS/Swift] Alamofire body와 query 데이터 동시에 전송하기 본문

라이브러리/Alamofire

[iOS/Swift] Alamofire body와 query 데이터 동시에 전송하기

지위프트 2023. 11. 5. 12:49
반응형

로고

 

짧고 간결하게 알아보는 Alamofire

 

 개발하다가 Body와 Query를 동시에 전송해야하는 일이 있었습니다. 근데 제 머리로는 간편하게 하는 방법이 생각나지 않았으나 그래도 먼길 돌아 해결한 것 같아 공유하려고합니다.

 

func dictionaryToJsonString(dictionary: [String: Any]) -> String? {
    do {
        let jsonData = try JSONSerialization.data(withJSONObject: dictionary, options: [])
        if let jsonString = String(data: jsonData, encoding: .utf8) {
            return jsonString
        }
    } catch {
        print("Error converting dictionary to JSON string: \(error)")
    }
    return nil
}

 우선 Body에 넣을 파라메터를 Json String 형식으로 변환하기 위한 함수를 작성했습니다. 

 

let headers: HTTPHeaders = ["Content-Type": "application/json",
                                    "Accept": "application/json"]
        
// Body 데이터
let parameters: Parameters = ["userId": "swift",
                              "name": "kimjitae",
                              "amount": 1000,
                              "age": 27]
                              
// 쿼리 데이터
let queryParam: Parameters = ["game": "KartRider"]

 헤더와 보내고싶은 파라메터들을 정의했습니다. 

 

// Request 생성
var request: URLRequest = URLRequest(url: URL(string: url)!)
// Method 설정
request.httpMethod = HTTPMethod.post.rawValue
// 헤더
request.headers = headers

// 파라메터 Json String 변환
if let location = self.dictionaryToJsonString(dictionary: parameters) {
    // here body is already serialized to Json
    request.httpBody = Data(location.utf8)
}

do {
    // 쿼리 데이터 추가
    request = try URLEncoding(destination: .queryString).encode(request, with: queryParam)
} catch {
    print("Error creating request: \(error)")
}

 이제 보내기 위한 Request를 생성합니다. URL을 넣어주고, 각각 옵션에 맞게 설정합니다. 중간에 Body에 넣을 파라메터를 Json String으로 변환해주고 쿼리 파라메터도 URLEncoding 방식으로 추가합니다. 

 

AF.request(request)
    .validate(statusCode: 200..<300)... 생략

 그리고 생성한 Request를 Alamofire를 통해서 전송하면 됩니다. 통신 후 처리는 생략하였습니다. 

 

반응형