[swift] Swift로 SOAP 요청 보내기

이번 글에서는 Swift를 사용하여 SOAP (Simple Object Access Protocol) 요청을 보내는 방법에 대해 알아보겠습니다. SOAP는 네트워크 상에서 구조화된 데이터를 교환하기 위한 프로토콜로 자주 사용됩니다.

1. SOAP 요청 구성하기

SOAP 요청은 XML 형식으로 구성됩니다. 따라서, 우선적으로 필요한 데이터를 XML로 만들어야 합니다. Swift에서는 XMLSerialization 클래스를 사용하여 XML 데이터를 생성할 수 있습니다.

다음은 간단한 SOAP 요청 예제입니다.

let soapMessage = """
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <GetWeather xmlns="http://www.example.com">
            <City>New York</City>
        </GetWeather>
    </soap:Body>
</soap:Envelope>
"""

위의 예제에서 soap:Envelope는 SOAP 메시지의 루트 요소입니다. soap:Body 요소 내에 실제 데이터와 요청을 포함할 수 있습니다. GetWeather를 호출하고자 하는 경우, City 요소에 원하는 도시 이름을 지정하면 됩니다.

2. HTTP 요청 보내기

SOAP 요청은 일반적으로 HTTP POST 방식으로 전송됩니다. Swift에서는 URLRequest를 사용하여 HTTP 요청을 생성할 수 있습니다.

// SOAP 요청 URL
let url = URL(string: "http://www.example.com/soap-endpoint")

// HTTP 요청 생성
var request = URLRequest(url: url!)
request.httpMethod = "POST"
request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.httpBody = soapMessage.data(using: .utf8)

위의 예제에서는 URLRequest를 생성하고, HTTP 메소드를 POST로 설정하며, Content-Type 헤더를 지정합니다. 또한, SOAP 메시지를 요청의 본문에 추가합니다.

3. URLSession을 통한 요청 전송

Swift에서는 URLSession을 사용하여 HTTP 요청을 전송할 수 있습니다. URLSession은 비동기적으로 요청을 처리하고 응답을 받을 수 있도록 도와줍니다.

// URLSession 생성
let session = URLSession.shared

// 요청 전송
let task = session.dataTask(with: request) { data, response, error in
    if let error = error {
        print("Error: \(error)")
        return
    }
    
    guard let data = data else {
        print("No data received")
        return
    }
    
    // 응답 처리
    let responseString = String(data: data, encoding: .utf8)
    print("Response: \(responseString)")
}

// 요청 시작
task.resume()

위의 예제에서는 URLSession을 생성하고, dataTask(with:completionHandler:)를 사용하여 요청을 전송합니다. 응답을 받으면 responsedata를 사용하여 원하는 처리를 할 수 있습니다.

마무리

이상으로 Swift를 사용하여 SOAP 요청을 보내는 방법에 대해 알아보았습니다. SOAP 요청을 보내기 위해서는 URL과 SOAP 메시지를 구성하고, HTTP 요청을 생성하여 전송하는 과정을 거칩니다. 이를 통해 서버와 통신하여 자유롭게 SOAP 기반의 API를 사용할 수 있습니다.

참고 자료: