수색…


비고

이 섹션에서는 비누가 무엇인지, 왜 개발자가 비누를 사용하고자하는지에 대한 개요를 제공합니다.

또한 비누 안에있는 큰 주제를 언급하고 관련 주제에 링크해야합니다. 비누 용 문서가 새롭기 때문에 이러한 관련 주제의 초기 버전을 만들어야 할 수도 있습니다.

버전

번역 출시일
1.1 2000-05-08
1.2 2003-06-24

일반 정보

SOAP은 RPC (Remote Procedure Call)를 통해 다른 SOAP 서비스 또는 클라이언트와 데이터를 교환하는 데 사용되는 프로토콜 을 정의하는 Simple Object Access Protocol 의 머리 글자 어입니다. 그것은 두 가지 버전으로 제공됩니다 :

SOAP 1.2는 SOAP 1.1을 사용하지 않으므로 가능한 경우 SOAP 1.2를 사용하는 것이 좋습니다.

그것은 프로토콜에 따라 지원할지라도 HTTP / S의 맨 위에 구축하고 SMTP 나 FTP에서는 거의 빌드하지 않습니다. HTTP는 종종 기본 전송 프로토콜로 사용되지만 SOAP는 일부만 사용합니다. 요청을 전송하기 위해 HTTP의 POST 작업에 거의 의존합니다. 문서는 URI 매개 변수로 전달되어야하므로 대부분의 프레임 워크에서 거부되는 약 3000 자 경계를 초과 할 수 있지만 GET 호출은 이론적으로 1.2 이후 가능합니다. 또한 보안 관련 설정은 대개 특수 SOAP 헤더 내에서 정의됩니다.

SOAP와 REST 는 웹 서비스라고 불리지 만 사실상 매우 다릅니다. 일부 프레임 워크는 WS (SOAP 기반 서비스의 경우)와 RS (REST 기반 서비스의 경우)를 구별합니다.

다음 표는 두 웹 서비스 유형의 차이점에 대한 간략한 개요를 제공합니다.

양상 비누 휴식
표준 SOAP , WSDL 표준이없고 단지 건축 스타일
자원 주소 지정 SOAP 작업을 통한 간접 고유 자원 식별자 (URI)
오류 처리 SOAP 오류 메시지 HTTP 오류 응답 코드 및 선택적으로 응답 본문
데이터 표현 XML HTTP에서 사용 가능한 모든 인코딩
HTTP 사용 전송 프로토콜 HTTP 메소드 (GET, POST, PUT, DELETE, ...)에 매핑 된 자원에 대한 작업 (CRUD)
거래 지원 SOAP 헤더를 통해 트랜잭션을 자원으로 모델링함으로써
상태 상태 유지 (SOAP 동작은 응용 프로그램의 일부 임) 무국적자 (자체 포함 요청)
서비스 발견 UDDI / WSDL 실제로 없음; API의 Start-URI는 하위 API 목록을 반환해야합니다.
방법 SOAP 본문 내부 HTTP 메소드
메소드 인수 WSDL의 XML 스키마에 의해 정의 됨 HTTP 헤더 또는 경로 / 쿼리 또는 URI 내의 Matrix 매개 변수를 통해
상태 전이 직접 데이터를 기반으로하지 않기로 결정하기 어려움 다음 URI 호출
캐싱 지원 종종 원하지 않는 캐싱, HTTP에 정의 된 단순

비누

SOAP 요청은 본문 요소를 포함해야하며 선택적인 헤더 요소를 포함 할 수있는 SOAP 봉투로 구성됩니다. 헤더 요소는 WS-Security 가 메시지가 암호화되거나 WS-Coordination / WS-Transaction 이 메시지가 트랜잭션 내에서 실행되어야한다고 정의 할 수있는 것처럼 특정 구성을 서비스에 전달하는 데 사용됩니다.

HTTP를 통해 두 개의 값을 추가하는 간단한 SOAP 1.2 요청은 다음과 같습니다.

POST /calculator HTTP/1.1
Host: http://example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 224

<?xml version="1.0"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
 <env:Body>
  <m:AddValues xmlns:m="http://example.org/calculator">
   <m:FirstValue>1</m:FirstValue>
   <m:SecondValue>2</m:SecondValue>
  </m:AddValues>
 </env:Body>
</env:Envelope>

위의 샘플 요청에 대한 응답은 다음과 같습니다.

HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 329

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
               soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
 <soap:Body xmlns:m="http://www.example.org/calculator">
  <m:AddValuesResponse>
   <m:Result>3</m:Result>
  </m:AddValuesResponse>
 </soap:Body>
