亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳談cxf和axis兩種框架下的webservice客戶端開發(fā)

 更新時(shí)間:2021年08月26日 10:15:59   作者:萬米高空  
這篇文章主要介紹了詳談cxf和axis兩種框架下的webservice客戶端開發(fā),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

客戶端相比服務(wù)端,基本沒啥配置。引入jar包就好。我這里為了看效果,是新建了maven工程來做客戶端。調(diào)用另一個(gè)webservice服務(wù)端maven工程.

環(huán)境:jdk1.7+maven3.3.9+tomcat7

框架:spring+cxf/spring+axis(這里不是axis2,是axis)

第一種:基于cxf的客戶端開發(fā)

1.引入依賴 pom.xml

這里把兩種框架的依賴一次到位。就不分開引入了。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.zhanglf</groupId>
    <artifactId>cxfClientTest</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>cxfClientTest Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <!-- 添加 Spring dependency -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.1.7.RELEASE</version>
        </dependency>
        <!-- 添加CXF dependency -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-core</artifactId>
            <version>3.1.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.1.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>3.1.5</version>
        </dependency>
        <!-- 添加CXF dependency -->
        <!-- 另一種axis方法調(diào)用webservice依賴 -->
        <dependency>
            <groupId>org.apache.axis</groupId>
            <artifactId>axis</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis</groupId>
            <artifactId>axis-jaxrpc</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>axis</groupId>
            <artifactId>axis-wsdl4j</artifactId>
            <version>1.5.1</version>
        </dependency>
        <dependency>
            <groupId>commons-discovery</groupId>
            <artifactId>commons-discovery</artifactId>
            <version>0.2</version>
        </dependency>
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
        </dependency>
    <!-- 另一種axis方法調(diào)用webservice -->
    </dependencies>
    <build>
        <finalName>cxfClient</finalName>
    </build>
</project>

2.cxf和axis都沒有spring配置

直接進(jìn)入業(yè)務(wù)代碼CxfClientTest.java

package com.zhanglf;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
public class CxfClientTest {
    public static void main(String[] args) throws Exception {
        JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
        //通過wsdl服務(wù)描述文件創(chuàng)建客戶端工廠。
        Client client = factory.createClient("http://localhost:8080/springCXFWebserviceDemo01/service/HelloWorldService?wsdl");
        //嘗試使用不帶?wsdl的地址
        //Client client = factory.createClient("http://localhost:8080/springCXFWebserviceDemo01/service/HelloWorldService");
        //invoke(
        //String operationName:要調(diào)用的方法名
        //Object... params):方法的入?yún)???梢允嵌鄠€(gè)。
        Object[] objs = client.invoke("sayHello", "阿福");
        //invoke方法是默認(rèn)返回Object[]數(shù)組。取出數(shù)組的第一位值得值就是返回值。
        System.out.println(objs[0].toString());
    }
}

直接Run As Java Application.可以看到在控制臺(tái)打出訪問服務(wù)端的代碼。

這里寫圖片描述

拓展:這里的客戶端只是傳了一個(gè)簡單的人名,正常傳入的是個(gè)String類型的xml報(bào)文。然后服務(wù)端接收?qǐng)?bào)文,進(jìn)行報(bào)文解析,并對(duì)信息進(jìn)行crud操作。并將執(zhí)行結(jié)果以報(bào)文形式發(fā)送到客戶端??蛻舳嗽谶M(jìn)行報(bào)文解析。判斷執(zhí)行情況以便進(jìn)行下一步操作。下面我們用axis框架進(jìn)行稍微接近業(yè)務(wù)的代碼開發(fā)。

axis客戶端代碼和cxf都在一個(gè)maven工程里。我把工程結(jié)構(gòu)貼出來供參考

這里寫圖片描述

第二種:基于axis框架的客戶端開發(fā)

AxisClientTest.java的code,所有涉及的點(diǎn)我都在代碼里說了。解釋的文字比較多,代碼并不多。

package com.zhanglf;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
/**
 * 
 說明:address="http://localhost:8080/HelloWorld/services/user?wsdl"
 * http://localhost:8080/HelloWorld:工程訪問路徑,
 * /services:此路徑在web.xml里面配置cxf攔截器前置訪問路徑
 * /user:此路徑在服務(wù)端的applicationContext.xml里配置的,要暴露給外部調(diào)用的接口,address:請(qǐng)求路徑
 * 
 * @author Administrator
 * 
 */
