Java调用.Net的web service的几种方式
生活随笔
收集整理的這篇文章主要介紹了
Java调用.Net的web service的几种方式
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
最近做項(xiàng)目,涉及到web-service調(diào)用,現(xiàn)學(xué)了一個星期,現(xiàn)簡單的做一個小結(jié)。下面實(shí)現(xiàn)的是對傳喜物流系統(tǒng)(
http://vip.cxcod.com/PodApi/GetPodStr.asmx?wsdl)的訂單跟蹤(web-service調(diào)用)功能。
一. 使用axis1.x調(diào)用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));
// 設(shè)置要調(diào)用的方法
// http://intelink.net/是wsdl中definitions根節(jié)點(diǎn)的targetNamespace屬性值
call.setOperationName(new QName("http://intelink.net/","GetStrByJobno"));
// 該方法需要的參數(shù)
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",
org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
// 方法的返回值類型
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
// call.setUseSOAPAction(true); //call.setSOAPActionURI("http://intelink.net/GetStrByJobno");
// 調(diào)用該方法, new Object[] { CustNo, passwd, Jobno}為參數(shù)列表
String xmlStr = call.invoke(new Object[] { CustNo, passwd, Jobno}).toString();
} catch (Exception e) {
e.printStackTrace();
}
JAVA用這種方式調(diào)用webservice,需要注意的地方:
1. 服務(wù)器未能識別 HTTP 標(biāo)頭 SOAPAction 的值:
癥狀一:
Web Service + ASP.NET 應(yīng)用程序部署到服務(wù)器默認(rèn)目錄中,在IE中用http://<服務(wù)器地址>/<程序目錄名>/<默認(rèn)啟動頁面名>發(fā)生“服務(wù)器未能識別 HTTP 標(biāo)頭 SOAPAction 的值”錯誤。
癥狀二:
在Java平臺上調(diào)用.NET Web Service的服務(wù)時,出現(xiàn)"服務(wù)器未能識別 HTTP 標(biāo)頭 SOAPAction 的值"。
癥狀三:
在Java平臺下調(diào)用.NET WEB Service,出現(xiàn)數(shù)據(jù)時有時無。
解決對策:
給.NET的WebService類(即.asmx文件下的類)添加屬性[SoapDocumentService(RoutingStyle=SoapServiceRoutingStyle.RequestElement)]
小知識:
什么是SoapAction?它在WSDL中有何作用?
SOAPAction HTTP request header被用來標(biāo)識SOAP HTTP請求的目的地,其值是個URI地址。SOAP發(fā)送并不限制格式、URI特征或其必須可解析,那么在這種情況下,發(fā)送一個HTTP SOAP請求時,其HTTP客戶端必須使用/指明SOAPAction HTTP request header。
SOAPAction header的內(nèi)容可以被用在服務(wù)端,諸如:防火墻適當(dāng)?shù)倪^濾基于HTTP的SOAP請求消息等場景。SOAPAction header的值為空串("")表示SOAP消息的目的地由HTTP請求的URI標(biāo)識;無值則表示沒有指定這條消息的目的地。
本人補(bǔ)充:
在.NET環(huán)境調(diào)用.NET WebService出現(xiàn) “SOAPAction 值在 XML Web services 的所有方法中不唯一的錯誤”,也可以通過此法解決。
2. 為了Java能夠調(diào)用WebService的方法,所以。NETP寫的WebServiced的每個方法都要聲明為Rpc方法,即添加"[SoapRpcMethod.....]".
例如:[WebMethod]
??????? [SoapRpcMethod(Use=SoapBindingUse.Literal,Action= http://tempuri.org/HelloWorld", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/")]
3. 對返回值、參數(shù)的處理上:
應(yīng)盡量將webservice方法的返回值、參數(shù)都寫成字符串(String)不要使用復(fù)雜對象類型,這樣便于在網(wǎng)絡(luò)上傳輸。避免了復(fù)雜對象類型的不易轉(zhuǎn)換問題。。。對于返回類型是字符串?dāng)?shù)組型的,可以設(shè)置返回類型為org.apache.axis.encoding.XMLType.SOAP_VECTOR或java.lang.String[].class.
二.利用xfire調(diào)用WebService
XFire是新一代的Java Web服務(wù)引擎,XFire使得在JavaEE應(yīng)用中發(fā)布Web服務(wù)變得輕而易舉。和其他Web服務(wù)引擎相比,XFire的配置非常簡單,可以非常容易地和Spring集成,它使得Java開發(fā)人員終于可以獲得和.Net開發(fā)人員一樣的開發(fā)效率。
核心代碼:
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();
一. 使用axis1.x調(diào)用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));
// 設(shè)置要調(diào)用的方法
// http://intelink.net/是wsdl中definitions根節(jié)點(diǎn)的targetNamespace屬性值
call.setOperationName(new QName("http://intelink.net/","GetStrByJobno"));
// 該方法需要的參數(shù)
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",
org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
// 方法的返回值類型
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
// call.setUseSOAPAction(true); //call.setSOAPActionURI("http://intelink.net/GetStrByJobno");
// 調(diào)用該方法, new Object[] { CustNo, passwd, Jobno}為參數(shù)列表
String xmlStr = call.invoke(new Object[] { CustNo, passwd, Jobno}).toString();
} catch (Exception e) {
e.printStackTrace();
}
JAVA用這種方式調(diào)用webservice,需要注意的地方:
1. 服務(wù)器未能識別 HTTP 標(biāo)頭 SOAPAction 的值:
癥狀一:
Web Service + ASP.NET 應(yīng)用程序部署到服務(wù)器默認(rèn)目錄中,在IE中用http://<服務(wù)器地址>/<程序目錄名>/<默認(rèn)啟動頁面名>發(fā)生“服務(wù)器未能識別 HTTP 標(biāo)頭 SOAPAction 的值”錯誤。
癥狀二:
在Java平臺上調(diào)用.NET Web Service的服務(wù)時,出現(xiàn)"服務(wù)器未能識別 HTTP 標(biāo)頭 SOAPAction 的值"。
癥狀三:
在Java平臺下調(diào)用.NET WEB Service,出現(xiàn)數(shù)據(jù)時有時無。
解決對策:
給.NET的WebService類(即.asmx文件下的類)添加屬性[SoapDocumentService(RoutingStyle=SoapServiceRoutingStyle.RequestElement)]
小知識:
什么是SoapAction?它在WSDL中有何作用?
SOAPAction HTTP request header被用來標(biāo)識SOAP HTTP請求的目的地,其值是個URI地址。SOAP發(fā)送并不限制格式、URI特征或其必須可解析,那么在這種情況下,發(fā)送一個HTTP SOAP請求時,其HTTP客戶端必須使用/指明SOAPAction HTTP request header。
SOAPAction header的內(nèi)容可以被用在服務(wù)端,諸如:防火墻適當(dāng)?shù)倪^濾基于HTTP的SOAP請求消息等場景。SOAPAction header的值為空串("")表示SOAP消息的目的地由HTTP請求的URI標(biāo)識;無值則表示沒有指定這條消息的目的地。
本人補(bǔ)充:
在.NET環(huán)境調(diào)用.NET WebService出現(xiàn) “SOAPAction 值在 XML Web services 的所有方法中不唯一的錯誤”,也可以通過此法解決。
2. 為了Java能夠調(diào)用WebService的方法,所以。NETP寫的WebServiced的每個方法都要聲明為Rpc方法,即添加"[SoapRpcMethod.....]".
例如:[WebMethod]
??????? [SoapRpcMethod(Use=SoapBindingUse.Literal,Action= http://tempuri.org/HelloWorld", RequestNamespace = "http://tempuri.org/", ResponseNamespace = "http://tempuri.org/")]
3. 對返回值、參數(shù)的處理上:
應(yīng)盡量將webservice方法的返回值、參數(shù)都寫成字符串(String)不要使用復(fù)雜對象類型,這樣便于在網(wǎng)絡(luò)上傳輸。避免了復(fù)雜對象類型的不易轉(zhuǎn)換問題。。。對于返回類型是字符串?dāng)?shù)組型的,可以設(shè)置返回類型為org.apache.axis.encoding.XMLType.SOAP_VECTOR或java.lang.String[].class.
二.利用xfire調(diào)用WebService
XFire是新一代的Java Web服務(wù)引擎,XFire使得在JavaEE應(yīng)用中發(fā)布Web服務(wù)變得輕而易舉。和其他Web服務(wù)引擎相比,XFire的配置非常簡單,可以非常容易地和Spring集成,它使得Java開發(fā)人員終于可以獲得和.Net開發(fā)人員一樣的開發(fā)效率。
核心代碼:
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();
總結(jié)
以上是生活随笔為你收集整理的Java调用.Net的web service的几种方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 澳门有高尔夫专业吗
- 下一篇: 克拉玛依到龙江龙珠二龙山滑雪场路过什么地