</soap:Envelope>

위의 예에서는 FirstValue1 설정하고 SecondValue2 설정하여 두 개의 인수로 AddValues 메소드를 호출 한 요청을 정의했습니다. 이 요청은 결과 값으로 3 을 계산 한 원격 SOAP 서버에서이 메소드를 실행하는 결과를 낳았습니다. 결과는 일반적으로 호출 된 메소드 이름과 후행 Response 문자열을 따로 사용하는 별도의 응답 요소에 캡슐화됩니다. 응답을 검사하면 이것이 이전 AddValue 메소드 호출의 응답이라고 결론을 내릴 수 있습니다.

SOAP 1.1과 1.2의 차이점

SOAP 1.2는 바인딩 프레임 워크가 프로토콜에 의해 지원되는 한 HTTP 이외의 다른 전송 프로토콜을 허용합니다.

SOAP 1.1은 XML 1.0을 기반으로하고, 1.2는 XML Infoset을 기반으로합니다. SOAP Infoset은 SOAP 1.1에서 사용되는 기본 XML 1.0 직렬화 기와 다른 직렬 기와 함께 SOAP 메시지를 직렬화 할 수 있습니다. 따라서 메시지를 2 진 메시지로 직렬화 할 수 있으므로 메시지의 XML 본질에 약간의 오버 헤드가 발생하지 않습니다. 그 외에도 사용되는 기본 프로토콜의 직렬화 메커니즘은 데이터 바인딩을 통해 결정될 수 있습니다.

상호 운용성 측면은 해석을위한 많은 가능성을 제거한 이전 모델보다 더 구체적인 처리 모델을 정의함으로써 SOAP 1.2로 촉진되었습니다. SOAP 1.1 및 1.2 메시지에서 작동 할 수있는 SAAJ (Attachment API)가있는 SOAP은 많은 프레임 워크 구현자가 메시지를 처리하고 작성하는 데 도움이되었습니다.

W3C는 SOAP 1.1과 1.2 사이의 주요 변경 사항에 대한 간략한 개요를 발표했다.

웹 서비스 상호 운용성

웹 서비스 상호 운용성 (WS-I라고도 함) 은 IBM, Microsoft, Oracle 및 HP와 같은 잘 알려진 기업이 관리하는 상호 운용성 지침입니다. 이러한 지침은 SOAP가 본문 내에 여러 요소를 포함 할 수 있도록 허용하더라도 SOAP 본문 내에서 단 하나의 루트 요소 만 사용하도록 권장합니다.

WS-I 구성

  • WS-I 기본 프로필 일명 WSI-BP
  • WS-I 기본 보안 프로필
  • 단순한 비누 바인딩 프로파일

WSI-BP는 v1.0 (2004) , v1.1 (2006) , v1.2 (2010) , v2.0 (2010)의 4 가지 버전으로 제공되며 SOAP, WSDL과 같은 핵심 웹 서비스 사양에 대한 상호 운용성 지침을 정의합니다. 및 UDDI. SOAP 서비스는 WSDL (Web Services Description Language)을 사용하여 지원되는 작업과 메서드를 다른 끝점에 대한 응집 된 집합으로 설명 할 수 있습니다. WSI-BP는 WSDL을 사용하여 더 좁은 집합을 정의한 다음 전체 WSDL 또는 SOAP 스키마를 정의하므로 사양 자체 내의 모호성을 제거하고 끝점 간의 상호 운용성을 향상시킵니다.

WSDL

사용 가능한 SOAP 조작, 매개 변수 및 클라이언트에 호출 할 각각의 엔드 포인트를 광고하기 위해 Web Services Description Language 또는 WSDL이라는 XML 기반 문서가 사용됩니다.

WSDL은 서비스 엔드 포인트, 조작에 대한 SOAP 메시지의 바인딩, 조작 인터페이스 및 유형을 클라이언트에 설명합니다. WSDL은 SOAP과 마찬가지로 두 버전에서 사용 가능합니다.이 버전은 클라이언트와 거의 동일한 의미를 표현하지만 구문이 약간 다릅니다.

WSDL 1.1

WSDL 1.1 설명은 service , binding , portTypemessage 섹션을 포함합니다. 위에 나온 계산기 샘플에 해당하는 샘플 WSDL 파일에서 볼 수 있듯이 WSDL 파일 내에서 스키마를 가져 오거나 정의 할 수 있습니다.

