天天看點

Java調用.Net的web service的幾種方式

最近做項目,涉及到web-service調用,現學了一個星期,現簡單的做一個小結。下面實作的是對傳喜物流系統(http://vip.cxcod.com/podapi/getpodstr.asmx?wsdl)的訂單跟蹤(web-service調用)功能。

一. 使用axis1.x調用webservice方法

axis的最常用版本:1.4和2.0版本。以下為1.4版本

 核心代碼:

  // webserviceurl

      service_url = "http://vip.cxcod.com/podapi/getpodstr.asmx?wsdl";

      service service = new service();

      call call = (call) service.createcall();

      call.settargetendpointaddress(new java.net.url(service_url));

// 設定要調用的方法

// http://intelink.net/是wsdl中definitions根節點的targetnamespace屬性值

call.setoperationname(new qname("http://intelink.net/","getstrbyjobno"));

// 該方法需要的參數

call.addparameter("custno",

  org.apache.axis.encoding.xmltype.xsd_string,

  javax.xml.rpc.parametermode.in);

call.addparameter("passwd",

   org.apache.axis.encoding.xmltype.xsd_string,

   javax.xml.rpc.parametermode.in);

call.addparameter("jobno",

// 方法的傳回值類型

call.setreturntype(org.apache.axis.encoding.xmltype.xsd_string);

// call.setusesoapaction(true); //call.setsoapactionuri("http://intelink.net/getstrbyjobno");

// 調用該方法, new object[] { custno, passwd, jobno}為參數清單

string xmlstr = call.invoke(new object[] { custno, passwd, jobno}).tostring();

} catch (exception e) {

e.printstacktrace();

}

java用這種方式調用webservice,需要注意的地方:

1. 伺服器未能識别 http 标頭 soapaction 的值:

症狀一:

web service + asp.net 應用程式部署到伺服器預設目錄中,在ie中用http://<伺服器位址>/<程式目錄名>/<預設啟動頁面名>發生“伺服器未能識别 http 标頭 soapaction 的值”錯誤。

症狀二:

在java平台上調用.net web service的服務時,出現"伺服器未能識别 http 标頭 soapaction 的值"。

症狀三:

在java平台下調用.net web service,出現資料時有時無。

解決對策:

給.net的webservice類(即.asmx檔案下的類)添加屬性[soapdocumentservice(routingstyle=soapserviceroutingstyle.requestelement)]

小知識:

什麼是soapaction?它在wsdl中有何作用?

soapaction http request header被用來辨別soap http請求的目的地,其值是個uri位址。soap發送并不限制格式、uri特征或其必須可解析,那麼在這種情況下,發送一個http soap請求時,其http用戶端必須使用/指明soapaction http request header。

soapaction header的内容可以被用在服務端,諸如:防火牆适當的過濾基于http的soap請求消息等場景。soapaction header的值為空串("")表示soap消息的目的地由http請求的uri辨別;無值則表示沒有指定這條消息的目的地。

本人補充:

在.net環境調用.net webservice出現 “soapaction 值在 xml web services 的所有方法中不唯一的錯誤”,也可以通過此法解決。

2. 為了java能夠調用webservice的方法,是以。netp寫的webserviced的每個方法都要聲明為rpc方法,即添加"[soaprpcmethod.....]".

例如:[webmethod]

        [soaprpcmethod(use=soapbindinguse.literal,action= http://tempuri.org/helloworld", requestnamespace = "http://tempuri.org/", responsenamespace = "http://tempuri.org/")]

3. 對傳回值、參數的處理上:

應盡量将webservice方法的傳回值、參數都寫成字元串(string)不要使用複雜對象類型,這樣便于在網絡上傳輸。避免了複雜對象類型的不易轉換問題。。。對于傳回類型是字元串數組型的,可以設定傳回類型為org.apache.axis.encoding.xmltype.soap_vector或java.lang.string[].class.

二.利用xfire調用webservice

xfire是新一代的java web服務引擎,xfire使得在javaee應用中釋出web服務變得輕而易舉。和其他web服務引擎相比,xfire的配置非常簡單,可以非常容易地和spring內建,它使得java開發人員終于可以獲得和.net開發人員一樣的開發效率。

核心代碼:

service service = new objectservicefactory().create(iwebservice.class);

xfireproxyfactory factory =

new xfireproxyfactory(xfirefactory.newinstance().getxfire());

string url= "http://localhost:8080/webservices/services/webservices";

iwebservice iw = (iwebservice) factory.create(service, url);

list list=iw.gettest();