读书人

生成SOAP讯息示例

发布时间: 2012-10-09 10:21:45 作者: rapoo

生成SOAP消息示例

?

调用 web service 时生成soap消息的区别,此区别就会造成调用web service失败。

?

1、使用Axis 1.4调用wsdl中的接口、参数以及传入消息头,以下方法调用时不会把web service 的目标函数名称包含进SOAP消息里头。

import java.net.URL;import org.apache.axis.client.Stub;import org.apache.axis.message.SOAPHeaderElement;import org.xx.www.schema.parlayx.data.sync.v1_0.local.AuthUserBehaviorRequest;import org.xx.www.schema.parlayx.data.sync.v1_0.local.AuthUserBehaviorResponse;import org.xx.www.schema.parlayx.data.v1_0.NamedParameter;import org.xx.www.schema.parlayx.data.v1_0.NamedParameterList;import org.xx.www.wsdl.parlayx.data.sync.v1_0._interface.UsageAuth;import org.xx.www.wsdl.parlayx.data.sync.v1_0.service.UsageAuthServiceLocator;public class ClientTest_UsageAuth_Other {    public static void main(String[] args) {        UsageAuthServiceLocator locator = new UsageAuthServiceLocator();        try {            String url = "http://xxx:8110/UsageAuthService/services/UsageAuth";            AuthUserBehaviorRequest req = new AuthUserBehaviorRequest();            req.setMSISDN("1");            req.setServiceId("2");            req.setFid(null);            NamedParameter np = new NamedParameter();            np.setKey("contentSP");            np.setValue("3");            NamedParameter np1 = new NamedParameter();            np1.setKey("productID");            np1.setValue("1");            NamedParameter np2 = new NamedParameter();            np2.setKey("parentID");            np2.setValue("2");            NamedParameter[] extensionInfo = new NamedParameter[3];            extensionInfo[0] = np;            extensionInfo[1] = np1;            extensionInfo[2] = np2;            req.setExtensionInfo(new NamedParameterList(extensionInfo));            UsageAuth inter = locator.getUsageAuth(new URL(url));            SOAPHeaderElement headerElement = new SOAPHeaderElement("http://xx/schema/common/v2_1", "RequestSOAPHeader");            headerElement.addChildElement("spId").addTextNode("a");            headerElement.addChildElement("spPassword").addTextNode("a");            headerElement.addChildElement("serviceId").addTextNode("a");            headerElement.addChildElement("timeStamp").addTextNode("a");            ((Stub) inter).setHeader(headerElement);            try {                AuthUserBehaviorResponse rsp = inter.authUserBehavior(req);                System.out.println(rsp.getResult() + "--------------------------");                System.out.println(rsp.getResultDescription() + "--------------------------");            } catch (Exception e) {                e.printStackTrace();            }        } catch (Exception e) {            e.printStackTrace();        }    }}
?

产生的SOAP消息为:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v2="http://www.xx.com.cn/schema/common/v2_1" xmlns:loc="http://www.xx.org/schema/xx/xx/sync/v1_0/a">   <soapenv:Header>        <RequestSOAPHeader xmlns="http://www.xx.com.cn/schema/common/v2_1">            <spId>s</spId>            <spPassword>a</spPassword>            <serviceId>a</serviceId>            <timeStamp>a</timeStamp>        </RequestSOAPHeader>    </soapenv:Header>   <soapenv:Body>      <loc:AuthUserBehaviorRequest>         <loc:MSISDN>s</loc:MSISDN>         <loc:serviceId>s</loc:serviceId>         <loc:Fid></loc:Fid>         <loc:extensionInfo>            <namedParameters>               <key>contentSP</key>               <value>ss</value>            </namedParameters>               <namedParameters>               <key>productID</key>               <value>sa</value>            </namedParameters>               <namedParameters>               <key>parentID</key>               <value>sa</value>            </namedParameters>         </loc:extensionInfo>      </loc:AuthUserBehaviorRequest>   </soapenv:Body></soapenv:Envelope>

?

2、把调用的web service的目标函数名称包含在SOAP消息中。