<wsdl:definitions xmlns:xs="http://www.w3.org/2001/XMLSchema"
                  xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
                  xmlns:calc="http://example.org/calculator"
                  xmlns:tns="http://example.org/calculatorService"
                  targetNamespace="http://example.org/calculatorService">

    <!--
      Abstract type definitions
    -->

    <wsdl:types>
        <!--
        <xs:schema>
            <xs:import namespace="http://example.org/calculator" schemaLocation="calc/calculator.xsd" />
        </xs:schema>
        -->
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                   xmlns:tns="http://example.org/calculator"
                   targetNamespace="http://example.org/calculator"
                   elementFormDefault="qualified"
                   attributeFormDefault="qualified">

            <xs:element name="AddValuesRequest" type="tns:AddValuesType" />
            <xs:element name="AddValuesResponse" type="tns:AddValuesResponseType" />

            <xs:complexType name="AddValuesType">
                <xs:sequence>
                    <xs:element name="FirstValue" type="xs:int" minOccurs="1" maxOccurs="1" />
                    <xs:element name="SecondValue" type="xs:int" minOccurs="1" maxOccurs="1" />
                </xs:sequence>
            </xs:complexType>

            <xs:complexType name="AddValuesResponseType">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="Result" type="xs:int" />
                </xs:sequence>
            </xs:complexType>

            <xs:attribute name="Timestamp" type="xs:dateTime" />
            <xs:element name="CalculationFailure">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="ErrorCode" type="xs:int" />
                        <xs:element name="Reason" type="xs:string" />
                    </xs:sequence>
                    <xs:attribute ref="tns:Timestamp" use="required" />
                </xs:complexType>
            </xs:element>

        </xs:schema>
    </wsdl:types>

    <!--
        Abstract message definitions
    -->

    <wsdl:message name="AddValuesRequest">
        <wsdl:part name="in" element="calc:AddValuesRequest" />
    </wsdl:message>
    <wsdl:message name="AddValuesResponse">
        <wsdl:part name="out" element="calc:AddValuesResponse" />
    </wsdl:message>
    <wsdl:message name="CalculationFault">
        <wsdl:part name="fault" element="calc:CalculationFailure" />
    </wsdl:message>

    <!--
        Abstract portType / interface definition
    -->

    <wsdl:portType name="CalculatorEndpoint">
        <wsdl:operation name="AddValues">
            <wsdl:documentation>Adds up passed values and returns the result</wsdl:documentation>
            <wsdl:input message="tns:AddValuesRequest" />
            <wsdl:output message="tns:AddValuesResponse" />
            <wsdl:fault name="CalculationFault" message="tns:CalculationFault" />
        </wsdl:operation>
    </wsdl:portType>

    <!--
      Concrete binding definition
    -->

    <wsdl:binding name="CalculatorBinding" type="tns:CalculatorEndpoint">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="AddValues">
            <soap:operation soapAction="http://example.org/calculator/AddValuesMessage" />
            <wsdl:input>
                <soap:body parts="in" use="literal" />
            </wsdl:input>
            <wsdl:output>
                <soap:body parts="out" use="literal" />
            </wsdl:output>
            <wsdl:fault name="CalculationFault">
                <soap:fault name="CalculationFault" use="literal" />
            </wsdl:fault>
        </wsdl:operation>
    </wsdl:binding>

    <!--
        Concrete service definition
    -->

    <wsdl:service name="CalculatorService">
        <wsdl:port name="CalculatorServicePort" binding="tns:CalculatorBinding">
            <soap:address location="http://localhost:8080/services/calculator" />
        </wsdl:port>
    </wsdl:service>

</wsdl:definitions>

service 섹션은 서비스가 들어오는 요청을 수신하는 구체적인 끝점을 정의합니다. binding 섹션은 작업을 구체적인 스타일에 바인딩하고 서버가 기대하거나 클라이언트가 기대할 수있는 메시지 형식을 정의합니다.

추상 섹션은 서비스가 제공하는 오퍼레이션과 교환되는 메시지를 정의하는 portType 블록으로 구성됩니다. 메시지는 on 블록에 지정되고 인수 및 반환 값이 인스턴스 인 스키마 유형에 연결됩니다. 메시지는 매개 변수를 선언하거나 in , out 또는 inout 값을 반환 할 수 있습니다. 첫 번째 두 개는 이해하기 쉽지만 후자는 참조로 전달 된 인수의 동작을 모방합니다. 일부 언어에서는 pass-by-ref가 지원되지 않으므로이 효과는 특정 핸들러를 통해 종종 시뮬레이트됩니다.

WSDL 2.0

같은 계산기는 WSDL 2.0에서 다음과 같이 설명 할 수 있습니다.

