XML 기반의 메시징 프로토콜로, 주로 엔터프라이즈 환경에서 시스템 간 통신을 위해 사용된다. REST API보다 더 엄격한 표준과 보안 기능을 제공하는 것이 특징이다.
SOAP API는 다음과 같은 특징을 가진다.
강력한 보안성과 데이터 변형 방지로 인해 주로 은행이나 기업의 보안 절차에서 사용하고 있다.
<soap:Envelope xmlns:soap="schemas.xmlsoap.org"
xmlns:m="www.example.org">
<soap:Header>
<!-- 보안 인증 정보 등을 여기에 포함시킬 수 있습니다. -->
<m:AuthToken>SAMPLE_TOKEN_12345</m:AuthToken>
</soap:Header>
<soap:Body>
<!-- m 네임스페이스의 GetStockPrice 메서드를 호출합니다. -->
<m:GetStockPrice>
<!-- Symbol이라는 매개변수에 IBM 값을 전달합니다. -->
<m:Symbol>IBM</m:Symbol>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
유니티는 SOAP API를 공식적으로 지원하지 않는다.
다만 UnityWebRequest를 이용해 API 서버에 패킷을 전송하듯이 전송하고 받을 수 있다.
파싱은 기존의 REST API에서 사용하던 json 대신 xml로 치환하면 가능하다.
private const string SOAP_URL = "https://test.com/test/url"; // soap url
private const string SOAP_ACTION = "http://tempuri.org/testAction"; // soap method
public async UniTask<XmlNodeList> Call_SoapTest()
{
// body 만들기
string soapEnvelope =
$@"<soap:Envelope xmlns:soap="schemas.xmlsoap.org"
xmlns:m="www.example.org">
<soap:Header>
<!-- 보안 인증 정보 등을 여기에 포함시킬 수 있습니다. -->
<m:AuthToken>SAMPLE_TOKEN_12345</m:AuthToken>
</soap:Header>
<soap:Body>
<!-- m 네임스페이스의 GetStockPrice 메서드를 호출합니다. -->
<m:GetStockPrice>
<!-- Symbol이라는 매개변수에 IBM 값을 전달합니다. -->
<m:Symbol>IBM</m:Symbol>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>";
// 만든 body를 byte[]로 변환
byte[] bodyRaw = new UTF8Encoding(false).GetBytes(soapEnvelope);
// UnityWebRequest로 패킷 준비
UnityWebRequest request = new UnityWebRequest(SOAP_URL, "POST");
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
// 패킷에 헤더 추가
request.SetRequestHeader("Content-Type", "text/xml; charset=utf-8");
request.SetRequestHeader("SOAPAction", SOAP_ACTION);
// 패킷 전송
await request.SendWebRequest().ToUniTask();
// 패킷 전송 성공시
if (request.result == UnityWebRequest.Result.Success)
{
// 결과 문자열 확인
string responseXml = request.downloadHandler.text;
Debug.Log(responseXml);
// xml 형식으로 파싱
XmlDocument doc = new XmlDocument();
doc.LoadXml(responseXml);
XmlNodeList list = doc.GetElementsByTagName("AdAuthCheckEncryptResult");
return list;
}
else
{
Debug.LogError($"SOAP Error: {request.error}");
return null;
}
}