AXIS 2 RCP/literal様式、2種類のMESSAGE定義方式SOAPのpayload

10904 ワード

COMPLEXTYPEのMESSAGE WSDLファイルの内容がありません。
リスト1:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
	xmlns:tns="http://www.ctgx.com/RPCService/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="RPCService"
	targetNamespace="http://www.ctgx.com/RPCService/">
	<wsdl:message name="concatRequest">
		<wsdl:part name="s1" type="xsd:string" />
		<wsdl:part name="s2" type="xsd:string"/>
	</wsdl:message>
	<wsdl:message name="concatResponse">
		<wsdl:part name="out" type="xsd:string" />
	</wsdl:message>
	<wsdl:portType name="RPCService">
		<wsdl:operation name="concat">
			<wsdl:input message="tns:concatRequest" />
			<wsdl:output message="tns:concatResponse" />
		</wsdl:operation>
	</wsdl:portType>
	<wsdl:binding name="RPCServiceSOAP" type="tns:RPCService">
		<soap:binding style="rpc"
			transport="http://schemas.xmlsoap.org/soap/http" />
		<wsdl:operation name="concat">
			<soap:operation soapAction="http://www.ctgx.com/RPCService/concat" />
			<wsdl:input>
				<soap:body namespace="http://www.ctgx.com/RPCService/"
					use="literal" />
			</wsdl:input>
			<wsdl:output>
				<soap:body namespace="http://www.ctgx.com/RPCService/"
					use="literal" />
			</wsdl:output>
		</wsdl:operation>
	</wsdl:binding>
	<wsdl:service name="RPCService">
		<wsdl:port binding="tns:RPCServiceSOAP" name="RPCServiceSOAP">
			<soap:address location="http://localhost:8080/axis2/services/RPCService" />
		</wsdl:port>
	</wsdl:service>
</wsdl:definitions>
  2:
クライアントが起動する時、直接にAXIOMのコードを使います。

package com.ctgx.www.rpcservice;

import javax.xml.namespace.QName;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;

/**
 * filename:LowLevelClient.java description: the file desciption goes here
 * Copyright: Copyright(c)2010 CTGX *
 * 
 * @author:    
 * @version: 1.0 Create at: 2010-7-28   04:47:45
 * 
 */
public class LowLevelClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws AxisFault {
		ServiceClient client = new ServiceClient();
		Options options = new Options();
		//          HTTP SOAPAction Header
		options.setAction("http://www.ctgx.com/RPCService/concat");
		options.setTo(new EndpointReference(
				"http://localhost:1234/axis2/services/RPCService?wsdl"));
		client.setOptions(options);
		OMElement request = makeRequest();
		OMElement response = client.sendReceive(request);
		System.out.println(response.toString());

	}

	private static OMElement makeRequest() {
		OMFactory factory = OMAbstractFactory.getOMFactory();
		OMElement request = factory.createOMElement(new QName(
				"http://www.ctgx.com/RPCService/", "concat"));
		OMElement s1 = factory.createOMElement(new QName("s1"));
		s1.setText("abc");
		OMElement s2 = factory.createOMElement(new QName("s2"));
		s2.setText("123");
		request.addChild(s2);
		request.addChild(s1);
		return request;

	}

}

対応するSOAPメッセージは以下の通りである。
リスト3:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
      <soapenv:Body>
         <axis2ns1:concat xmlns:axis2ns1="http://www.ctgx.com/RPCService/">
            <s2>123</s2>
            <s1>abc</s1>
         </axis2ns1:concat>
      </soapenv:Body>
   </soapenv:Envelope>