<?xml version="1.0" encoding="utf-8" ?>
<wsdl:description xmlns:xs="http://www.w3.org/2001/XMLSchema"
                  xmlns:wsdl="http://www.w3.org/ns/wsdl"
                  xmlns:soap="http://www.w3.org/ns/wsdl/soap"
                  xmlns:calc="http://example.org/calculator"
                  xmlns:tns="http://example.org/calculatorService"
                  targetNamespace="http://example.org/calculatorService">

    <!--
      Abstract type definitions
    -->

    <wsdl:types>
        <!--
        <xs:schema>
            <xs:import namespace="http://example.org/calculator" schemaLocation="calc/calculator.xsd" />
        </xs:schema>
        -->
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                   xmlns:tns="http://example.org/calculator"
                   targetNamespace="http://example.org/calculator"
                   elementFormDefault="qualified"
                   attributeFormDefault="qualified">

            <xs:element name="AddValuesRequest" type="tns:AddValuesType" />
            <xs:element name="AddValuesResponse" type="tns:AddValuesResponseType" />

            <xs:complexType name="AddValuesType">
                <xs:sequence>
                    <xs:element name="FirstValue" type="xs:int" minOccurs="1" maxOccurs="1" />
                    <xs:element name="SecondValue" type="xs:int" minOccurs="1" maxOccurs="1" />
                </xs:sequence>
            </xs:complexType>

            <xs:complexType name="AddValuesResponseType">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="Result" type="xs:int" />
                </xs:sequence>
            </xs:complexType>

            <xs:attribute name="Timestamp" type="xs:dateTime" />
            <xs:element name="CalculationFault">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="ErrorCode" type="xs:int" />
                        <xs:element name="Reason" type="xs:string" />
                    </xs:sequence>
                    <xs:attribute ref="tns:Timestamp" use="required" />
                </xs:complexType>
            </xs:element>

        </xs:schema>
    </wsdl:types>

    <!--
        Abstract interface
    -->

    <wsdl:interface name="CalculatorInterface">
        <wsdl:fault name="fault" element="calc:CalculationFault" />
        <wsdl:operation name="AddValues" pattern="http://www.w3.org/ns/wsdl/in-out" style="http://www.w3.org/ns/wsdl/style/iri" wsdl:safe="true">
            <wsdl:documentation>Adds up passed values and returns the result</wsdl:documentation>
            <wsdl:input messageLabel="in" element="calc:AddValuesRequest" />
            <wsdl:output messageLabel="out" element="calc:AddValuesResponse" />
            <wsdl:outfault messageLabel="fault" ref="tns:fault" />
        </wsdl:operation>
    </wsdl:interface>

    <!--
        Concrete binding definition
    -->

    <wsdl:binding name="CalculatorBinding" interface="tns:CalculatorInterface" type="http://www.w3.org/ns/wsdl/soap" soap:protocol="http://www.w3.org/2003/05/soap/bindings/HTTP/">
        <wsdl:operation ref="tns:AddValues" soap:mep="http://www.w3.org/2003/05/soap/mep/soap-response" />
        <wsdl:fault ref="tns:fault" soap:code="soap:Sender" />
    </wsdl:binding>

    <!--
        Concrete service definition
    -->

    <wsdl:service name="CalculatorService" interface="tns:CalculatorInterface">
        <wsdl:endpoint name="CalculatorEndpoint" binding="tns:CalculatorBinding" address="http://localhost:8080/services/calculator" />
    </wsdl:service>

</wsdl:description>

WSDL 1.1과 2.0의 차이점

두 버전의 차이점에 대한 그래픽 개요는 아래 그림에서 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오. ( 출처 )

이미지에서 볼 수 있듯이 이제 message 섹션이 제거되어 interface 섹션에 포함됩니다. 또한 일부 요소의 이름이 바뀌었고 다른 요소의 구문이 다르지만 일반적으로 WSDL 버전은 기본적으로 버전 2.0과 동일하지만 1.1에 비해 쓰기 오버 헤드가 약간 더 필요합니다.

WSDL 2.0을 통해 SOAP 기반 서비스를 정의 할 때 차지하는 공간이 작을뿐만 아니라 새로운 버전은 WSDL 2.0이나 WADL이 RESTful 서비스에는 권장되지 않지만 REST 서비스를 정의 할 수있는 기능을 제공합니다.

선호하는 스타일

WSDL 바인딩 섹션은 서비스가 SOAP 메시징 프로토콜에 바인딩되는 방법을 설명합니다. 위 예제는 document 를 바인딩 스타일로 사용하여 결과물이 유효한 XML 인스턴스 인 한 SOAP 몸체를 원하는대로 구성 할 수 있습니다. 이것은 기본 바인딩 스타일이며 종종 Message-Oriented style 이라고합니다.

