国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
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
    {
         創(chuàng)建service和call對象,這些對象是標準的JAX-RPC對象,這些對象用于存儲服務調用的數據(metadata)。

 Service service = new Service();
 Call call = ( Call ) service.createCall();
 //////////訪問即時發(fā)布的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} ) + " 公里!" );

 //////////訪問定制發(fā)布的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升!
 
  注意程序在訪問即時發(fā)布的Distance服務和定制發(fā)布的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和其編碼規(guī)范。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 服務的區(qū)別所在:
<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信封
在客戶端發(fā)出服務請求以及服務端返回請求結果的時候,在網絡中傳輸的是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);

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java調用.NET webservice方法的幾種方式
JAVA客戶端通過SOAP與NET的WebServices進行通信
探討C 、C#和JAVA:webservice互操作問題
用Axis 1.1 for Java進行Web Services開發(fā)(1)
轉:用Java調用WebService接口 - jinesin隨筆 - jinesin - 和訊博客
JR - 精品文章 - AXIS學習筆記(一)
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服