java-webService(調用wsdl接口)


使用Axis或XFire實現WebService:

Axis2是Apache下的一個重量級WebService框架,准確說它是一個Web Services / SOAP / WSDL 的引擎,是WebService框架的集大成者,它能不但能制作和發布WebService,而且可以生成Java和其他語言版WebService客戶端和服務端代碼。這是它的優勢所在。但是,這也不可避免的導致了Axis2的復雜性,使用過的開發者都知道,它所依賴的包數量和大小都是很驚人的,打包部署發布都比較麻煩,不能很好的與現有應用整合為一體。但是如果你要開發Java之外別的語言客戶端,Axis2提供的豐富工具將是你不二的選擇。
 
XFire是一個高性能的WebService框架,在Java6之前,它的知名度甚至超過了Apache的Axis2,XFire的優點是開發方便,與現有的Web整合很好,可以融為一體,並且開發也很方便。但是對Java之外的語言,沒有提供相關的代碼工具。XFire后來被Apache收購了,原因是它太優秀了,收購后,隨着Java6 JWS的興起,開源的WebService引擎已經不再被看好,漸漸的都敗落了。

參考路徑:

https://blog.csdn.net/rockstar541/article/details/21106407

axis2:

參考路徑:

https://ldzyz007.iteye.com/blog/1065927

https://blog.csdn.net/qq_22067469/article/details/83652562

http://blog.sina.com.cn/s/blog_b18fc8d60102wwhm.html

private static Object[] requestFunctionWebService(String url,String parameters,String namespance,String methodName) {
        try {
            RPCServiceClient rpcServiceClient = new RPCServiceClient();
            EndpointReference endpointReference = new EndpointReference(url);//url后綴不加"?wsdl"
            Options options = rpcServiceClient.getOptions();
            options.setTimeOutInMilliSeconds(30000);
            options.setProperty(HTTPConstants.SO_TIMEOUT, 30000);
            options.setTo(endpointReference);
            rpcServiceClient.setOptions(options);
            QName qName = new QName(namespance, methodName);
            Class[] classStr = new Class[] {String.class};
            Object[] params = new Object[] {parameters};
            Object[] objects = rpcServiceClient.invokeBlocking(qName,params,classStr);
            return objects;
        } catch (Exception e) {
            logger.error("requestFunctionWebService請求接口異常:"+ e.toString());
            return null;
        }
    }

CXF:

參考路徑:

https://zhoshijie.iteye.com/blog/2189091

添加依賴:

     <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.1.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>3.1.16</version>
        </dependency>

 

public static Object[] getService(String url,String parameters, String namespace,String methodName) {
        try {
            String newUrl =url+"?wsdl";
            JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();  
            Client client = dcf.createClient(newUrl);  
            QName name=new QName(namespace, methodName);
            Object[] params = new Object[] {parameters};
            return client.invoke(name,params);
        } catch (Exception e) {
            logger.error(e);
            return null;
        } 
    }

XFire:

參考路徑:

https://blog.csdn.net/zl834205311/article/details/51612207

https://blog.csdn.net/u010402228/article/details/50155767

http://www.cnblogs.com/toyz/p/6340269.html

① 通過WSDL地址來創建動態客戶端 
② 通過服務端提供的接口來創建客戶端 
③ 使用Ant通過WSDL文件來生成客戶端

第一種方式:通過WSDL地址來創建動態客戶端

package com.jadyer.client;  
import java.net.MalformedURLException;  
import java.net.URL;  
import org.codehaus.xfire.client.Client;  
/** 
 * 通過WSDL來創建動態客戶端 
 * @see 此時需要在項目中引入XFire 1.2 Core Libraries和XFire 1.2 HTTP Client Libraries 
 */  
public class ClientFromWSDL {  
    public static void main(String[] args) throws MalformedURLException, Exception {  
        Client client = new Client(new URL("http://127.0.0.1:8080/XFire_demo/services/XFireServer?wsdl"));  
        Object[] results11 = client.invoke("sayHello", new Object[]{"Jadyer22"});  
        System.out.println(results11[0]);  
    }  
}  

第二種方式:通過服務端提供的端口來創建客戶端

package com.jadyer.client;  
import java.net.MalformedURLException;  
import java.util.List;  
import org.codehaus.xfire.client.XFireProxyFactory;  
import org.codehaus.xfire.service.Service;  
import org.codehaus.xfire.service.binding.ObjectServiceFactory;  
import com.jadyer.model.Person;  
import com.jadyer.model.User;  
import com.jadyer.server.HelloService;  
/** 
 * 通過Web服務端提供的接口來創建客戶端 
 * @see 客戶端必須提供一個與服務端完全一致的接口,包名也要一致 
 * @see 在本例中,需要在客戶端(即該項目)中提供HelloService.java接口,以及Person和User兩個POJO類 
 * @see 並且此時需要在項目中引入XFire 1.2 Core Libraries和XFire 1.2 HTTP Client Libraries 
 */  