document 스타일과 달리 RPC 스타일 요청 본문에는 작업 이름과 메서드 매개 변수 집합이 모두 포함되어야합니다. 따라서 XML 인스턴스의 구조는 사전 정의되며 변경할 수 없습니다.

바인딩 스타일 외에도 바인딩 섹션은 literal 또는 encoded 이름의 SOAP 메시지 바인딩에 대한 변환 모델을 정의합니다. 두 모델의 차이점은 literal 모델은 사용자 정의 XSD 구조를 따라야한다는 것입니다. encoded 모델은 xs:integer 또는 xs:string 과 같은 XSD 데이터 유형을 사용해야하지만 리퀘스트 모델은 요청 및 응답을 검증하는 데 사용할 수있는 사용자 정의 XSD 구조를 준수해야합니다. 따라서 사용자 정의 스키마를 따르지 않아야합니다. 그러나 이렇게하면 메시지 본문의 유효성을 검사하거나 메시지를 XSLT를 통해 다른 형식으로 변환하는 것이 더 어려워집니다.

바인딩 스타일과 사용 모델의 조합은 실제로 4 가지 다른 메시지 결과를 허용합니다. 다섯 번째 항목이 일반적으로 사용되는 목록에 추가됩니다 (실제로는 표준의 일부는 아님).

  • RPC / encoded
  • RPC / 리터럴
  • 문서화 / 인코딩 됨
  • 문서 / 리터럴
  • 문서 / 리터럴 (랩핑 된)

메시징의 문서 / 리터럴 스타일에는 wrapped-document / literal으로 알려진 패턴이 있습니다. 이는 단지 하나의 패턴 일 뿐이며 WSDL 사양의 일부는 아닙니다. 이 패턴은 JSR 224 (JAX-WS : XML 기반 웹 서비스 용 Java API)에 언급되어 있습니다. ( 출처 )

아래 섹션에서는 WSDL 또는 스키마 선언과 관련된 차이점과 바인딩 스타일 또는 모델 정의 사용 중 변경되는 SOAP 메시지 형식에 미치는 영향에 대한 개요를 제공합니다.

RPC / encoded

WSDL :

...
<wsdl:message name="AddValues">
  <wsdl:part name="FirstValue" type="xsd:int" />
  <wsdl:part name="SecondValue" type="xsd:int" />
</wsdl:message>
<wsdl:message name="AddValuesResponse">
  <wsdl:part name="Result" type="xsd:int" />
</wsdl:message>

<wsdl:portType name="CalculatorEndpoint">
  <wsdl:operation="AddValues">
    <wsdl:input message="AddValues" />
    <wsdl:output message="AddValuesResponse" />
  </wsdl:operation>
</wsdl:portType>

<!-- binding style set to 'RPC' and use to 'encoded' -->
...

SOAP 요청

<soap:envelope>
  <soap:body>
    <AddValues>
      <FirstValue xsi:type="xsd:int">1</FirstValue>
      <SecondValue xsi:type="xsd:int">2</SecondValue>
    </AddValues>
  </soap:body>
</soap:envelope>

SOAP 응답

<soap:envelope>
  <soap:body>
    <AddValuesResponse>
      <Result xsi:type="xsd:int">3</Result>
    </AddValuesResponse>
  </soap:body>
</soap:envelope>

찬성

  • 간단한 WSDL
  • 요청 및 응답에서 사용할 수있는 작업 및 요소 이름

단점

  • XSI 형식의 명시 적 선언
  • 검증하기 어렵다.
  • WS-I와 호환되지 않음

RPC / 리터럴

WSDL :

...
<wsdl:message name="AddValues">
  <wsdl:part name="FirstValue" type="xsd:int" />
  <wsdl:part name="SecondValue" type="xsd:int" />
</wsdl:message>
<wsdl:message name="AddValuesResponse">
  <wsdl:part name="Result" type="xsd:int" />
</wsdl:message>

<wsdl:portType name="CalculatorEndpoint">
  <wsdl:operation="AddValues">
    <wsdl:input message="AddValues" />
    <wsdl:output message="AddValuesResponse" />
  </wsdl:operation>
</wsdl:portType>

<!-- binding style set to 'RPC' and use to 'literal' -->
...

SOAP 요청

<soap:envelope>
  <soap:body>
    <AddValues>
      <FirstValue>1</FirstValue>
      <SecondValue>2</SecondValue>
    </AddValues>
  </soap:body>
</soap:envelope>

SOAP 응답

