Java API for XML-Based Web Services (JAX-WS) の場合、 Web サービス要求のほかに、イメージやファイルなどのバイナリー添付を送信することができます。 JAX-WS では、SOAP Message Transmission Optimization Mechanism (MTOM) の規定に従い、 バイナリー・データの最適化伝送のサポートが追加されています。
JAX-WS は、バイナリー添付データの送信用に SOAP Message Transmission Optimized Mechanism (MTOM) の使用をサポートします。MTOM を使用可能にすることにより、 データが XML 文書に含まれるようにするためにデータ・エンコードを行うコストを負担することなく、 バイナリー・データの送受信を最適に行うことができます。
WebSphere Application Server Feature Pack for Web Services は、JAX-WS アプリケーションの場合にのみ、MTOM を使用した添付の送信をサポートします。 本製品は、新規の MTOM および XOP 規格を使用することによって、 Web サービス・セキュリティー SOAP メッセージに添付を提供する機能も提供します。
JAX-WS アプリケーションは、XML 文書内に含まれる base64 または hexBinary エンコード・データとして、バイナリー・データを送信できます。 しかし、MTOM が備える最適化機能を利用するには、MTOM を使用可能にして、 バイナリーの base64 データを XML 文書外に含まれる添付として送信してください。 MTOM の最適化を使用できるのは、 xs:base64Binary データ型の場合のみです。 MTOM オプションは、デフォルトでは使用不可になっています。 JAX-WS アプリケーションでは、MTOM サポートを有効にするために、クライアント成果物とサーバー成果物の両方を別個に構成する必要があります。 サーバーの場合、MTOM を使用可能にできるのは、JAX-WS JavaBeans エンドポイント上のみで、 プロバイダー・ベースのエンドポイント上ではできません。
以下の例は、WSDL ファイルから開始する際に、Web サービスのクライアント・エンドポイントとサーバー・エンドポイントの両方で MTOM サポートを有効にする方法を示しています。
<types> ........ <xs:complexType name="ImageDepot"> <xs:sequence> <xs:element name="imageData" type="xs:base64Binary" xmime:expectedContentTypes="image/jpeg"/> </xs:sequence> </xs:complexType> ........ </types>
app_server_root¥bin¥wsimport.bat <wsdl_url>
MIME タイプ | Java 型 |
image/gif | java.awt.Image |
image/jpeg | java.awt.Image |
text/plain | java.lang.String |
text/xml | javax.xml.transform.Source |
application/xml | javax.xml.transform.Source |
*/* | javax.activation.DataHandler |
//Create the Dispatch instance. JAXBContext jbc = JAXBContext.newInstance("org.apache.axis2.jaxws.sample.mtom"); Dispatch<Object> dispatch = svc.createDispatch(portName, jbc, Service.Mode.PAYLOAD); //Enable MTOM. SOAPBinding binding = (SOAPBinding) dispatch.getBinding(); binding.setMTOMEnabled(true);
//Create the Dynamic Proxy instance. Service svc = Service.create(serviceName); MtomSample proxy = svc.getPort(portName, MtomSample.class); //Enable MTOM. BindingProvider bp = (BindingProvider) proxy; SOAPBinding binding = (SOAPBinding) bp.getBinding(); binding.setMTOMEnabled(true);JAX-WS クライアントを MTOM 対応にしたので、サーバーに送られるメッセージでも MTOM が使用可能になっています。しかし、サーバーが MTOM を使用してクライアントに応答する場合は、 JavaBeans エンドポイントで MTOM が使用できるようにする必要があります。
WebService (endpointInterface="org.apache.axis2.jaxws.sample.mtom.MtomSample") @BindingType (SOAPBinding.SOAP11HTTP_MTOM_BINDING) public class MtomSampleService implements MtomSample { .... }jaxax.xml.ws.SOAPBinding クラスには、サポートされるバインディング・タイプごとに静的メンバーが含まれています。 SOAP11HTTP_MTOM_BINDING または SOAP12HTTP_MTOM_BINDING のいずれかを、@BindingType アノテーションの値として含めます。 この値により、すべてのサーバー応答で MTOM が使用可能になります。
サーバーおよびクライアントで MTOM を使用可能にすると、 添付を表すバイナリー・データは Multipurpose Internet Mail Extensions (MIME) 添付として SOAP メッセージに組み込まれます。MTOM を使用しない場合、 同じデータは XML スキーマを記述するフォーマット (base64 または 16 進数) でエンコードされて、XML 文書に組み込まれます。
… other transport headers ... Content-Type: multipart/related; boundary=MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812; type="application/xop+xml"; start=" <0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org>"; start-info="text/xml"; charset=UTF-8 --MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812 content-type: application/xop+xml; charset=UTF-8; type="text/xml"; content-transfer-encoding: binary content-id: <0.urn:uuid:0FE43E4D025F0BF3DC11582467646813@apache.org> <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body> <sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom"> <input> <imageData> <xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org"/> </imageData> </input> </sendImage> </soapenv:Body> </soapenv:Envelope> --MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812 content-type: text/plain content-transfer-encoding: binary content-id: <1.urn:uuid:0FE43E4D025F0BF3DC11582467646811@apache.org> … binary data goes here … --MIMEBoundaryurn_uuid_0FE43E4D025F0BF3DC11582467646812--
… other transport headers ... Content-Type: text/xml; charset=UTF-8 <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body> <sendImage xmlns="http://org/apache/axis2/jaxws/sample/mtom"> <input> <imageData>R0lGADl … more base64 encoded data … KTJk8giAAA7</imageData> </input> </sendImage> </soapenv:Body> </soapenv:Envelope>