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

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

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

    狼愛上貍

    我胡漢三又回來了

    AXIS全攻略(二)

    六、服務的訪問

      GET方式的服務訪問

      一般的SOAP消息都是采用POST方式實現傳遞,但也可以通過GET方式來訪問。比如以下給出的一個服務——“HelloWorld”,其源碼如下:

    文件HelloWorld.jws
    public class HelloWorld
    {
        public String helloWorld()
        {
              System.out.println( "Hello World!" );//在服務器端打印輸出 
              return "Hello World!";//返回相應字符串
        }
    }

      這個服務給出一個名為“helloWorld”的無入口參數的操作,返回一個內容為“Hello World!的字符串”,同時在服務器端打印“Hello World!”,將該文件放到“……\webapps\axis”目錄下,即可通過GET方法直接訪問該服務,訪問的地址為http://localhost:8080/axis/HelloWorld.jws?method=helloWorld,可以看到返回的SOAP信封消息,同時服務器端給出了相應的顯示信息“Hello World!”這表明HelloWorld服務被成功訪問了,生成的SOAP信封消息為:
     <?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:Body>
    - <helloWorldResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <helloWorldReturn xsi:type="xsd:string">Hello World!</helloWorldReturn>
      </helloWorldResponse>
      </soapenv:Body>
      </soapenv:Envelope>

     


    七、客戶端服務訪問編程

      Axis提供了一套API來實現SOAP,從http://localhost:8080/axis/docs/apiDocs/index.html可以看到Axis的API文檔。

      其中,org.apache.axis.client.Call和org.apache.axis.client.Service是兩個比較常用的類,一般的客戶端程序欲訪問一個Web Service時,都要生成一個客戶端的Service對象和Call對象,在訪問服務之前,首先要對Call對象設置相應的參數,包括服務的位置、操作名、入口參數、返回值類型等,最后調用Call對象的invoke方法訪問服務。

      以下給出了一個客戶端訪問Web服務的例程——AXISTest.java:

      文件AXISTest.java

    package axisexercise;

    import org.apache.axis.client.Call;

    import org.apache.axis.client.Service;

    import org.apache.axis.encoding.XMLType;

    import javax.xml.rpc.ParameterMode;

    public class AXISTest
    {
        public static void main( String[] args ) throws Exception
        {
             創建service和call對象,這些對象是標準的JAX-RPC對象,這些對象用于存儲服務調用的數據(metadata)。

     Service service = new Service();
     Call call = ( Call ) service.createCall();
     //////////訪問即時發布的Distance服務

     //設置訪問點
     call.setTargetEndpointAddress( "http://localhost:8080/axis/Distance.jws" );

     //設置操作名
     call.setOperationName( "convertMile2Kilometre" );

     //設置入口參數
     call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );

     //設置返回參數類型
     call.setReturnType( XMLType.XSD_DOUBLE );
     Double d1 = new Double( 190 );

     //調用服務,在invoke方法中傳入的是包含調用參數的數組
     System.out.println( d1 + " 英里相當于 " +
     call.invoke( new Object[] {d1} ) + " 公里!" );

     //////////訪問定制發布的Capacity服務
     call = ( Call ) service.createCall();

     //設置訪問點
     call.setTargetEndpointAddress( "http://localhost:8080/axis/services/Capacity" );

     //設置操作名
     call.setOperationName( "convertGallon2Litre" );

     //設置入口參數
     call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );
     call.setReturnType( XMLType.XSD_DOUBLE );
     d1 = new Double( 10.00 );

     //調用服務
     System.out.println( d1 + " 加侖相當于 " +
     call.invoke( new Object[] {d1} ) + " 升!" );

        } //main()

    }/* AXISTest */

    編譯運行后運行可以看到以下的結果:

    190.0英里相當于305.71公里!

    10.0加侖相當于45.46升!
     
      注意程序在訪問即時發布的Distance服務和定制發布的Capacity服務時的不同,前者的服務訪問點地址為http://localhost:8080/axis/HelloWorld.jws,而后者的則為http://localhost:8080/axis/services/Capacity


    八、服務類型:RPC, Document, Wrapped, and Message
    在Axis中,有四種服務類型:

    1. RPC服務:
    PRC服務是AXIS中的默認服務,當你通過<service ... provider="java:RPC"> or <service ... style="RPC">標簽進行部署的時候,使用的就是RPC服務。RPC服務遵循SOAP RPC和其編碼規范。AXIS可以將XML反序列化成java對象,并將其傳給服務的方法。并且可以將服務的方法返回的JAVA對象序列化成XML。

    2.Document / Wrapped services
    Document services and wrapped services are similar in that neither uses the SOAP encoding for data; it's just plain old XML schema. In both cases, however, Axis still "binds" Java representations to the XML (see the databinding section for more), so you end up dealing with Java objects, not directly with XML constructs.

    Document和Wrapped服務都不使用SOAP編碼數據,這一點是他們相似的地方。他們僅僅使用舊的XML模式。然而,在這兩種服務中,AXIS將捆綁Java的表示到XML文檔中,所以你最終處理的是java對象而不直接處理XML。

    下面是包含定單的一個簡單的SOAP消息,你可以看到Document 和 Wrapped 服務的區別所在:
    <soap:Envelope xmlns="http://xml.apache.org/axis/wsdd/"
       xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
      <soap:Body>
     <myNS:PurchaseOrder xmlns:myNS="http://commerce.com/PO">
       <item>SK001</item>
       <quantity>1</quantity>
       <description>Sushi Knife</description>
     </myNS:PurchaseOrder>
      </soap:Body>
    </soap:Envelope>

    相應的XML模式如下:

    <schema targetNamespace="http://commerce.com/PO">
      <complexType name="POType">
     <sequence>
       <element name="item" type="xsd:string"/>
       <element name="quantity" type="xsd:int"/>
       <element name="description" type="xsd:string"/>
     </sequence>
      </complexType>
      <element name="PurchaseOrder" type="POType"/>
    </deployment>

    對于Document類型服務,他將映射成下面的方法:
    public void method(PurchaseOrder po)


    八、soap envolop(soap信封)
    1. soap信封
    在客戶端發出服務請求以及服務端返回請求結果的時候,在網絡中傳輸的是SOAP信封。首先客戶端程序將請求參數及請求的方法序列到XML的文件中(SOAP信封),并將SOAP信封傳送到服務器端。服務器端接受到SOAP信封后,將解析這個SOAP信封并反序列化調用參數及方法并將該方法的調用結果封裝成SOAP信封(序列到XML的文件中)返回給客戶端,客戶端同樣將SOAP信封中封裝的返回結果反序列化為想要得到的結果。

    我們來看下面這段客戶端程序的SOAP信封:
    (1) 客戶端程序:
      import org.apache.axis.client.Call;
      import org.apache.axis.client.Service;
      import javax.xml.namespace.QName;
     
      public class TestClient
      {
         public static void main(String [] args)
         {
            try
            {
                 String endpoint = "http://nagoya.apache.org:5049/axis/services/echo";
                 Service  service = new Service();
                 Call  call = (Call) service.createCall();
     
                 call.setTargetEndpointAddress( new java.net.URL(endpoint) );
                 call.setOperationName(new QName("http://soapinterop.org/", "echoString"));
     
                 String ret = (String) call.invoke( new Object[] { "Hello!" } );
     
                 System.out.println("Sent 'Hello!', got '" + ret + "'");
             }
      catch (Exception e)
      {
                 System.err.println(e.toString());
             }
         }
      }

    (2) SOAP信封:
    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
           xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <SOAP-ENV:Body>
     <ns1:echoString xmlns:ns1="http://soapinterop.org/">
       <arg0 xsi:type="xsd:string">Hello!</arg0>
     </ns1:echoString>
      </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

    2. 參數命名:
    在上面的代碼中,AXIS自動將在Soap消息中的函數調用參數命名為arg0,arg1等等,如果你想按照自己定義的參數名調用方法的話,很簡單,在你調用invoke函數之前只要調用addParameter()函數即可。如下所示:

       call.addParameter("testParam",
          org.apache.axis.Constants.XSD_STRING,
          javax.xml.rpc.ParameterMode.IN);
       call.setReturnType(org.apache.axis.Constants.XSD_STRING);
    將testParam定義為調用函數的第一個參數(這里也只有一個參數),這里也可以同時定義該參數的類型以及該參數是輸入、輸出還是輸入輸出類型。在這里它是一個輸入類型,現在當你運行程序,你將得到下面的消息:
    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
           xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <SOAP-ENV:Body>
     <ns1:echoString xmlns:ns1="http://soapinterop.org/">
       <testParam xsi:type="xsd:string">Hello!</testParam>
     </ns1:echoString>
      </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

    3. 返回類型
    在上面的代碼中我們知道echoString函數將返回一個String對象,而且我們也希望通過客戶端的調用能夠返回預期的String對象。下面是一個典型的通過調用echoString函數后獲得的Soap信封(消息)。
    <?xml version="1.0" encoding="UTF-8"?>
      <SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
         xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <SOAP-ENV:Body>
       <ns1:echoStringResponse xmlns:ns1="http://soapinterop.org/">
     <result xsi:type="xsd:string">Hello!</result>
       </ns1:echoStringResponse>
      </SOAP-ENV:Body>
     </SOAP-ENV:Envelope>
    我們可以看到這里已經聲明了返回類型(<result xsi:type="xsd:string">)是一個String對象。這樣Axis就可以將返回結果反序列化成我們想要的String對象了。
    很多工具都會將這種確定的類型信息放到XML文件中,以生成消息的“自我描述部分”,另一方面,還有一些工具是象下面這樣返回響應的:(Many toolkits put this kind of explicit typing information in the XML to make the message "self-describing". On the other hand, some toolkits return responses that look like this:)
    <?xml version="1.0" encoding="UTF-8"?>
    <SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
           xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <SOAP-ENV:Body>
      <ns1:echoStringResponse xmlns:ns1="http://soapinterop.org/">
       <result>Hello, I'm a string!</result>
      </ns1:echoStringResponse>
     </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
    在這里并沒有返回類型,那么我們怎么知道應該將返回結果反序列化成什么類型的結果呢?答案是metadata,在這種情況下,我們需要一個描述來指明我們期望的返回類型,下面這行代碼說明了在客戶端應該如何去做:
    call.setReturnType( org.apache.axis.Constants.XSD_STRING );
    這個方法將會告訴Axis客戶端,如果返回的結果沒有指明類型的話,那么Axis將會把返回類型指明為xsi:type屬性所預定義的SOAP類型,在這里XSD_STRING屬性所指明的是String類型。

    所以也有這樣一個相似的方法,允許你指定所期望返回的Java的類。
    call.setReturnClass(String.class);



    http://blog.csdn.net/tenwang1977/archive/2004/09/06/95991.aspx

    posted on 2007-06-21 16:20 狼愛上貍 閱讀(456) 評論(0)  編輯  收藏 所屬分類: AXIS

    主站蜘蛛池模板: 亚洲电影日韩精品| 日韩免费在线观看| 亚洲福利在线观看| 你是我的城池营垒免费看 | 日批日出水久久亚洲精品tv| 亚洲av日韩av永久在线观看| 国产精品视_精品国产免费| 激情无码亚洲一区二区三区| 免费国产人做人视频在线观看| 老司机午夜免费视频| 国产亚洲精久久久久久无码AV | 18以下岁毛片在免费播放| 亚洲成a人片7777| 在线不卡免费视频| 美女视频免费看一区二区| 亚洲男人第一无码aⅴ网站| 全黄大全大色全免费大片| 亚洲色图校园春色| 成人午夜18免费看| 黄色免费网址大全| 国产V亚洲V天堂无码久久久| 4455永久在线观免费看| 久久亚洲精品无码网站| 亚洲另类激情综合偷自拍图| 最近免费中文在线视频| 亚洲av纯肉无码精品动漫| 亚洲中文字幕在线第六区| **aaaaa毛片免费| 美女被免费视频网站| 亚洲精品高清国产一线久久| AV无码免费永久在线观看| 国产亚洲精彩视频| 91精品国产亚洲爽啪在线影院 | 搡女人免费视频大全| 特级毛片aaaa免费观看| 亚洲欧洲精品国产区| 免费一级毛片在线播放| 在线观看的免费网站无遮挡| 黄色网址免费在线| 久久精品亚洲AV久久久无码| 国产成人综合亚洲AV第一页 |