<soap:envelope>
  <soap:body>
    <AddValuesResult>
      <Result>3</Result>
    </AddValuesResult>
  </soap:body>
</soap:envelope>

찬성

  • 간단한 WSDL
  • 요청 및 응답에서 사용할 수있는 작업 및 요소 이름
  • XSI 유형 스펙이 필요하지 않습니다.
  • WS-I 호환

단점

  • 검증하기 어렵다.

문서화 / 인코딩 됨

의미가 없으므로 생략합니다.

문서 / 리터럴

WSDL :

...
<types>
  <schema>
    <element name="FirstValueElement" type="xsd:int" />
    <element name="SecondValueElement" type="xsd:int" />
    <element name="ResultValueElement" type="xsd:int" />
  </schema>
</types>

<wsdl:message name="AddValues">
  <wsdl:part name="FirstValue" element="FirstValueElement" />
  <wsdl:part name="SecondValue" element="SecondValueElement" />
</wsdl:message>
<wsdl:message name="AddValuesResponse">
  <wsdl:part name="Result" element="ResultValueElement" />
</wsdl:message>

<wsdl:portType name="CalculatorEndpoint">
  <wsdl:operation="AddValues">
    <wsdl:input message="AddValues" />
    <wsdl:output message="AddValuesResponse" />
  </wsdl:operation>
</wsdl:portType>

<!-- binding style set to 'Document' and use to 'literal' -->
...

SOAP 요청

<soap:envelope>
  <soap:body>
    <FirstValueElement>1</FirstValueElement>
    <SecondValueElement>2</SecondValueElement>
  </soap:body>
</soap:envelope>

SOAP 응답

<soap:envelope>
  <soap:body>
    <ResultElement>3</ResultElement>
  </soap:body>
</soap:envelope>

찬성

  • XSI 유형 인코딩 없음
  • 시체 확인 가능
  • 제한 사항을 준수하는 WS-I 호환

단점

  • WSDL은 추가 XSD 정의로 인해 더 복잡합니다.
  • 작업 이름이 손실되었습니다.
  • WS-I는 SOAP 본문에 하나의 자식 만 허용합니다.

문서 / 리터럴 (랩핑 된)

WSDL :

...
<types>
  <schema>
    <element name="AddValues">
      <complexType>
        <sequence>
          <element name="FirstValue" type="xsd:int" />
          <element name="SecondValue" type="xsd:int" />
        </sequence>
      </complexType>
    </element>
    <element name="AddValuesResponse">
      <complexType>
        <sequence>
          <element name="ResultValue" type="xsd:int" />
        </sequence>
      </complexType>
    </element>
  </schema>
</types>

<wsdl:message name="AddValues">
  <wsdl:part name="in" element="AddValues" />
</wsdl:message>
<wsdl:message name="AddValuesResponse">
  <wsdl:part name="out" element="AddValuesResponse" />
</wsdl:message>

<wsdl:portType name="CalculatorEndpoint">
  <wsdl:operation="AddValues">
    <wsdl:input message="AddValues" />
    <wsdl:output message="AddValuesResponse" />
  </wsdl:operation>
</wsdl:portType>

<!-- binding style set to 'Document' and use to 'literal' -->
...

SOAP 요청

<soap:envelope>
  <soap:body>
    <AddValues>
      <FirstValue>1</FirstValue>
      <SecondValue>2</SecondValue>
    </AddValues>
  </soap:body>
</soap:envelope>

SOAP 응답

<soap:envelope>
  <soap:body>
    <AddValuesResponse>
      <Result>3</Result>
    </AddValuesResponse>
  </soap:body>
</soap:envelope>

찬성

  • XSI 유형 인코딩 없음
  • 시체 확인 가능
  • 요청 및 응답에서 사용할 수있는 작업 및 요소 이름
  • WS-I 호환

단점

  • WSDL은 추가 XSD 정의로 인해 더 복잡합니다.

UDDI

Universal Description, Discovery and Integration (UDDI) 는 특정 작업을 해결하는 서비스를 찾는 데 도움이되는 웹 서비스 용 XML 기반의 노란색 페이지 레지스트리 역할을하는 2000 년 창간 된 개방형 업계 이니셔티브입니다. 적절한 서비스를 찾으려면 먼저 UDDI와 같은 웹 서비스 레지스트리에 서비스를 등록해야합니다.

UDDI는 SOAP 메시지 교환에 사용되며 실제 웹 서비스를 호출하는 데 사용할 수있는 WSDL 문서에 대한 액세스를 제공합니다.

