유니티에서 SOAP API 보내기

정선호·4일 전

Unity Features

목록 보기
29/29

SOAP API

SOAP API testing tool

SOAP API란?

XML 기반의 메시징 프로토콜로, 주로 엔터프라이즈 환경에서 시스템 간 통신을 위해 사용된다. REST API보다 더 엄격한 표준과 보안 기능을 제공하는 것이 특징이다.

SOAP API는 다음과 같은 특징을 가진다.

  • 프로토콜 기반 : REST는 아키텍처 스타일인 반면, SOAP는 공식적인 프로토콜(규약)이다.
  • XML 전용 : 메시지 형식으로 오직 XML만을 사용하며, 요청과 응답 모두 XML 문서 구조를 따른다.
  • 엄격한 보안 : WS-Security와 같은 자체 보안 표준을 지원하며, 높은 수준의 보안(예: 금융 거래)이 요구될 때 유리하다.
  • 상태 유지 가능: 경우에 따라 요청 간에 상태 정보를 유지할 수 있어, 복잡한 트랜잭션 처리에 적합하다.
  • 데이터 변형 방지 : 자체적인 ACID (데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질) 기준이 있어 데이터의 변형을 줄여준다.
  • 플랫폼 독립성 : HTTP뿐만 아니라 SMTP, TCP 등 다양한 전송 프로토콜 위에서 동작할 수 있어 플랫폼이나 언어에 구애받지 않는다.

강력한 보안성과 데이터 변형 방지로 인해 주로 은행이나 기업의 보안 절차에서 사용하고 있다.

SOAP API의 형식

  • Envelop(필수) : SOAP 메시지 전체를 감싸는 루트(Root) 요소입니다. XML 네임스페이스를 정의하며, 메시지의 시작과 끝을 나타낸다.
  • Header(선택) : 실제 비즈니스 로직과는 별개인 부가 정보(예: 보안 인증 토큰, 라우팅 정보, 트랜잭션 ID)를 포함한다.
  • Body(필수) : 웹 서비스가 제공하는 실제 호출 내용(메서드 이름, 매개변수, 반환 값 등)이 들어간다.
  • Fault(선택) : Body 내에 위치하며, 요청 처리 중 오류가 발생했을 때 예외 정보를 반환하는 데 사용된다.
<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 보내기

유니티는 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;
        }
    }
profile
학습한 내용을 빠르게 다시 찾기 위한 저장소

0개의 댓글