예: WSIF를 사용하여 첨부 파일을 갖는 SOAP 메시지 전달
표준 SOAP 메시지에 대한 SOAP 처리 규칙을 변경하지 않는 방식으로 MIME 여러 부분/관련 메시지 내에서 첨부를 전달하기 위해 WSIF(Web Services Invocation Framework) SOAP 제공자를 사용하는 정보와 예제 코드입니다. 여기에는 SOAP 첨부 파일을 위한 WSDL(Web Services Description Language) 확장기능을 작성하는 방법과 유형 및 유형 맵핑에 대해 작업하는 방법이 포함됩니다.
첨부 파일을 갖는 W3C SOAP 메시지 문서는 전송을 위한 여러 부분 MIME 구조를 사용하여 기본 형식(예: GIF 또는 JPEG)으로 SOAP 메시지를 하나 이상의 첨부 파일과 연관시키는 표준 방식을 설명합니다. 이는 "여러 부분/관련" MIME 매체 유형의 특정 사용법 및 MIME 패키지 내에 번들된 엔티티에 대한 URI 참조의 사용 규칙을 정의합니다. 이로 인해 이는 표준 SOAP 메시지의 SOAP 처리 규칙이 변경되지 않는 방식으로 MIME 여러 부분/관련 메시지 내에서 SOAP 1.1 메시지를 전송하는 기술을 개괄합니다.
WSIF는 WSIF 서비스를 HTTP를 통한 SOAP 서비스로 링크하기 위해 SOAP 제공자를 사용하여 MIME 메시지의 첨부파일 전달을 지원합니다. 첨부는 javax.activation.DataHandler 오브젝트입니다. mime:multipartRelated, mime:part 및 mime:content 태그가 WSDL에서 첨부를 설명하기 위해 사용됩니다.
예제: SOAP 첨부용 WSDL 확장 작성
다음 예 WSDL은 attch 첨부가 하나 있는 단순 조작을 보여줍니다.
<binding name="MyBinding" type="tns:abc" >
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="MyOperation">
<soap:operation soapAction=""/>
<input>
<mime:multipartRelated>
<mime:part>
<soap:body use="encoded" namespace="http://mynamespace"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding"/>
</mime:part>
<mime:part>
<mime:content part="attch" type="text/html"/>
</mime:part>
</mime:multipartRelated>
</input>
</operation>
</binding>
- 조작(이 예의 경우 MyOperation)에 대한 입력 메시지에 part 속성(이 예의 경우 attch)이 있어야 합니다. 첨부가 아닌 다른 입력 파트가 MyOperation에 존재할 수 있습니다.
- 바인딩 입력에는 <soap:body> 태그 또는 <mime:multipartRelated> 태그가 있어야 하지만 두 태그가 함께 있어서는 안됩니다.
- MIME 메시지의 경우 <soap:body> 태그는 <mime:part> 태그 안에 있습니다. 바인딩 입력에서 <soap:body> 태그를 포함하고 <mime:content> 태그를 포함해서는 안되는 <mime:part> 태그는 하나뿐이어야 합니다. <soap:body> 태그의 경우 컨텐츠 유형이 text/xml인 것으로 가정되기 때문입니다.
- MIME 메시지에는 각각 <mime:part> 태그로 설명하는 여러 첨부가 있을 수 있습니다.
- <soap:body> 태그를 포함하지 않는 각 <mime:part> 태그에는 첨부 자체를 설명하는 <mime:content> 태그가 포함됩니다. <mime:content> 태그 내의 type 속성은 WSIF(Web Services Invocation Framework)에서 검사되거나 사용되지 않습니다. WSIF를 사용하는 애플리케이션에 첨부가 포함하는 내용을 제안합니다. 단일 <mime:part> 태그 내의 여러 <mime:content> 태그는 백엔드 서비스가 이 <mime:part> 태그 내의 <mime:content> 태그 중 하나로 지정된 유형의 단일 첨부 자료를 예상함을 의미합니다.
- <soap:body> 태그 내의 parts="..." 속성(선택사항)은 메시지의 모든 SOAP 파트의 이름뿐 아니라 모든 MIME 파트의 이름을 포함하는 것으로 가정됩니다.
예: SOAP 첨부를 전달하기 위해 WSIF 사용
다음 코드 스니펫은 예제: SOAP 첨부용 WSDL 확장 작성의 예제 WSDL에서 설명하는 서비스를 호출할 수 있습니다.
import javax.activation.DataHandler;
. . .
DataHandler dh = new DataHandler(new FileDataSource("myimage.jpg"));
WSIFServiceFactory factory = WSIFServiceFactory.newInstance();
WSIFService service = factory.getService("my.wsdl",null,null,"http://mynamespace","abc");
WSIFOperation op = service.getPort().createOperation("MyOperation");
WSIFMessage in = op.createInputMessage();
in.setObjectPart("attch",dh);
op.executeInputOnlyOperation(in);
DeploymentDescriptor.xml 파일의 연관된 유형 맵핑은 SOAP 서버에 따라 다릅니다. 예를 들어, Tomcat을 SOAP 2.3과 함께 사용하면 DeploymentDescriptor.xml 파일에 다음 유형 맵핑이 포함됩니다.
<isd:mappings>
<isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:x="http://mynamespace"
qname="x:datahandler"
javaType="javax.activation.DataHandler"
java2XMLClassName="org.apache.soap.encoding.soapenc.MimePartSerializer"
xml2JavaClassName="org.apache.soap.encoding.soapenc.MimePartSerializer" />
</isd:mappings>
이 경우, 다음 서명과 함께 백엔드 서비스가 호출됩니다.
public void MyOperation(DataHandler dh);
스텁을 사용하여 첨부 파일을 WSIF(Web Services Invocation Framework)에 전달할 수도 있습니다.
DataHandler dh = new DataHandler(new FileDataSource("myimage.jpg"));
WSIFServiceFactory factory = WSIFServiceFactory.newInstance();
WSIFService service = factory.getService("my.wsdl",null,null,"http://mynamespace","abc");
MyInterface stub = (MyInterface)service.getStub(MyInterface.class);
stub.MyOperation(dh);
첨부 파일도 조작으로부터 리턴할 수 있지만, 한 첨부 파일만 리턴 매개변수로 리턴할 수 있습니다.
SOAP 첨부 - 유형 및 유형 맵핑에 대한 작업
기본적으로 첨부 자료는 WSIF에 DataHandler 오브젝트로 전달됩니다. DataHandler 오브젝트인 메시지의 일부가 WSDL의 <mime:part> 태그에 맵핑되면 WSIF는 WSDL 유형의 완전한 이름을 DataHandler 클래스에 자동으로 맵핑하고 SOAP 제공자와의 해당 유형의 맵핑을 설정합니다.
WSDL에서 첨부 파일에 대한 스키마를(예를 들어, binary[] 유형으로) 정의했을 수도 있습니다. mapType() 메소드를 명시적으로 발행하지 않으면 WSIF는 이 맵핑을 무시하고 첨부 파일을 DataHandler 오브젝트로 간주합니다. WSIF는 SOAP 제공자가 WSDL의 <mime:content> 태그에 지정된 type 속성 대신 DataHandler 오브젝트의 유형을 기본으로 MIME 컨텐츠 유형을 설정하도록 합니다.
SOAP 첨부 - 지원되지 않는 시나리오
- DIME을 사용.
- javax.xml.transform.Source 및 javax.mail.internet.MimeMultipart에서 전달.
- mime:mimeXml WSDL 태그 사용.
- mime:part 태그에 mime:multipartRelated 태그 중첩.
- DataHandler, Image 등을 확장하는 유형 사용.
- DataHandler, Image 등이 포함된 유형 사용.
- DataHandlers, Images 등의 배열 또는 벡터 사용.
- 다중 송/수신 또는 출력 첨부 파일 사용.