UDDI는 다음과 같은 조회 기준을 제공합니다.

  • 사업체 식별자
  • 비즈니스 이름
  • 사업장 위치
  • 업종
  • 이름 별 서비스 유형
  • 발견 URL

그러나 현재 UDDI의 큰 단점은 검색 구문 내에서 하나의 기준 만 사용할 수 있다는 것입니다. 따라서 특정 구현 자들은 UDDI 구현을 모듈화하여 여러 UDDI를 동시에 생성하는 쿼리를 허용 한 다음 반환 된 결과를 집계합니다.

그러나 실제로는 UDDI가 자주 사용되지 않습니다. 심지어 IBM, Microsoft, SAP 가 2005 년에 UDDI 서비스를 중단 한 이후로 UDDI가 죽었다고 말하는 사람들도 있습니다.

추가 노트 :

SOAP / WSDL은 광범위한 툴링 지원을 제공하며 교환되는 메시지 유형과 데이터가 임베디드 또는 링크 된 XSD 스키마를 통해 잘 정의되어 있으므로 클라이언트와 서버 모두에 대해 스텁 클래스를 동적으로 생성 할 수 있습니다.

WSDL 2.0은 웹 서비스를 정의하는 오버 헤드가 적지 만 특정 언어는 아직 새로운 표준을 채택하지 못했습니다. 즉, wsimport (Oracle / Sun) 또는 wsdl2java (Apache CXF)와 같은 Java 인기있는 도구에서 WSDL 2.0 설명을 제대로 처리 할 수 ​​없습니다. 따라서 호환성을 이유로 WSDL 1.1을 사용하는 것이 좋습니다. Java에서 WSDL 2.0 기반 SOAP 서비스를 개발해야한다면 Apache Axis2 프로젝트의 wsdl2java 를 살펴보십시오.

그러나 요즘에는 사람들이 이해할 수있는 깨끗한 URI와 HTTP 작업 호출을 혼합 한 HTTP 기반 API 서비스와 프로토콜을 특정 사용자 정의하여 작업을 완료하고 REST 기반 서비스는 실제 권장 사항을 완벽하게 준수하며, 또는 OFTP2 와 같은 자신의 바이트 레벨 프로토콜.

HTTP / REST 기본 서비스와 같은 리소스에 작업을 직접 매핑 할 수 없다면 SOAP은 당연히 유용합니다. 수행해야 할 작업이 당연히 작업을 나타내거나 특정 트랜잭션 의미를 정의해야하기 때문입니다. 또한 자신의 프로토콜을 정의하거나 구현할 리소스가 없다면 아마도 SOAP을 사용하는 것이 좋습니다. SOAP은 UDDI와 함께 WSDL 설명을 사용하여 서비스를 동적으로 결합 할 수 있으므로 오케스트레이션을 처리해야하는 경우 특히 유용합니다.

기상 서비스를위한 자바 클라이언트 http://www.webserviceX.NET에서 사용 가능한 오픈 소스 웹 서비스

  package com.test.ws.example;

 import javax.xml.soap.MessageFactory;
 import javax.xml.soap.MimeHeaders;
 import javax.xml.soap.SOAPBody;
 import javax.xml.soap.SOAPConnection;
 import javax.xml.soap.SOAPConnectionFactory;
 import javax.xml.soap.SOAPElement;
 import javax.xml.soap.SOAPEnvelope;
 import javax.xml.soap.SOAPMessage;
 import javax.xml.soap.SOAPPart;
 import javax.xml.transform.Source;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.stream.StreamResult;

 /*
  * WSDL url :  http://www.webservicex.com/globalweather.asmx?WSDL
  * Endpoint URL: http://www.webservicex.com/globalweather.asmx   */

    public class WSClient {

   public static void main(String args[]) {

    try {
        SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
        SOAPConnection soapConnection = soapConnectionFactory.createConnection();

        // Generate SOAP request XML

        MessageFactory messageFactory = MessageFactory.newInstance();
        SOAPMessage soapMessage = messageFactory.createMessage();
        MimeHeaders header = soapMessage.getMimeHeaders();
        header.setHeader("SOAPAction", "http://www.webserviceX.NET/GetCitiesByCountry");
        SOAPPart soapPart = soapMessage.getSOAPPart();
        SOAPEnvelope envelope = soapPart.getEnvelope();
        envelope.addNamespaceDeclaration("web", "http://www.webserviceX.NET");
        SOAPBody soapBody = envelope.getBody();
        SOAPElement soapBodyElem = soapBody.addChildElement("GetCitiesByCountry", "web");
        SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("CountryName", "web");
        soapBodyElem1.addTextNode("INDIA");
        soapMessage.saveChanges();
        soapMessage.writeTo(System.out);
        
                    
        // Call webservice endpint
        String url = "http://www.webservicex.com/globalweather.asmx";
        SOAPMessage soapResponse = soapConnection.call(soapMessage, url);
        Source sourceContent = soapResponse.getSOAPPart().getContent();

        // Print SOAP response
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        System.out.println("Response SOAP Message \n");
        StreamResult result = new StreamResult(System.out);
        transformer.transform(sourceContent, result);
        soapConnection.close();

    } catch (Exception e) {

        e.printStackTrace();
    }
}

}