import java.util.Calendar;import javax.xml.namespace.QName;import javax.xml.rpc.ParameterMode;import javax.xml.soap.SOAPElement;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import org.apache.axis.message.SOAPHeaderElement;import org.xx.www.schema.parlayx.data.sync.v1_0.local.AuthUserBehaviorRequest;import org.xx.www.schema.parlayx.data.sync.v1_0.local.AuthUserBehaviorResponse;import org.xx.www.schema.parlayx.data.v1_0.NamedParameter;import org.xx.www.schema.parlayx.data.v1_0.NamedParameterList;import com.wichina.common.DateUtils;public class ClientTest_UsageAuth {    /**     * @param args     */    public static void main(String[] args) {        try {            String endpointURL = "http://xx:8110/UsageAuthService/services/UsageAuth";            Service service = new Service();            Call call = (Call) service.createCall();            call.setTargetEndpointAddress(new java.net.URL(endpointURL));            call.setOperationName(new QName("http://aa/schema/parlayx/data/sync/v1_0/local", "AuthUserBehavior"));// 设置操作的名称。            // 添加消息头            SOAPHeaderElement requestSOAPHeader = new SOAPHeaderElement("http://ax/schema/common/v2_1", "RequestSOAPHeader");            SOAPElement spId = requestSOAPHeader.addChildElement("spId");            spId.addTextNode("1");            SOAPElement serviceId = requestSOAPHeader.addChildElement("serviceId");            serviceId.addTextNode("1");            SOAPElement timeStamp = requestSOAPHeader.addChildElement("timeStamp");            timeStamp.addTextNode(DateUtils.getDate(Calendar.getInstance().getTime(), "yyyyMMddHHmmss").toString());            SOAPElement spPassword = requestSOAPHeader.addChildElement("spPassword");            spPassword.addTextNode("2");            // SOAPElement fa = requestSOAPHeader.addChildElement("FA", "tns");            // fa.addTextNode("13799265585");            QName qnParam = new QName("http://xx/schema/parlayx/data/sync/v1_0/local", "p_qn");            call.addHeader(requestSOAPHeader);            call.setReturnType(qnParam);// 返回的数据类型            // 设置请求参数            NamedParameter[] extensionInfoReq = new NamedParameter[3];            NamedParameter namedParameter0 = new NamedParameter();            namedParameter0.setKey("contentSP");            namedParameter0.setValue("a");            extensionInfoReq[0] = namedParameter0;            NamedParameter namedParameter1 = new NamedParameter();            namedParameter1.setKey("productID");            namedParameter1.setValue("x");            extensionInfoReq[1] = namedParameter1;            NamedParameter namedParameter2 = new NamedParameter();            namedParameter2.setKey("parentID");            namedParameter2.setValue("x");            extensionInfoReq[2] = namedParameter2;            AuthUserBehaviorRequest request = new AuthUserBehaviorRequest();            request.setMSISDN("a");            request.setServiceId("x");            request.setExtensionInfo(new NamedParameterList(extensionInfoReq));            call.addParameter("AuthUserBehaviorRequest", qnParam, ParameterMode.IN);// 参数的类型            AuthUserBehaviorResponse rsp = (AuthUserBehaviorResponse) call.invoke(new Object[] { request });// 执行调用            System.out.println(rsp.getResult());            System.out.println(rsp.getResultDescription());            NamedParameterList extensionInfoList = rsp.getExtensionInfo();            NamedParameter[] extensionInfos = extensionInfoList.getNamedParameters();            if (extensionInfos != null) {                for (int i = 0; i < extensionInfos.length; i++) {                    System.out.println(extensionInfos[i].getKey() + "=>" + extensionInfos[i].getValue());                }            }        } catch (Exception e) {            e.printStackTrace();        }    }}

?生成的消息:

<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Header><ns1:RequestSOAPHeader soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next"soapenv:mustUnderstand="0" xmlns:ns1="http://xx/schema/common/v2_1"><ns1:spId>x</ns1:spId><ns1:serviceId>x</ns1:serviceId><ns1:timeStamp>x</ns1:timeStamp><ns1:spPassword>x</ns1:spPassword></ns1:RequestSOAPHeader></soapenv:Header><soapenv:Body><ns2:AuthUserBehavior soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"xmlns:ns2="http://xx/schema/parlayx/data/sync/v1_0/local"><AuthUserBehaviorRequest href="#id0" /></ns2:AuthUserBehavior><multiRef id="id0" soapenc:root="0"soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"xsi:type="ns3:AuthUserBehaviorRequest" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"xmlns:ns3="http://xx/schema/parlayx/data/sync/v1_0/local"><MSISDN xsi:type="xsd:string">x</MSISDN><serviceId xsi:type="xsd:string">x</serviceId><Fid xsi:type="xsd:string" xsi:nil="true" /><extensionInfo href="#id1" /></multiRef><multiRef id="id1" soapenc:root="0"soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"xsi:type="ns4:NamedParameterList" xmlns:ns4="http://xx/schema/parlayx/data/v1_0"xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"><namedParameters href="#id2" /><namedParameters href="#id3" /><namedParameters href="#id4" /></multiRef><multiRef id="id3" soapenc:root="0"soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"xsi:type="ns5:NamedParameter" xmlns:ns5="http://xx/schema/parlayx/data/v1_0"xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"><key xsi:type="xsd:string">productID</key><value xsi:type="xsd:string">x</value></multiRef><multiRef id="id4" soapenc:root="0"soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"xsi:type="ns6:NamedParameter" xmlns:ns6="http://xx/schema/parlayx/data/v1_0"xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"><key xsi:type="xsd:string">parentID</key><value xsi:type="xsd:string">x</value></multiRef><multiRef id="id2" soapenc:root="0"soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"xsi:type="ns7:NamedParameter" xmlns:ns7="http://xx/schema/parlayx/data/v1_0"xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"><key xsi:type="xsd:string">contentSP</key><value xsi:type="xsd:string">x</value></multiRef></soapenv:Body></soapenv:Envelope>

?第1种方法与第2种方法明显的区别在于,调用时有没有包含调用的web service函数名称。

?

?

?

读书人网 >XML SOAP

热点推荐