1. 程式人生 > >使用java呼叫webservice

使用java呼叫webservice

一、Web Services以XML作為資料交換的標準格式,它是跨平臺的應用,允許以任何方式建立Web Services,在.NET、Java平臺上訪問。
在Java平臺建立和訪問Web Service多通過Axis完成。Axis本質上就是一個SOAP引擎,提供建立伺服器端、客戶端和閘道器SOAP操作的基本框架。Axis目前版本是為Java編寫的。在使用Axis訪問Web Service時,需要引入以下包(10個):axis-ant.jar、axis.jar、commons-discovery-0.2.jar、commons-logging-1.0.4.jar、jaxrpc.jar、log4j-1.2.8.jar、saaj.jar、wsdl4j-1.5.1.jar、activation-1.1.jar和mail-1.4.jar。
(1)訪問Java建立的Web Service
在當前Java客戶端應用中新增相應的10個Axis包,編寫客戶端程式:
	/**
     * @param url  介面地址
     * @param xml //報文
     * @return 返回的報文
     */
    public static String getWSDLCall(String url, String xml){
        String result = "";
        try {
            Service service = new Service();
            Call call = (Call) service.createCall();
            call.setTargetEndpointAddress(url);
            call.setOperationName(new QName("http://tempuri.org/", "HelloWorld"));
            //需要傳入引數的時候使用
            //call.addParameter("xml", org.apache.axis.encoding.XMLType.XSD_DATE,
           	 //javax.xml.rpc.ParameterMode.IN);//介面的引數
            //call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//設定返回型別 
            result = (String)call.invoke(new Object[]{xml});
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return result;
    }
二、java呼叫.net開發的webservice的時候,如果大家遇到以下問題,可以參考下解決辦法:
1、出現的問題大多是因為沒有引入響應的jar包,如果使用Axis的話,將以上10個包引入後應該沒有什麼問題
2、java呼叫時總提示:faultString: 伺服器未能識別 HTTP 標頭 SOAPAction 的值:

上網找了解決方法,最好修改的結果如下:

.net WebService程式碼:

webservicenamespace後面增加:

[SoapDocumentService(RoutingStyle=SoapServiceRoutingStyle.RequestElement)]

--------------------——————————————————

3、無法識別請求元素 <GetTestQuestions xmlns=''>

  解決辦法:

將 call.setOperationName(new QName("", "GetTestQuestions"));

改為call.setOperationName(new QName("自己的名稱空間", "GetTestQuestions"));

--------------------——————————————————

4、在傳遞基本資料的時候,服務端接收的引數為null

解決辦法:

 //需要傳入引數的時候使用,name是webservice方法的引數名,XSD_STRING是引數型別,一定要嚴格對應             call.addParameter(new QName(XmlNamespace,"name"),                      org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);

而下面這種傳引數的寫法,服務端獲取的是null

call.addParameter("name", org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);

希望能夠幫到大家O(∩_∩)O