public class AxisClientTest {
    public static void main(String[] args) throws Exception {
        // namespaceURI
        // 為:一般可以認(rèn)為是<wsdl:definitions>中的targetNamespace的值,最好還是<wsdl:definitions>標(biāo)簽下的
        // xmlns:tns的值為準(zhǔn)。
        // 也是webservice接口的類上注解的targetNamespace,效果如同spring中的requestMapping,用來區(qū)分請(qǐng)求定位到具體的那個(gè)接口。
        // 這里的命名空間對(duì)應(yīng)的是接口上面的targetNamespace,而不是實(shí)現(xiàn)類上面的。故通過wsdl中的<wsdl:definitions
        // 里面的targetNamespace是不準(zhǔn)的,應(yīng)該以<wsdl:import 中的
        // namespace為準(zhǔn)或者<wsdl:definitions>標(biāo)簽下的 xmlns:tns的值為準(zhǔn)
        String nameSpaceURI = "com.serviceTargetName";
        // 指出service所在URL,這個(gè)有沒有?wsdl均能正確訪問。。。,這里區(qū)別于cxf,cxf是不能少這個(gè)?wsdl
        String publishUrl = "http://localhost:8080/springCXFWebserviceDemo01/service/HelloWorldService?wsdl";
        // 創(chuàng)建一個(gè)服務(wù)(service)調(diào)用(call)
        Service service = new Service();
        // 通過service創(chuàng)建call對(duì)象
        Call call = (Call) service.createCall();
        // 設(shè)置webservice接口地址
        call.setTargetEndpointAddress(new URL(publishUrl));
        // 你需要遠(yuǎn)程調(diào)用的方法new QName(定位類的targetnamespace,定位方法的方法名)
        /**
         * call.setOperationName(new QName("serviceTargetName", "sayHello"));
         * 方法中的QName方法的入?yún)⒄f明: new QName( String
         * namespaceURI-定位接口的命名空間:接口注解targetnamespace的值或者wsdl文件
         * <wsdl:definitions中的xmlns
         * :tns="com.serviceTargetName"來鎖定targetnamespace的值, 這里不能用wsdl文件<wsdl:
         * definitions中的targetNamespace來確定值的原因在于這里的值來源與接口實(shí)現(xiàn)類上的targetNamespace注解的值
         * 。如果你接口的實(shí)現(xiàn)類中的targetNamespace和接口的不一樣,豈不是搞錯(cuò)了。 String
         * localPart-接口下定位方法的方法名
         * :就是這里的抽象方法sayHello方法名,或者wsdl文件<wsdl:binding標(biāo)簽下<wsdl:operation
         * name="sayHello"中name的值。 )
         */
        call.setOperationName(new QName(nameSpaceURI, "sayHello"));
        // 方法參數(shù),如果沒有參數(shù)請(qǐng)無視。這里如果接口沒有用@WebParam(name = "name"),則會(huì)報(bào)錯(cuò):Unmarshalling
        // Error: 意外的元素 (uri:"", local:"name")。所需元素為<{}arg0>
        call.addParameter("parameterName", XMLType.XSD_STRING, ParameterMode.IN);
        // call.addParameter(new QName(soapaction,"xxxx"), XMLType.XSD_STRING,
        // ParameterMode.IN);
        // 設(shè)置返回類型,一般用string接收
        call.setReturnType(XMLType.XSD_STRING);
        // 給方法傳遞參數(shù),并且調(diào)用方法
        String name = "zhanglifeng";
        String temp = getXml(name);
        // 這里的obj{}是放入幾個(gè)入?yún)?,完全由service提供的接口方法的入?yún)Q定,且順序和你存放的順序一致!一般入?yún)镾tring類型的xml報(bào)文,回參也是xml報(bào)文。
        Object[] obj = new Object[] { temp };
        String result = (String) call.invoke(obj);
        System.out.println(result);
    }
    private static String getXml(String name) {
        StringBuffer sb = new StringBuffer(
                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        sb.append("<userBean>");
        sb.append("<userName>" + name + "</userName>");
        sb.append("</userBean>");
        return sb.toString();
    }
}

運(yùn)行方法:Run As Java Application.客戶端的請(qǐng)求的入?yún)?bào)文如下:

<?xml version="1.0" encoding="UTF-8"?>
    <userBean>
        <userName>" + 入?yún)ⅲ喝嗣?+ </userName>
    </userBean>

下面我把調(diào)用服務(wù)端的方法也貼出來,這樣更好理解。昨天已經(jīng)貼出了服務(wù)端的目錄結(jié)構(gòu),我就把其中的HelloWorldImpl.java中的sayHello方法改一下。code如下:

package com.zlf.impl;
import javax.jws.WebService;
import org.springframework.stereotype.Component;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import com.util.XMLUtils;
import com.zlf.HelloWorld;
/**
 * 由于實(shí)現(xiàn)類和接口不在同一個(gè)包中。所以要加上targetNamespace屬性。
 * 另外,這里的endpointInterface是實(shí)現(xiàn)類對(duì)應(yīng)接口的全路徑
 * @author Administrator
 */
@WebService(targetNamespace="com.serviceTargetName",endpointInterface="com.zlf.HelloWorld")
@Component("HelloWord")//spring注入用
public class HelloWorldImpl implements HelloWorld {
    @Override
     public String sayHello(String str) {
        String username="aaa";
        Document document = XMLUtils.parse(str);
        //首先接口開發(fā)肯定是雙發(fā)都知道此方法要接受的報(bào)文格式的。我們獲取報(bào)文中人名對(duì)應(yīng)的節(jié)點(diǎn)即可。
          Node node = document.getElementsByTagName("userName").item(0);
          if(node !=null){
              username=node.getTextContent();
          }
        return "你好,"+username+"  你已成功訪問了webservice服務(wù)端!" ;
    }
}

XMLUtils.java工具類我也貼出來,這個(gè)也比較常用。

package com.util;
import java.io.IOException;
import java.io.StringReader;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
 * 解析器
 * @author Administrator
 *
 */
public class XMLUtils {
    private final static DocumentBuilder createDocumentBuilder(){
        DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
        DocumentBuilder builder=null;
        try {
            factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
            builder=factory.newDocumentBuilder();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return builder;
    }
    public final static Document parse(InputSource in){
        try {
            return createDocumentBuilder().parse(in);
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
    public final static Document parse(String xml){
        return parse(new InputSource(new StringReader(xml)));
    }
}

這樣就完成了客戶端對(duì)服務(wù)端的調(diào)用。畢竟是初步入門。對(duì)以后的開發(fā)還是有所裨益。

一個(gè)客戶端和服務(wù)端底層傳輸數(shù)據(jù)的了解

客戶端傳入?yún)?shù),執(zhí)行String result = (String) call.invoke(new Object[] { “zhanglifeng”})后,實(shí)際發(fā)送給服務(wù)端的是一個(gè)soap底層協(xié)議自動(dòng)生成的入?yún)?bào)文。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="com.serviceTargetName">
   <soapenv:Header/>
   <soapenv:Body>
      <com:sayHello>
         <!--Optional:-->
         <parameterName>zhanglifeng</parameterName>
      </com:sayHello>
   </soapenv:Body>
</soapenv:Envelope>

服務(wù)端接收這個(gè)報(bào)文后自動(dòng)解析,并把入?yún)①x值給方法sayHello(String str)的入?yún)tr.經(jīng)過處理數(shù)據(jù)返回給客戶端,也是soap底層自動(dòng)生成的回參報(bào)文

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:sayHelloResponse xmlns:ns2="com.serviceTargetName">
         <return>你好,zhanglifeng  你已成功訪問了webservice服務(wù)端!</return>
      </ns2:sayHelloResponse>
   </soap:Body>
</soap:Envelope>

客戶端自動(dòng)把從返回報(bào)文中取出返回值,并付值給String result。這樣底層已經(jīng)處理過了報(bào)文。還有一種情況就是如果客戶端傳過來的參數(shù)本身就是xml時(shí),底層封裝參數(shù)的問題。

如果客戶端的invoke()方法入?yún)?/p>

String xml="
<?xml version=\"1.0\" encoding=\"UTF-8\"?><userBean><userName>zhanglifeng</userName></userBean>"

底層自動(dòng)為xml加上<![CDATA[ xml ]]>:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="com.serviceTargetName">
   <soapenv:Header/>
   <soapenv:Body>
      <com:sayHello>
         <!--Optional:-->
         <parameterName><![CDATA[<?xml version="1.0" encoding="UTF-8"?><userBean><userName>zhanglifeng</userName></userBean> ]]></parameterName>
      </com:sayHello>
   </soapenv:Body>
</soapenv:Envelope>

知道這個(gè)原理,在使用SoupUI進(jìn)行調(diào)用webservice接口時(shí)就可以使用這種<![CDATA[ 入?yún)ml ]]>格式進(jìn)行調(diào)用。soupui調(diào)用的入?yún)⑷缦聢D

這里寫圖片描述

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論