JAX-WS를 사용하여 간단한 웹 서비스 및 클라이언트 만들기 (Document / literal)

이것은 프로젝트 디렉토리입니다.

프로젝트 디렉토리

  1. 서비스 종점 인터페이스

먼저 서비스 끝점 인터페이스를 만듭니다. javax.jws.WebService @WebService 주석은 클래스를 웹 서비스 엔드 포인트로 정의합니다.


import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.jws.soap.SOAPBinding.Use;

// Service Interface with customize targetNamespace
@WebService(targetNamespace = "http://hello-soap/ws")
@SOAPBinding(style = Style.DOCUMENT, use=Use.LITERAL) //optional
public interface HelloSoap {

    @WebMethod String getHelloSoap(String name);

}

  1. 서비스 종단점 구현 (SEI)

다음으로 서비스 엔드 포인트 구현을 작성합니다. 구현 클래스의 @WebService 주석에 endpointInterface 요소를 추가하여 명시 적 인터페이스를 작성합니다. 28.1.1 JAX-WS 엔드 포인트가 따라야하는 JAX-WS 엔드 포인트의 요구 사항 . getHelloSoap 메소드는 전달 된 이름을 사용하여 인사말을 클라이언트에 리턴합니다.


import javax.jws.WebService;

// Customized Service Implementation (portName,serviceName,targetNamespace are optional)

@WebService(portName = "HelloSoapPort", serviceName = "HelloSoapService",
endpointInterface = "com.wonderland.hellosoap.HelloSoap", targetNamespace = "http://hello-soap/ws")
public class HelloSoapImpl implements HelloSoap {

    @Override
    public String getHelloSoap(String name) {
        return "[JAX-WS] Hello : " + name;
    }

}

  1. 웹 서비스 엔드 포인트 게시자

import javax.xml.ws.Endpoint;

public class HelloSoapPublisher {

    public static void main(String[] args) {
        // creating web service endpoint publisher
        Endpoint.publish("http://localhost:9000/ws/hello-soap", new HelloSoapImpl());
    }

}

  1. 다음 단계에서는 HelloSoapPublisher.java 를 java 응용 프로그램으로 실행합니다. 그런 다음 웹 브라우저에서 URL http://localhost:9000/ws/hello-soap?wsdl 을 요청하여 WSDL 파일을 봅니다.
http : // localhost : 9000 / ws / hello-soap? wsdl

XML 데이터 형식이 웹 브라우저에 표시되면 다음 단계로 넘어갈 준비가되었습니다.

hello-soap? wsdl

노트 :
오류 메시지가 나타나면 wsgen 도구를 사용하여 필요한 JAX-WS 휴대용 아티팩트를 생성해야합니다. 우리는 여기서 wsgen 도구에 대해 다루지 않습니다.

  1. 웹 서비스 클라이언트

최종 단계에서 우리는 게시 된 서비스에 액세스하는 클라이언트를 만들 것입니다.


import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class HelloSoapClient {

    public static void main(String[] args) throws Exception {

        // create wsdl url
        URL wsdlDocumentUrl = new URL("http://localhost:8000/ws/hello-soap?wsdl");
        QName helloSoapService = new QName("http://hello-soap/ws", "HelloSoapService");
        // create web service
        Service service = Service.create(wsdlDocumentUrl, helloSoapService);
        // get object of pointed service port
        HelloSoap helloSoap = service.getPort(HelloSoap.class);
        // testing request
        System.out.println(helloSoap.getHelloSoap("Soap "));

    }

}

출력 : [JAX-WS] Hello : Soap

참고 : 웹 서비스 클라이언트에서 포트 번호가 8000 으로 변경되었습니다. 그 이유는 Eclipse IDE를 사용하여 TCP/IP monitor 도구를 빌드하여 메시지를 추적합니다 (자세한 정보 : Eclipse IDE에서 SOAP 메시지를 추적하는 방법 ). 기능 테스트 목적으로 시도하십시오 SoapUI | SOAP 및 REST API에 대한 기능 테스트 .



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow