最近做項目,涉及到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();