웹 서비스 개발하기, Part 3: SOAP 상호운용성
웹 서비스의 생성, 설명, 퍼블리싱 과정을 소개하도록 한다. 처음에는 WSDL 작성 예제를 이용하여 웹 서비스를 기술하는 방법을 설명했다. 두 번째 시간에는 SOAP 아키텍쳐와 구조를 분석했다. 이번에는 SOAP과 관련한 상호운용성 문제를 짚어가겠다.
웹 서비스 모델은 전체 B2B 스펙트럼을 세 단계 또는 도메인으로 분할한다: 서비스 기술하기, 구체적 구현으로 바인딩하기, 레지스트리를 통해 퍼블리시 하기. 이 세 단계는 서로서로 독립되어 있으며 개별적인 상호운용성 문제를 야기시킨다.
WSDL (Web Services Description Language)은 디스크립션 도메인을 구성하고 있고 SOAP은 바인딩 도메인을 포함하고 있으며 Universal Description, Discovery and Integration (UDDI) 레지스트리는 퍼블리싱 도메인을 포함하고 있다. 내가 설명하고자 하는 부분은 바인딩 도메인과 관련한 상호운용성 문제에 국한된다. SOAP의 진화를 설명하는 것으로 시작하여 실제 SOAP의 상호운용성 문제로 넘어가겠다.
W3C는, XML Schema 스팩이 여전히 진화단계에 머물러있고 SOAP 스팩의 핵심 부분으로 규정되던 때인 1999년에 SOAP 스팩에 대한 작업을 시작했다. SOAP은 XML Schema datatype 정의를 사용하여 SOAP에서의 데이터 유형을 정의하고 인스턴스화 한다.
SOAP 1.1은 W3C Note ("http://www.w3.org/1999/XMLSchema")와 함께 Working Draft of XML Schema를 채택했다. 현재 SOAP 1.2 (참고자료)는 Candidate Recommendation에 거의 근접해 있으며 XML Schema Recommendation (2001년 5월)과 2001 namespace URI ("http://www.w3.org/2001/XMLSchema") for XML Schema를 채택했다.
전송 (HTTP) 기반 SOAP 상호운용성 부터 시작하도록 한다.
SOAP 1.1 스팩은 SOAP 메시지가 HTTP 요청 내부로 보내질 수 있도록 한다. Part 2 (참고자료)에서 설명한대로, SOAP은 구조에 영향을 주지않고 HTTP와 통합한다. SOAP 스팩은 의무적인 SOAPAction
헤더를 HTTP 요청 헤더에 추가한다. 이전 글에서 설명했지만, SOAPAction
헤더는 세 가지 종류의 값을 취할 수 있다:
- null
- 비어있는 쿼트(quote) 스트링
- 임의의 UR
이러한 유연성 때문에 SOAP 구현이 각자 스타일의 SOAPAction
헤더와 기능을 선택할 수 있다. 하지만 유연성은 상호운용성 문제도 야기시킨다.
상호운용성 문제를 공부하기 위해서 SOAP 서버에 요청을 보내고 서버 응답을 디스플레이하는 SOAP 클라이언트를 만들고, 간단한 SOAP 요청을 다른 서버에 보내면서 SOAPAction 헤더의 값에 변화를 주면서 어떻게 그들이 세 종류의 핸들러를 지원하는지를 보았다.
다음 테스트는 SOAPAction
헤더를 제외한 SOAPBuilders' Round 2 (Base) echoString 테스트 (참고자료) 이다. WSDL 파일 (기본 테스트)을 위해 SOAPBuilders' Round 2 사이트를 방문해보기 바란다.
이 글에서는 다음과 같은 SOAP 서버를 테스트했다.
- Listing 1에는 더블 쿼트 안에
SOAPAction
헤더 값을 가진 SOAP 요청을 포함하고 있다. The value of theSOAPAction
헤더 값은 WSDL 파일("http://soapinterop.org/")에 주어진 값과 같다. - Listing 2 에는 같은
SOAPAction
헤더 값이 포함되어있다. 다만 더블 쿼트가 없다 (http://soapinterop.org/). - Listing 3 에는 WSDL 파일("http://differentfromwsdl.org/")에 주어진 것과는 다른
SOAPAction
헤더를 포함한다. - Listing 4는
SOAPAction
헤더용 null 값을 지정한다.
Listing 1을 성공적인 응답과 함께 WhiteMesa SOAP Server 2.7에 보내면서 SOAPAction
헤더가 WhiteMesa에 의해 성공적으로 프로세스 될 수 있다는 것을 보여주었다. 다음에 Next I sent Listing 2를 WhiteMesa에게 보냈고 이를 성공적으로 처리했다. 마지막으로, SOAPAction
헤더의 값을 "http://differentfromwsdl.org/" (Listing 3)으로 보냈을 때 WhiteMesa는 요청 프로세싱에 실패했고 오류 응답을 리턴했다. 오류 스트링은 "Unrecognized 'SOAPAction' HTTP header received."이었다. WhiteMesa SOAP Serve 2.7은 SOAPAction
값이 null인 Listing 4의 요청에 대해 오류 응답을 리턴했다.
IONA XMLBus와 SOAP::Lite를 이용하여 Listing 1, 3, 4를 테스트했다. Listing 1에서는 요청을 성공적으로 처리했지만 Listings 3과 4에서는 요청에 대한 오류 메시지를 리턴했다. IONA XMLBus는 returned a fault response against Listing 2 (URI에 쿼트가 없음)에 대해 오류 응답을 리턴하면서 요청의 SOAPAction
헤더가 WSDL 파일에 정의된 것과 같이 더블 쿼트로 되어있을 것을 기대한다는 것을 지적했다.
다음에는 Listing 1, 3, 4 의 요청을 Easy SOAP++ 0.6으로 보내 정확한 응답을 리턴했다. Apache Axis와 Apache SOAP 2.2는 SOAPAction
헤더 값과 관계없이 정확한 응답을 리턴했다.
결론
최상의 상호운용성을 위해 SOAPAction
헤더 값에 쿼트를 붙이기 바란다. 이것은WSDL 파일과 동일해야 한다.
XML Schema
이 섹션에서는 SOAP 요청을 작성하는데 사용되는 다양한 XML Schema 버전에 대해 다양한 SOAP 서버의 작동들에 대해 설명할 것이다. 다양한 SOAP 서버에서 XML Schema namespace URI 지원에 대해 테스트 클라이언트를 사용하여 수행한 테스트의 결과를 검토할 것이다.
Listing 1과 Listing 5 는 동일한 SOAP 요청이지만 사용된 XML Schema 버전만 다르다. Listing 1은 2001 XML Schema URI를 사용하는 반면, Listing 5는 1999 URI를 사용한다. 나는 많은 서버들을 이용하여 namespace URI 지원 테스트를 수행했고 1999 URI로는 IONA XMLBus가 실패했지만, 2001 URI를 사용한 Listing 1의 요청에 대해서는 성공적인 응답을 리턴했다는 것을 발견했다. 따라서 IONA XMLBus 지원은 2001 XML Schema namespace URI로 제한된다.
2001 URI는 대부분의 구현들과 함께 작동한다고 확신한다. 하지만 IBM SOAP Toolkit과 Apache SOAP 같은 오래된 구현들은 1999 URI를 사용한다. Apache SOAP 2.2는 1999과 2001 URI 모두를 수용하지만 응답 메시지에서는 기본적으로 1999 URI를 사용한다. 따라서 2001 URI (IONA XMLBus)를 기대하는 클라이언트는 구형 SOAP 구현들과 관련된 상호운용성 문제를 겪을 것이다.
결론
유선 타입 의존형 vs. WSDL 인식형 SOAP 1.1은 메시지에 포함된 데이터의 유형 정보를 제공하기위해 구현들을 적용한다. 이것은 문자상으로 작성된 데이터 설명이다. ( Part 1(참고자료)에서 WSDL 파일의 구조는 이미 설명했다. WSDL 파일은 웹 서비스를 설명하는데 사용된다. 웹 서비스에 의해 노출된 메소드 정보와 신호를 포함하고 있다. WSDL 파일은 어떤매개변수가 메소드에 들어갈 수 있는지와 리턴으로 무엇을 기대하는 지를 포함하고 있기 때문에 이러한 정보는 메소드와 응답을 호출하는 SOAP 요청을 de-serialize하는데 사용할 수 있다. 따라서 위 문제에 대한 솔루션은 WSDL 파일 인식형이다. 대부분의 구현들은 WSDL 인식형이다. Apache Axis는 타이핑을 하지 않고 데이터를 처리할 수 있으며 White Mesa 2.7도 마찬가지이다. 하지만 상호운용성 문제도 존재한다. White Mesa 2.7는 엘리먼트 이름이 WSDL 파일에 지정된 것과 같지 않으면 요청을 처리할 수 없다. 이는 다른 많은 구현들의 경우이기도 하다. 반면 Apache Axis는 그와 같은 요청을 오류없이 처리할 수 있다. 따라서 그 같은 요청을 Apache Axis용으로 작성한다면 White Mesa 2.7에서는 실행되지 않는다. 서비스용 WSDL 파일에 순응하는 요청과 응답을 작성하는 것이 최선의 방법이다. |
DataType 호환성은 SOAP 상호운용성에 있어서 가장 중요한 문제일 것이다. 두 개의 애플리케이션이 상대 애플리케이션의 DataType을 이해할 수 없다면 데이터 교환을 수행할 수 없으며 상호 운용할 수 없다.
DataType에 대해서는 이 시리즈 두 번째 시간에 소개했다. 그때 몇 가지 간단하고 복잡한 DataType에 대해 논했다. SOAP은 XML Schema DataType을 사용하고 SOAP 메시지에서 수행된 데이터 유형을 확인하는 구조를 사용한다.
SOAP을 사용하여 포스팅 된 데이터는 먼저 직렬화된다. 다시 말해서 데이터 값이 XML 문서 내에서 움직이기 위해 스트링으로 변환된다. 목적지에서 이 스트링은 de-serialized 어야 하며 다시말해서 원래 값을 표현하는 데이터유형으로 다시 변화된다.
XML Schema DataType을 적절한 원시 DataType으로 매핑하는 것은 SOAP 구현에 달려있다. 문제는 두 개의 원시 DataType이 일치하지 않을 때 발생한다. 다시말해서 XML의 같은 DataType이 다른 구현에 다른 값을 가지고 있을 때 발생한다. 데이터가 serialization/de-serialization 후에도 영속적인 것은 매우 중요하다.
Float float
과 관련된 일반적인 문제는 infinity와 함께 발생한다. XML Schema는 INF 스트링에 infinity를 나타낸다. Listing 6 은 요청의 float
infinity로서 INF를 보내는데 이것은 Apache SOAP 2.2 서버에 의해 Infinity 로서 리턴된다. 반면 Apache Axis는 INF (Listing 7)를 리턴한다.
Listing 6의 SOAP 요청을 보내는 것으로 MS SOAP Toolkit 3.0 서버도 테스트했다. 이것은 서버측 오류 코드를 리턴했고 float
infinity 값은 INF를 "SoapMapper:Converting data for SoapMapper failed inside the typemapper" 라는 오류 스트링에 의해 지시된 것처럼 de-serialize 할 수 없었다.
또 다른 문제는 float
정밀도 지원 이다. float
으로서 1.23456789E38을 몇 개의 SOAP 서버에 보냈다 (Listing 9). IONA XMLBus는 1.23456789E38을 리턴했고, White Mesa 2.7 서버는 1.234568E38을 MS SOAP ToolKit 3.0서버는 1.23456786051167E+38을 리턴했다. 비록 이것은 구현들이 상호 작동을 하고 있다는 것을 나타내고 있지만 원래 값 그대로 데이터를 재생산할 수 없다는 것을 의미한다.
Decimal decimal
의 경우,구현에 의해 지원되는 XML Schema 스팩에 필요한 최소 digit는 18 digit 이다. 스팩에 정의된 최고 한계가 없기 때문에 구현은 설정이 자유롭다. Microsoft ASP.NET Web Services와 WhiteMesa 2.7은 28 digit 까지 정밀도를 제공하고 Apache Axis는 문자그대로 수백 digit를 지원한다. 이러한 지원의 차이는 Apache Axis 구현이 사이즈 면에서 28 digit 정도 사이즈가 큰 decimal
숫자를 WhiteMesa 2.7 구현에 보낼 때 추가 정밀도는 데이터를 일관성 없게 하면서 줄어든다.
Listing 9 에 decimal
number 요청을 보내서 다른 서버들의 정밀도 지원을 확인했다. The response from ASP.NET 서버, Apache Axis, WhiteMesa 2.7로 부터 온 응답은Listing 10, 11, 12 에 각각 나와있다. 4S4C 서버는 1.235 값을 응답으로 리턴했다(Listing 9).
DateTime
XML Schema에서 시간과 데이터 정보에 대한 데이터 유형은 dateTime
이다. White Mesa 2.7은 초(second) 단위 정밀도를 제공한다. Apache SOAP 2.2와 Apache Axis는 java.util.Date
클래스를 사용하여 밀리초(millisecond) 정밀도로 특정 인스턴스를 표현한다. Microsoft ASP.NET Web Services는 나노초(nanosecond) 단위로 표현할 수 있는 Date
type을 사용한다.
Now if a .NET 기반의 SOAP 클라이언트 측 구현이 SOAP dateTime
정보를 SOAP 2.2 구현이나 White Mesa 2.7 구현에 보낸다면 dateTime
의 추가 정밀도는 데이터 비일관성을 야기시키며 소실될 것이다l.
Listing 13의 요청을 가지고 dateTime
테스트를 수행했다. Microsoft ASP.NET Web Services, Apache Axis, WhiteMesa 2.7, SOAP::Lite의 응답은 Listing 14, 15, 16 , 17에 각각 나와있다.
Byte Array
SOAP은 바이트 어레이 형태로 데이터를 교환할 수 있다. 바이트 어레이는 XML 문서안에 놓이기 전에 base64 인코딩이 되어야 한다. 많은 구현들이 SOAPBuilder (참고자료)의 Round 2(Base) 상호운용성 테스트에서 echoBase64
테스트에 실패했다. 어떤 구현들은 원시 datatype 포맷 때문에 일관성없는 값을 리턴했다. 어떤 구현은 이미 인코딩된 base64 값을 인코딩하는 base64에 의한 값을 리턴했다.
Listing 18 (1999 XML Schema base64Binary
datatype 사용)과 Listing 19 (2001 Schema base64Binary
datatype 사용)에서 요청은 간단한 echoBase64
메소드 호출을 SOAP 서버에 보내는 것이다.
Apache SOAP 2.2는 Listing 18과 Listing 19에 응답으로 오류 메시지를 리턴했다. 이 서버는 두 경우 datatype을 인식할 수 없었으며 따라서 base 64 인코딩 바이트 어레이를 deserialize 하는데 실패했다.
Listing 20을 보면, datatype 인코딩으로서 base64
를 지정했다. base64
인코딩은 SOAP 1.1 스팩에 의해 정의된다. XML Schema 스팩에 의해 정의된 base64Binary
datatype과 비교할 수 있다. Apache SOAP 2.2는 Listing 20의 요청을 성공적으로 처리한다.
IONA XMLBus는 19를 성공적으로 수행하지만 18 은 실패했다. Listing 20의 요청에서 SOAP-ENC:base64
datatype 인스턴스를 인식하지 못하고 오류 스트링을 리턴했다.
Apache SOAP 2.2와 IONA XMLBus는 base 64 encoded 바이트 어레이를 교환할 때 그 둘 사이에서 상호운용성 문제를 갖고 있음이 위 테스트를 통해 명백해졌다.
struct
는 간단하거나 그 보다 복잡한 datatype을 포함하고 있는 복잡한 사용자 정의의 datatype이다. C 언어 프로그래밍 경험이 있는 독자들이라면 C struct
과 XML Schema struct
사이의 유사성을 감지해야한다.
structs
에서 싱글 또는 다차원 어레이와 다른 datatype을 조합하는 무궁무진한 방법이 있다. 따라서, 나는 많은 SOAP 요청들을 만들어서 다른 SOAP 서버의 작동을 테스트했다. 이 테스트는 SOAPBuilders의 Round 2 (Group B) 테스트 슈트를 따랐다. Group B 테스트용 WSDL 파일은 SOAPBuilders' Round 2 웹 사이트에서 사용할 수 있다.
- Listing 21:
strings
의 간단한 어레이 포함. - Listing 22:
structs
어레이 포함. struct는string
,float
,int
datatype을 포함하고 있다. - Listing 23: 2차원 어레이의
strings
포함. - Listing 24: 2차원 어레이용 오프셋 정의.
- Listing 25:
strings
의 중첩 어레이를 가진struct
포함. - Listing 26: 내부 사이즈가 지정되지 않은 2-D 어레이 포함.
내가 테스트 한 모든 SOAP 구현은 간단한 타입과 복잡한 타입 모두 문제가 없었다.(Listing 21 & Listing 22).
WhiteMesa 2.7 서버는 Listing 21, 22, 23, 24, 25, 26을 이용하여 테스트했다. 오프셋 값이 지정될 경우에만 Listing 25 에서 실패했지만 모든 요청을 성공적으로 처리했다. White Mesa 2.7는 안쪽 규모가 정의되지 않을 때 2D 어레이를 처리할 수 있었다(Listing 26).
Listing 23에서 요청을 처리하지 못하고 "Not implemented, because SOAP::Lite does not generate multidimensional arrays (yet accepts ;))" 라는 오류 스트링과 함께 오류 응답을 리턴했던 요청을 SOAP::Lite에 보냈다. WhiteMesa에서 성공적으로 처리되었던 Listing 26의 요청은 다른 많은 구현들에 의해서는 처리되지 않았다; SOAP::Lite와 Apache Axis는 오류 메시지를 리턴했다.
SOAP 에는 상호운용성 문제를 야기시킬 수 있는 다른 영역들이 있다. mustUnderstand
SOAP 헤더를 처리를 담당하는 엔진의 불능으로 문제가 생길수 있다. SOAP 기능은 custom 헤더로 확장될 수 있다. 이러한 확장성은 상호운용성 문제를 궁극적으로 야기시키는 독점의 비 표준 솔루션으로 가는 길을 여는 것이다. SOAP은 몇몇 구현(Apache SOAP 2.2)들에 의해 지원되지 않는 다중 리턴 매개변수들을 사용할 수 있다. 인코딩 스키마는 XML에서 데이터의 serialize와 de-serialize에 대한 규칙을 설명하고 있다. SOAP 1.1은 SOAP 메시지에 대한 기본 인코딩을 정의하지 않는다. 기본적인 인코딩 스키마의 부족으로 인해 상호운용성 문제가 발생한다.
SOAP 구현에 웹 서비스 구현을 계획하거나 SOAP 서버와 클라이언트를 작성하는 개발자들에게 줄 조언이 있다.
- SOAP 1.1 구현으로 작업하려 한다면, 요청 시
SOAPAction
헤더에 쿼트를 달고 서비스의 WSDL 파일을 따르도록 한다. - 2001 namespace URI for XML Schema를 적용하라.
- SOAP 1.1에 정의된 인코딩을 따라야한다.
- 메소드 엘리먼트 이름은 WSDL 디스크립션을 따라야한다.
- SOAP 메시지에 datatype 정보를 제공하라.
Listing 1. SOAP request with SOAPAction value"http://soapinterop.org/".
POST /endpoint HTTP/1.1Host:host-URLContent-Type: "text/xml"; Charset="utf-8"SOAPAction: "http://soapinterop.org/"<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:echoString xmlns:ns1="http://soapinterop.org/"> <inputString xsi:type="xsd:string"> A Test String </inputString> </ns1:echoString> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 2. SOAP request with SOAPAction value (unquoted) http://soapinterop.org/.
POST /endpoint HTTP/1.1Host:host-URLContent-Type: "text/xml"; Charset="utf-8"SOAPAction: http://soapinterop.org/<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:echoString xmlns:ns1="http://soapinterop.org/"> <inputString xsi:type="xsd:string"> A Test String </inputString> </ns1:echoString> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 3. SOAP request with SOAPAction value "http://differentfromwsdl.org/".
POST /endpoint HTTP/1.1Host:host-URLContent-Type: "text/xml"; Charset="utf-8"SOAPAction: "http://differentfromwsdl.org/"<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:echoString xmlns:ns1="http://soapinterop.org/"> <inputString xsi:type="xsd:string"> A Test String </inputString> </ns1:echoString> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 4. SOAP request with a null SOAPAction value.
POST /endpoint HTTP/1.1Host:host-URLContent-Type: "text/xml"; Charset="utf-8"SOAPAction: <?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:echoString xmlns:ns1="http://soapinterop.org/"> <inputString xsi:type="xsd:string"> A Test String </inputString> </ns1:echoString> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 5. SOAP request with the 1999 namespace URI for XML Schema.
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <ns1:echoString xmlns:ns1="http://soapinterop.org/"> <inputString xsi:type="xsd:string"> A Test String </inputString> </ns1:echoString> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 6. SOAP request with 'INF'as float infinity.
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <ns1:echoFloat xmlns:ns1="http://soapinterop.org/"> <inputFloat xsi:type="xsd:float">INF</inputFloat> </ns1:echoFloat> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 7. Response from Apache Axis server for the request in Listing 6.
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Body> <ns1:echoFloatResponse SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://soapinterop.org/"> <echoFloatReturn xsi:type="xsd:float">INF</echoFloatReturn> </ns1:echoFloatResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 8. SOAP request to test a float value with SOAP servers.
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:echoFloat xmlns:ns1="http://soapinterop.org/"> <inputFloat xsi:type="xsd:float">1.23456789E38</inputFloat> </ns1:echoFloat> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 9. A large decimal number SOAP request.
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:echoDecimal xmlns:ns1="http://soapinterop.org/"> <inputDecimal xsi:type="xsd:decimal"> 0.123456789123456789123456789123456789 </inputDecimal> </ns1:echoDecimal> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 10. SOAP Response from Microsoft's ASP.NET Web Services for the request in Listing 9.
HTTP/1.0 200 OK Server: Microsoft-IIS/5.0 Date: Sat, 29 Jun 2002 09:05:39 GMTX-Powered-By: ASP.NET X-AspNet-Version: 1.0.4221 Cache-Control: private, max-age=0 Content-Type: text/xml; charset=utf-8 Content-Length: 568 X-Cache: MISS from cache-L7.wol.net.pk Connection: keep-alive <?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://soapinterop.org/" xmlns:types="http://soapinterop.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <types:echoDecimalResponse> <return xsi:type="xsd:decimal"> 0.1234567891234567891234567891 </return> </types:echoDecimalResponse> </soap:Body></soap:Envelope> |
Listing 11. SOAP Response from Apache Axis for the request in Listing 9.
HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Date: Sat, 29 Jun 2002 09:09:07 GMT Transfer-Encoding: chunked Server: Apache Tomcat/4.0.3 (HTTP/1.1 Connector)1fc <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <ns1:echoDecimalResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://soapinterop.org/"> <return xsi:type="xsd:decimal"> 0.123456789123456789123456789123456789 </return> </ns1:echoDecimalResponse> </soapenv:Body></soapenv:Envelope> 0 |
Listing 12. SOAP Response from WhiteMesa 2.7 for the request in Listing 9.
HTTP/1.0 200 OK Date: Sat, 29 Jun 2002 09:36:29 GMT Server: WhiteMesa SOAP Server/2.7 Content-Type: text/xml; charset="utf-8" Content-Length: 362 X-Cache: MISS from cache-L3.wol.net.pk Connection: keep-alive <?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> <m:echoDecimalResponse SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:m="http://soapinterop.org/"> <return> 0.1234567891234567891234567891 </return> </m:echoDecimalResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 13. SOAP dataTime datatype request.
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:echoDate xmlns:ns1="http://soapinterop.org/"> <inputDate xsi:type="xsd:dateTime"> 1956-10-18T22:20:00.1234567 </inputDate> </ns1:echoDate> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 14. Response from Microsoft ASP.NET Web Services for the request in Listing 13.
HTTP/1.0 200 OK Server: Microsoft-IIS/5.0 Date: Sat, 29 Jun 2002 07:50:58 GMT X-Powered-By: ASP.NET X-AspNet-Version: 1.0.4221 Cache-Control: private, max-age=0 Content-Type: text/xml; charset=utf-8 Content-Length: 566 X-Cache: MISS from malhitest Connection: keep-alive <?xml version="1.0" encoding="utf-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:echoDate xmlns:ns1="http://soapinterop.org/"> <inputDate xsi:type="xsd:dateTime"> 1956-10-18T22:20:00.1234567 </inputDate> </ns1:echoDate> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 15. Response from Apache Axis for the request in Listing 13.
HTTP/1.1 200 OK Content-Type: text/xml; charset=utf-8 Date: Sat, 29 Jun 2002 09:09:01 GMT Transfer-Encoding: chunked Server: Apache Tomcat/4.0.3 (HTTP/1.1 Connector) 1e9<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <ns1:echoDateResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://soapinterop.org/"> <return xsi:type="xsd:dateTime"> 1956-10-18T22:20:00.123Z </return> </ns1:echoDateResponse> </soapenv:Body></soapenv:Envelope> 0 |
Listing 16. Response from WhiteMesa 2.7 for the request in Listing 13.
HTTP/1.0 200 OK Date: Sat, 29 Jun 2002 09:16:09 GMT Server: WhiteMesa SOAP Server/2.7 Content-Type: text/xml; charset="utf-8" Content-Length: 346 X-Cache: MISS from cache-L4.wol.net.pk Connection: keep-alive <?xml version="1.0" encoding="utf-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> <m:echoDateResponse SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:m="http://soapinterop.org/"> <return> 1956-10-18T22:20:00Z </return> </m:echoDateResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 17. Response from SOAP::Lite for the request in Listing 13.
HTTP/1.0 200 OK Date: Sat, 29 Jun 2002 09:17:20 GMTServer: Apache/1.3.26 (Unix) mod_gzip/1.3.19.1a mod_ssl/2.8.1 OpenSSL/0.9.4 PHP/4.2.1 SOAPServer: SOAP::Lite/Perl/0.55 Content-Length: 553 Content-Type: text/xml; charset=utf-8 X-Cache: MISS from cache-L4.wol.net.pk Connection: keep-alive <?xml version="1.0" encoding="utf-8"?><SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> <namesp1:echoDateResponse xmlns:namesp1="http://soapinterop.org/"> <return xsi:type="xsd:dateTime"> 1956-10-18T22:20:00.1234567 </return> </namesp1:echoDateResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 18. SOAP request with 1999 XML Schema URI qualified base64Binary dataype.
<?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <ns1:echoBase64 xmlns:ns1="http://soapinterop.org/"> <inputBase64 xsi:type="xsi:base64Binary"> VGhpcyBpcyBhIFRlc3QgU3RyaW5n </inputBase64> </ns1:echoBase64> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 19. SOAP request with 2001 XML Schema URI qualified base64Binary dataype.
<?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <ns1:echoBase64 xmlns:ns1="http://soapinterop.org/"> <inputBase64 xsi:type="xsi:base64Binary"> VGhpcyBpcyBhIFRlc3QgU3RyaW5n </inputBase64> </ns1:echoBase64> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 20. SOAP request with SOAP-ENC qualified base64 dataype.
<?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <ns1:echoBase64 xmlns:ns1="http://soapinterop.org/"> <inputBase64 xsi:type="SOAP-ENC:base64"> VGhpcyBpcyBhIFRlc3QgU3RyaW5n </inputBase64> </ns1:echoBase64> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 21. An array of strings in a SOAP request.
<?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <ns1:echoStringArray xmlns:ns1="http://soapinterop.org/"> <inputStringArray SOAP-ENC:arrayType="xsd:string[2]" xsi:type="SOAP-ENC:Array"> <item xsi:type="xsd:string"> hello </item> <item xsi:type="xsd:string"> goodbye </item> </inputStringArray> </ns1:echoStringArray> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 22. An array of structs in a SOAP request.
<?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema" xmlns:ns2="http://soapinterop.org/xsd"> <SOAP-ENV:Body> <ns1:echoStructArray xmlns:ns1="http://soapinterop.org/"> <inputStructArray SOAP-ENC:arrayType="ns2:SOAPStruct[2]" xsi:type="SOAP-ENC:Array"> <inputStruct xsi:type="ns2:SOAPStruct"> <varFloat xsi:type="xsd:float"> 6.2237275295275275295297529752 </varFloat> <varString xsi:type="xsd:string"> test string </varString> <varInt xsi:type="xsd:int"> 5 </varInt> </inputStruct> <inputStruct xsi:type="ns2:SOAPStruct"> <varFloat xsi:type="xsd:float"> 12.4 </varFloat> <varString xsi:type="xsd:string"> another test </varString> <varInt xsi:type="xsd:int"> 10 </varInt> </inputStruct> </inputStructArray> </ns1:echoStructArray> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 23. A two dimensional array of strings in a SOAP request.
<?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:echo2DStringArray xmlns:m="http://soapinterop.org/"> <input2DStringArray SOAP-ENC:arrayType="xsd:string[3,2]"> <item>Row-0,Column-0</item> <item>Row-0,Column-1</item> <item>Row-1,Column-0</item> <item>Row-1,Column-1</item> <item>Row-2,Column-0</item> <item>Row-2,Column-1</item> </input2DStringArray> </m:echo2DStringArray> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 24. A two dimensional array of strings with off-set in a SOAP request.
<?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:echo2DStringArray xmlns:m="http://soapinterop.org/"> <input2DStringArray SOAP-ENC:arrayType="xsd:string[3,2]" SOAP-ENC:offset="[2,0]"> <item>Row-0,Column-0</item> <item>Row-0,Column-1</item> <item>Row-1,Column-0</item> <item>Row-1,Column-1</item> <item>Row-2,Column-0</item> <item>Row-2,Column-1</item> </input2DStringArray> </m:echo2DStringArray> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 25. A SOAP request with an array of strings nested in a struct.
<?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:echoNestedArray xmlns:m="http://soapinterop.org/"> <inputStruct> <varInt>12345</varInt> <varFloat>1234.5678 </varFloat> <varString> A Test String </varString> <varArray SOAP-ENC:arrayType="xsd:string[4]" SOAP-ENC:offset="[0]"> <item>First Array String</item> <item>Second Array String</item> <item>Third Array String</item> <item>Fourth Array String</item> </varArray> </inputStruct> </m:echoNestedArray> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
Listing 26. SOAP request with 2-D array and unspecified size of rows (inner most dimension).
<?xml version="1.0" encoding="utf-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:echo2DStringArray xmlns:m="http://soapinterop.org/"> <input2DStringArray SOAP-ENC:arrayType="xsd:string[,3]" SOAP-ENC:offset="[2,0]"> <item>2,0</item> <item>2,1</item> <item>2,2</item> <item>3,0</item> <item>3,1</item> <item>3,2</item> <item>4,0</item> <item>4,1</item> <item>4,2</item> </input2DStringArray> </m:echo2DStringArray> </SOAP-ENV:Body></SOAP-ENV:Envelope> |
- developerWorks worldwide 사이트에서 이 기사에 관한 영어원문.
- "Introduction to Web services and WSDL by Bilal Siddiqui".
- WSDL로 웹 서비스 전개하기, Part 2: Simple Object Access Protocol (SOAP).
- "Advancing SOAP Interoperability by Tony Hong"
- SOAPBuilders Interoperability Lab.
- SOAPBuilders Round 2.
- SOAPBuilders discussion group.
- Download : SOAP 클라이언트 다운로드.
- W3C XML Schema Part 2: Datatypes.
- SOAP Version 1.1 W3C Note & SOAP Version 1.2 Part 0: Primer.
'웹서비스' 카테고리의 다른 글
Axis2에서 SOAPMonitor 사용하기 (0) | 2010.07.12 |
---|---|
Flex - SOAP 호출 (0) | 2010.07.07 |
SOAP 에서 첨부파일 전송하기 (0) | 2010.07.07 |
Tomcat을 이용하여 SOAP 설정 (0) | 2010.07.07 |
SOAP을 이용하여 간단한 예제 (0) | 2010.07.07 |