COMPLEXTYPEを使用したMESSAGE WSDLファイルの内容
リスト4:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
	xmlns:tns="http://www.ctgx.com/SimpleService1/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="SimpleService1"
	targetNamespace="http://www.ctgx.com/SimpleService1/">
	<wsdl:types>
		<xsd:schema targetNamespace="http://www.ctgx.com/SimpleService1/">
			<xsd:complexType name="concat">
				<xsd:sequence>
					<xsd:element name="s1" type="xsd:string" />
					<xsd:element name="s2" type="xsd:string"></xsd:element>
				</xsd:sequence>
			</xsd:complexType>
			<xsd:complexType name="concatResponse">
				<xsd:sequence>
					<xsd:element name="out" type="xsd:string" />
				</xsd:sequence>
			</xsd:complexType>
		</xsd:schema>
	</wsdl:types>
	<wsdl:message name="concatRequest">
		<wsdl:part type="tns:concat" name="parameters" />
	</wsdl:message>
	<wsdl:message name="concatResponse">
		<wsdl:part type="tns:concatResponse" name="parameters" />
	</wsdl:message>
	<wsdl:portType name="SimpleService1">
		<wsdl:operation name="concat">
			<wsdl:input message="tns:concatRequest" />
			<wsdl:output message="tns:concatResponse" />
		</wsdl:operation>
	</wsdl:portType>
	<wsdl:binding name="SimpleServiceSOAP" type="tns:SimpleService1">
		<soap:binding style="rpc"
			transport="http://schemas.xmlsoap.org/soap/http" />
		<wsdl:operation name="concat">
			<soap:operation soapAction="http://www.ctgx.com/SimpleService1/concat" />
			<wsdl:input>
				<soap:body use="literal" />
			</wsdl:input>
			<wsdl:output>
				<soap:body use="literal" />
			</wsdl:output>
		</wsdl:operation>
	</wsdl:binding>
	<wsdl:service name="SimpleService">
		<wsdl:port binding="tns:SimpleServiceSOAP" name="SimpleServiceSOAP">
			<soap:address location="http://localhost:8080/axis2/services/SimpleService1" />
		</wsdl:port>
	</wsdl:service>
</wsdl:definitions>

クライアントテストコード:
リスト5:

package com.ctgx.www.simpleservice1;

import javax.xml.namespace.QName;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;

/**
 * filename:LowLevelClient.java description: the file desciption goes here
 * Copyright: Copyright(c)2010 CTGX *
 * 
 * @author:    
 * @version: 1.0 Create at: 2010-7-28   04:47:45
 * 
 */
public class LowLevelClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws AxisFault {
		ServiceClient client = new ServiceClient();
		Options options = new Options();
		options.setAction("http://www.ctgx.com/SimpleService1/concat");
		options.setTo(new EndpointReference(
				"http://localhost:1234/axis2/services/SimpleService1"));
		client.setOptions(options);
		OMElement request = makeRequest();
		OMElement response = client.sendReceive(request);
		System.out.println(response.toString());

	}

	private static OMElement makeRequest() {
		OMFactory factory = OMAbstractFactory.getOMFactory();
		OMElement request = factory.createOMElement(new QName(
				"http://www.ctgx.com/SimpleService1/", "concat"));
		OMElement parameters=factory.createOMElement(new QName("parameters"));
		OMElement s1 = factory.createOMElement(new QName("s1"));
		s1.setText("abc");
		OMElement s2 = factory.createOMElement(new QName("s2"));
		s2.setText("123");
		request.addChild(parameters);
		parameters.addChild(s1);
		parameters.addChild(s2);
		return request;

	}

}

SOAPメッセージ
リスト6:

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
      <soapenv:Body>
         <axis2ns1:concat xmlns:axis2ns1="http://www.ctgx.com/SimpleService1/">
            <parameters>
               <s1>abc</s1>
               <s2>123</s2>
            </parameters>
         </axis2ns1:concat>
      </soapenv:Body>
   </soapenv:Envelope>
説明が必要なところ:
まず、リスト1はCOMPLEXTYPEを使用していません。リスト4はCOMPLEXTYPEを使用していますので、リスト3とリスト6のSOAP BODYのメッセージが違います。リスト3の2つのパラメータS 1とS 2は、直接に方法名concatに含まれ、名前はMESSAGEのPARTの名前と同じです。リスト6の2つのパラメータS 1とS 2は、parametersに含まれており、parametersとMESSAGE partの名前、そしてPAAMETERSの2つの要素はCOMPLEXTYPEに定義されている要素である。SOAPにはタイプと要素の参照がないので、PAAMETERSは実際に複合元素を構成しています。
第二に、リスト3とリスト6のS 1とS 2の順序は違っています。これはAXIS 2が生成したサービスエンドコードと関係があります。つまり、MESSAGEのPART順は、必ずしも方法中のパラメータの順番ではないが、COMPLEXTYPEで定義されているので、この点が保証されます。これはAXIS 2のデータバインディングと関係があります。
第3のポイントは、AXIS 2のRCP/LITEALサポートは、実際にはドコメント・WRAPPER方式であり、つまり、RCP/LITEALコード生成中に、AXIS 2が包装変換を行うということです。
添付ファイルはTCPMONアプリケーションで、SOAP情報をキャプチャーするのにとても便利です。