<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嗎?
    你可以試一試。  回復  更多評論   


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


    網站導航:
     
    主站蜘蛛池模板: 91在线老王精品免费播放| 污污视频免费观看网站| 99久热只有精品视频免费看 | 成人一a毛片免费视频| 亚洲无码黄色网址| 国产精品免费视频观看拍拍| 亚洲av无码国产精品色在线看不卡| 亚洲国产精品日韩专区AV| 免费福利资源站在线视频| 韩国18福利视频免费观看| 亚洲欧美国产精品专区久久| 日韩毛片无码永久免费看| 国产亚洲漂亮白嫩美女在线| 亚洲人午夜射精精品日韩| 你好老叔电影观看免费| 亚洲国产老鸭窝一区二区三区| 亚洲乱妇老熟女爽到高潮的片| jizz免费一区二区三区| 久久精品国产精品亚洲下载| 日本免费污片中国特一级| 亚洲第一区视频在线观看| 成人免费看吃奶视频网站| 国产产在线精品亚洲AAVV| 国产亚洲色婷婷久久99精品| 91高清免费国产自产拍2021| 亚洲一区二区三区不卡在线播放| 中文字幕成人免费高清在线 | 成人免费无遮挡无码黄漫视频| 国产亚洲精品不卡在线| 成人电影在线免费观看| 激情内射亚洲一区二区三区| 色窝窝免费一区二区三区 | 99在线观看免费视频| 亚洲欧洲日韩极速播放| 国产高清在线精品免费软件| 一级毛片视频免费| 亚洲国产中文在线二区三区免| 一个人免费日韩不卡视频| 亚洲AV成人一区二区三区在线看| 91香蕉国产线在线观看免费| 中文字幕亚洲精品无码|