public class ClientFromInterface {  
    public static void main(String[] args)throws MalformedURLException{  
        //首先使用XFire的ObjectServiceFactory從HelloService接口創建一個服務模型serviceModel  
        //serviceModel包含服務的說明,換句話說,就是服務的元數據  
        //Create a metadata of the service  
        Service serviceModel = new ObjectServiceFactory().create(HelloService.class);  
          
        //訪問的地址  
        String serviceURL = "http://127.0.0.1:8080/XFire_demo/services/XFireServer";  
          
        //通過查看org.codehaus.xfire.client.XFireProxyFactory源碼發現  
        //下面兩行代碼與這里直接new XFireProxyFactory()的作用是等效的  
        //XFire xfire = XFireFactory.newInstance().getXFire();  
        //XFireProxyFactory factory = new XFireProxyFactory(xfire);  
        //為XFire獲得一個代理工廠對象  
        //Create a proxy for the deployed service  
        XFireProxyFactory factory = new XFireProxyFactory();  
          
        //通過proxyFactory,使用服務模型serviceModel和服務端點URL(用來獲得WSDL)  
        //得到一個服務的本地代理,這個代理就是實際的客戶端  
        HelloService client = (HelloService)factory.create(serviceModel, serviceURL);  
          
        /** 
         * Invoke the service 
         * @see 調用服務的本地代理(即實際的客戶端)中的方法,便得到我們需要的WebServcie 
         */  
          
        /*--處理簡單對象--*/  
        String serviceResponse = client.sayHello("Jadyer11");  
        System.out.println(serviceResponse);  
          
        /*--處理對象--*/  
        User u = new User();  
        u.setName("Jadyer99");  
        Person pp = client.getPerson(u);  
        System.out.println(pp.getName());  
          
        /*--處理List--*/  
        List<Person> personList = client.getPersonList(24, "Jadyer88");  
        for(Person p : personList){  
            System.out.println(p.getName());  
        }  
    }  
}  

這是它要用到的接口和兩個POJO類

/** 
 * Web服務提供給客戶端的接口 
 * @see 這是第二種方式創建的客戶端,要用到的接口 
 */  
package com.jadyer.server;  
import java.util.List;  
import com.jadyer.model.Person;  
import com.jadyer.model.User;  
public interface HelloService {  
    public String sayHello(String name);  
    public Person getPerson(User u);  
    public List<Person> getPersonList(Integer age, String name);  
}  
/** 
 * 第二種方式創建的客戶端,要用到的兩個POJO類 
 */  
package com.jadyer.model;  
public class User {  
    private String name;  
    /*--getter和setter略--*/  
}  
package com.jadyer.model;  
public class Person {  
    private Integer age;  
    private String name;  
    /*--getter和setter略--*/  
}  

 

Axis:

Java WebService接口生成和調用:

參考路徑:

https://blog.csdn.net/qazwsxpcm/article/details/70370490

調用:

引用jar包:axis.jar 、jaxrpc.jar

一、使用eclipse自動生成的wsdl接口

1、

2、

3、

調用接口

private static String requestFunctionWebService(String http,String message) {
        //http="http://203.48.27.97:85/dagl/service/TDHYxService?wsdl"
        String retMessage = "";
        try {
            YxBrowseWSProxy yx = new YxBrowseWSProxy(http);
            retMessage = yx.yxBrowse(message);//方法名yxBrowse
        } catch (Exception e) { 
            logger.error("requestFunctionWebService請求接口異常:"+ e.getMessage());
            e.printStackTrace();
        }
        return retMessage;
    }

二、直接AXIS調用遠程的web service 

import java.util.Date;   
import java.text.DateFormat;   
import org.apache.axis.client.Call;   
import org.apache.axis.client.Service;   
import javax.xml.namespace.QName;   
import java.lang.Integer;   
import javax.xml.rpc.ParameterMode;   
    
public class caClient {   
               
       public static void main(String[] args) {   
    
              try {   
                     String endpoint = "http://localhost:8080/ca3/services/caSynrochnized?wsdl";   
                     //直接引用遠程的wsdl文件   
                    //以下都是套路    
                     Service service = new Service();   
                     Call call = (Call) service.createCall();   
                     call.setTargetEndpointAddress(endpoint);   
                     call.setOperationName("addUser");//WSDL里面描述的接口名稱   
                     call.addParameter("userName", org.apache.axis.encoding.XMLType.XSD_DATE,   
                                   javax.xml.rpc.ParameterMode.IN);//接口的參數   
                     call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//設置返回類型     
                     String temp = "測試人員";   
                     String result = (String)call.invoke(new Object[]{temp});   
                     //給方法傳遞參數,並且調用方法   
                     System.out.println("result is "+result);   
              }   
              catch (Exception e) {   
                     System.err.println(e.toString());   
              }   
       }   
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM