<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    軟件工程實踐者

    統計

    留言簿

    友情鏈結

    閱讀排行榜

    評論排行榜

    用Document/literal方式調用web service

    Document方式是Web service缺省調用模式,和literal相組合,給我們調用Web service提供了極大的便利,省去了RPC調用方式的復雜類型序列化的問題,所以,Doucment調用方式在BPEL領域應用非常廣泛,下面介紹基于Axis利用Document方式來調用一個Web service.

    1. Web service準備:
    Web service你可以任意實現一個,我是利用Oracle BPEL,通過建立一個BPEL流程,然后把它發布為Web service(具體創建過程省略),這里重要的是Web service的WSDL文件,這是我們調用的門戶。
    下面是我的Web service的WSDL文件內容:
    <definitions
         name="HelloWorld"
         targetNamespace="http://xmlns.oracle.com/HelloWorld"
         xmlns="http://schemas.xmlsoap.org/wsdl/"
         xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/"
         xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
         xmlns:client="http://xmlns.oracle.com/HelloWorld"
        >
        <types>
            <schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/HelloWorld"
                 xmlns="http://www.w3.org/2001/XMLSchema">
                <element name="HelloWorldProcessRequest">
                    <complexType>
                        <sequence>
                            <element name="input" type="string"/>
                        </sequence>
                    </complexType>
                </element>
                <element name="HelloWorldProcessResponse">
                    <complexType>
                        <sequence>
                            <element name="result" type="string"/>
                        </sequence>
                    </complexType>
                </element>
            </schema>
        </types>
        <message name="HelloWorldRequestMessage">
            <part name="payload" element="client:HelloWorldProcessRequest"/>
        </message>
        <message name="HelloWorldResponseMessage">
            <part name="payload" element="client:HelloWorldProcessResponse"/>
        </message>
        <portType name="HelloWorld">
            <operation name="process">
                <input message="client:HelloWorldRequestMessage"/>
                <output message="client:HelloWorldResponseMessage"/>
            </operation>
        </portType>
        <binding name="HelloWorldBinding" type="client:HelloWorld">
            <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
            <operation name="process">
                <soap:operation style="document" soapAction="process"/>
                <input>
                    <soap:body use="literal"/>
                </input>
                <output>
                    <soap:body use="literal"/>
                </output>
            </operation>
        </binding>
        <service name="HelloWorld">
            <port name="HelloWorldPort" binding="client:HelloWorldBinding">
                <soap:address location="http://robin:9700/orabpel/default/HelloWorld/1.0"/>
            </port>
        </service>
      <plnk:partnerLinkType name="HelloWorld">
        <plnk:role name="HelloWorldProvider">
          <plnk:portType name="client:HelloWorld"/>
        </plnk:role>
      </plnk:partnerLinkType>
    
    </definitions>


    2. 編寫調用類,代碼如下:
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.rmi.RemoteException;
    import java.util.Vector;
    
    import javax.xml.namespace.QName;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.FactoryConfigurationError;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.rpc.ServiceException;
    
    import org.apache.axis.client.Call;
    import org.apache.axis.constants.Style;
    import org.apache.axis.message.SOAPBodyElement;
    import org.apache.xml.serialize.DOMSerializerImpl;
    import org.apache.xml.serialize.OutputFormat;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    
    public class BPELServiceTest {
          //service的命名空間
    	static final String ns = "http://xmlns.oracle.com/HelloWorld";
    
    	public static void main(String args[]){
    		Call call = null;
    		try {
    			call = createCall();
    			Vector rtn = (Vector) call.invoke(createRequest());
    			parse(rtn);
    		} catch (MalformedURLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (RemoteException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (ParserConfigurationException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (FactoryConfigurationError e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    
          /*
    * 創建Call對象,對設置相關屬性,注意:其中的屬性應該是通過分析WSDL文件由程序動態獲得來賦值,
    * 這里全部簡化為靜態賦值
    */ static Call createCall() throws MalformedURLException, ServiceException{ org.apache.axis.client.Service s = new org.apache.axis.client.Service(); Call call = (Call) s.createCall(); call.setTargetEndpointAddress(new URL("http://robin:9700/orabpel/default/HelloWorld/1.0")); call.setSOAPActionURI("process"); call.setOperationName("process"); call.setProperty(Call.OPERATION_STYLE_PROPERTY, Style.DOCUMENT.getName()); call.setPortName(new QName(ns, "HelloWorldPort")); call.setPortTypeName(new QName(ns, "HelloWorld")); return call; } /*
           *創建請求參數,實際上就是構建DOM片斷,根據Web service對輸入參數的要求來構建,要多復雜,都可以實現,
    *這就是Docuemnt的好處,省去了復雜對象的序列化。
    */ static Object[] createRequest() throws ParserConfigurationException, FactoryConfigurationError{ DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = db.newDocument(); Element root = doc.createElementNS(ns, "HelloWorldProcessRequest"); Element input = doc.createElementNS(ns, "input"); input.appendChild(doc.createTextNode("robin")); root.appendChild(input); doc.appendChild(root); return new Object[]{new SOAPBodyElement(root)}; } // 對返回結果進行解析,并打印。 static void parse(Vector v) throws Exception{ Document doc = ((SOAPBodyElement) v.get(0)).getAsDocument(); Element root = doc.getDocumentElement(); OutputFormat of = new OutputFormat(); of.setIndent(4); System.out.println(new DOMSerializerImpl().writeToString(root)); } }


    上述代碼運行輸出結果為:
    <?xml version="1.0"?>
    <HelloWorldProcessResponse xmlns="http://xmlns.oracle.com/HelloWorld">
       <result xmlns="http://xmlns.oracle.com/HelloWorld">robin</result>
      </HelloWorldProcessResponse>
    


    上面的代碼很簡單,需要說明的是:采用Document調用,實際上invoke方法的參數是一個元素類型為SOAPBodyElement的對象數組,而返回結果是一個元素類型的SOAPBodyElement的Vector對象。

    posted on 2006-01-02 22:09 軟件工程實踐者 閱讀(5777) 評論(2)  編輯  收藏 所屬分類: Web service

    評論

    # re: 用Document/literal方式調用web service 2006-07-05 11:59 QQ:55683633

    但如果當同一個portType里有兩個或多個operation時,這就會出問題了,
    只會調用類里的位置最頂的第一個方法,注意那方法參數也是Document的.
    請問如何解決.??  回復  更多評論   

    # re: 用Document/literal方式調用web service 2006-11-17 13:46 人生是由回憶組成的

    不是可以指定operation name嗎?
    你可以試一試。  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 免费jjzz在线播放国产| 最近中文字幕mv免费高清视频7| 亚洲午夜精品第一区二区8050| 亚洲国产精品成人综合色在线| 午夜时刻免费入口| 国产精品亚洲а∨无码播放不卡 | 亚洲中文字幕无码中文| 免费精品国产自产拍在线观看图片| 久久精品国产亚洲精品2020| 3344免费播放观看视频 | 亚洲人6666成人观看| 2021精品国产品免费观看| 亚洲第一精品电影网| 成在人线AV无码免费| 日本一区二区在线免费观看 | jizz中国免费| 亚洲爆乳无码一区二区三区| 一区二区免费视频| 国产日本亚洲一区二区三区| 麻豆国产VA免费精品高清在线 | 久久免费99精品国产自在现线| 国产成人无码综合亚洲日韩| 99久久免费观看| 亚洲成AV人片在WWW| 亚洲精品成人久久久| 久久久久久久岛国免费播放| 亚洲成a人片在线观看中文!!!| 成人免费视频试看120秒| 黄色一级毛片免费| 亚洲国产精品国自产电影| 无码日韩人妻av一区免费| 无遮挡呻吟娇喘视频免费播放| 亚洲人成人77777网站| 国产精品入口麻豆免费观看| 色偷偷亚洲第一综合| 亚洲va无码手机在线电影| 国产成人免费爽爽爽视频| 免费人成网站永久| 亚洲成a人片在线观看中文动漫| 欧洲精品成人免费视频在线观看 | 岛国大片免费在线观看|