AXIS 2 RCP/literal様式、2種類のMESSAGE定義方式SOAPのpayload
COMPLEXTYPEのMESSAGE WSDLファイルの内容がありません。
リスト1:
リスト3:
リスト4:
リスト5:
リスト6:
まず、リスト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情報をキャプチャーするのにとても便利です。
リスト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情報をキャプチャーするのにとても便利です。