webservice咋么用?这么干就完事了!

-----------------直接上干货---------------

1.添加pom依赖

<!-- CXF webservice -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.1.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>3.1.6</version>
        </dependency>

2.创建接口

import javax.jws.WebService;

/**
 * @author: pan.lei
 * @version: 2021年1月27日 下午2:22:17
 */
@WebService(name = "WmsServiceProduct", // 暴露服务名称
        targetNamespace = "http://product.facade.com"// 命名空间,一般是接口的包名倒序
)
public interface WmsServiceProduct {

    int getProductInfo(Header header, ProductRequest request);
}

3.创建接口实现类

import java.util.List;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

import com.alibaba.fastjson.JSONArray;

/**
 * @author: pan.lei
 * @version: 2021年1月27日 下午2:32:04
 */
@WebService(name = "WmsServiceProduct", 
    targetNamespace = "http://product.facade.com", 
    endpointInterface = "facade.product.WmsServiceProduct"// 接口地址
)
public class WmsServiceProductImpl implements WmsServiceProduct {

    @WebMethod
    @Override
    public int getProductInfo(@WebParam(name = "header") Header header,
            @WebParam(name = "body") ProductRequest request) {
        List<Product> product = JSONArray.parseArray(request.getInputParameter(), Product.class);
        for(Product p : product) {
            System.out.println(p.toString());
        }
        return 1;
    }

}

注意:实现类中将接口参数直接转换成了对象,使用到了JSONArray,关于json转对象或对象转json,以下是几个简单案例:

/**
* json字符串转化为对象
*/
String jsonString = "{name:'Antony',age:'12',sex:'male',telephone:'88888'}";
Person person= JSON.parseObject(jsonString, Person .class);
System.out.println(staff.toString());
 
/**
 * 对象转化为json字符串
*/
String jsonStr = JSON.toJSONString(person);
System.out.println(jsonStr);

/**
* json字符串直接转为List<java>对象
*/
List<Person > list = JSONArray.parseArray(jsonData, Person .class); 

4.创建配置类

package com.facade.product;

import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;

/**
 * @author: pan.lei
 * @version: 2021年1月28日 上午9:54:22
 */
@Configuration
public class CxfConfig {

    @Bean
    public ServletRegistrationBean dispatcherServlet() {
        return new ServletRegistrationBean(new CXFServlet(), "/services/*");
    }

    @Bean(name = Bus.DEFAULT_BUS_ID)
    public SpringBus springBus() {
        return new SpringBus();
    }

    @Bean
    public WmsServiceProduct wmsServiceProduct() {
        return new WmsServiceProductImpl();
    }

    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(springBus(), wmsServiceProduct());
        endpoint.publish("/wmsServiceApi");
        return endpoint;
    }
}

5.启动服务,浏览器访问接口地址

http://localhost:8087/services/wmsServiceApi?wsdl

 

 

 6.生成客户端代码

  使用jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).当然,无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码,服务端通过客户端代码调用webservice。

 7.将客户端代码拷贝到自己的项目下,编写测试

  @org.junit.Test
    public void test() {
        WmsServiceProductImplService serviceProductImplService = new WmsServiceProductImplService();
        Header header = new Header();
        header.setUsername("wangwu");
        header.setPassword("456");
        ProductRequest request = new ProductRequest();
        request.setFuncType("出库单");
        request.setInputParameter("[{\r\n" + 
                "    \"code\":\"c011020201\",\r\n" + 
                "    \"name\":\"手机\",\r\n" + 
                "    \"description\":\"华为手机\",\r\n" + 
                "    \"category\":\"\"\r\n" + 
                "},{\r\n" + 
                "    \"code\":\"c011020201\",\r\n" + 
                "    \"name\":\"手机\",\r\n" + 
                "    \"description\":\"华为手机\",\r\n" + 
                "    \"category\":\"\"\r\n" + 
                "}]");
        int i = serviceProductImplService.getWmsServiceProductPort().getProductInfo(header, request);
    }

8.也可用soapui测试

 9.如果接口是简单参数,并非复杂参数(对象),可以使用地址动态调用,不用生成客户端代码

  @org.junit.Test
    public void test() {
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        Client client = dcf.createClient("http://localhost:8087/services/wmsServiceApi?wsdl");
        // 需要密码的情况需要加上用户名和密码
        // client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,PASS_WORD));
        HTTPConduit conduit = (HTTPConduit) client.getConduit();
        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
        httpClientPolicy.setConnectionTimeout(2000); // 连接超时
        httpClientPolicy.setAllowChunking(false); // 取消块编码
        httpClientPolicy.setReceiveTimeout(120000); // 响应超时
        conduit.setClient(httpClientPolicy);
        // client.getOutInterceptors().addAll(interceptors);//设置拦截器
        try {
            Object[] objects = new Object[0];
            // invoke("方法名",参数1,参数2,参数3....);
            objects = client.invoke("getProductInfo", "","");
            System.out.println("返回数据:" + objects[0]);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

-----------------干完收工---------------

 

后话:关于WebService一些知识点拓展(✿◡‿◡跟别人抄的)

WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互。 其实WebService并不是什么神秘的东西,它就是一个可以远程调用的类,或者说是组件,把你本地的功能开放出去共别人调用。

为什么使用WebService?

简单解释一下WebService,比如你的项目需要查询某银行账户余额。你能直接查吗,肯定不行,因为数据库是银行的,他不可能给你权限。你想访问他的数据库获取数据,这就需要用到WebService。通过调用银行暴露的接口来得到你想要的数据。

适用场景: 

软件的集成和复用,如气象局(服务端系统)、天气查询网站等。

  1. 发布一个服务(对内/对外),不考虑客户端类型,不考虑性能,建议WebService
  2. 服务端已经确定使用webservice,客户端不能选择,必须使用WebService

软件集成:通过远程调用技术,将两个系统整合到一起,从而实现软件集成。

软件复用:同一个款软件的多次集成,最终实现复用。

不适用场景:

  1. 考虑性能时不建议使用WebService
  2. 同构程序下不建议使用WebService

Axis2与CXF的区别

目前java开发WebService的框架主要包括Axis2和CXF,如果你需要多语言的支持,你应该选择Axis2。如果你需要把你的实现侧重java并希望和Spring集成,CXF就是更好的选择,特别是把你的WebService嵌入其他的程序中。

区别Axis2CXF
简述 WebService引擎 简易的SOA框架,可以作为ESB
spring集成 不支持 支持
应用集成 困难 简单
是否跨语言
部署方式 web应用 嵌入式
服务的管控和治理 支持 不支持

 

posted @ 2021-01-28 14:33  专心_clown  阅读(147)  评论(0)    收藏  举报