<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 軟件工程實踐者 閱讀(5776) 評論(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嗎?
    你可以試一試。  回復  更多評論   


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


    網站導航:
     
    主站蜘蛛池模板: 国产精品亚洲综合久久| 在线观看无码AV网站永久免费| 国产免费一区二区视频| 免费黄色福利视频| 免费女人18毛片a级毛片视频| 在线a亚洲v天堂网2019无码| 97久久国产亚洲精品超碰热| 一级一看免费完整版毛片| 久久九九兔免费精品6| 免费中文字幕不卡视频| 亚洲一级二级三级不卡| 爱情岛论坛免费视频| 日韩在线播放全免费| 亚洲精品麻豆av| 亚洲国产精品综合久久20| 成人无码WWW免费视频| 女人18毛片水最多免费观看| 亚洲gv猛男gv无码男同短文| 日韩亚洲人成在线综合| 国产精品久久免费| 中文字幕在线亚洲精品| 色偷偷噜噜噜亚洲男人| 99视频全部免费精品全部四虎| 亚洲成色WWW久久网站| 中美日韩在线网免费毛片视频| 一个人看的www在线观看免费| 亚洲AV成人一区二区三区AV| 久久www免费人成看国产片| 色妞WWW精品免费视频| 亚洲视频中文字幕| 国产无遮挡裸体免费视频在线观看 | 国产禁女女网站免费看| 亚洲色偷偷狠狠综合网| 在线亚洲午夜片AV大片| 青青青国产手机频在线免费观看 | 免费夜色污私人影院网站电影| www.999精品视频观看免费| 久久久久久亚洲AV无码专区| 免费无码又爽又刺激网站直播| 亚洲一区日韩高清中文字幕亚洲| 亚洲国产精品ⅴa在线观看|