SOAP WebService 实现(一)

该文介绍了如何基于ApacheCXF框架创建和部署一个JAX-WSWebService。首先,配置了服务端依赖,创建服务接口及其实现,然后发布服务并测试。接着,创建客户端,通过JaxWsProxyFactoryBean访问服务。最后,添加日志拦截器查看SOAP协议内容,展示了完整的交互过程。
摘要由CSDN通过智能技术生成

        项目基于B站的黑马程序员的webservice项目。

        项目使用ApacheCXF框架,利用 Frontend 编程 API 来构建和 开发 Services ,像 JAX-WS。

        本文不是Springboot项目。

        分别创建服务端和客户端模块。

        依赖配置如下:

<dependencies>
        <!-- 要进行jaxws 服务开发 -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.0.1</version>
        </dependency>

        <!-- 内置jetty web服务器  -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>3.0.1</version>
        </dependency>

        <!-- 日志实现 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.12</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

<build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.2</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                        <showWarnings>true</showWarnings>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

创建service包,写服务接口HelloService.

package com.itheima.service;

import javax.jws.WebService;

/**
 * 对外发布服务的接口
 */
@WebService
public interface HelloService {
    /**
     * 对外发布服务的接口的方法
     */
    public String sayHello(String name);
}

创建服务接口实现类。

package com.itheima.service.impl;

import com.itheima.service.HelloService;

public class HelloServiceImpl implements HelloService{

    public String sayHello(String name) {
        return name+"Welcome to itheima!";
    }

把log4j.properties复制到resources文件夹下。改变resources文件夹属性为resources。

 

在test文件夹下,创建测试类Server,发布服务。

package com.itheima.service.impl;

import com.itheima.service.HelloService;

public class HelloServiceImpl implements HelloService{

    public String sayHello(String name) {
        return name+"Welcome to itheima!";
    }
}

运行Server类,服务发布成功。

 

 浏览器输入测试地址。访问成功。

 浏览器输入WSDL说明书地址。localhost:8000/ws/hello?wsdl

 访问成功。

写客户端之前要先明确: 1. 服务端地址 2. 服务端接口、接口方法(方法参数、返回值)。

创建模块:02_jaxws_client。

客户端依赖与服务端项目依赖一致。

创建服务接口 HelloService。和服务端的接口保持一致。

package com.itheima.service;

import javax.jws.WebService;

/**
 * 对外发布服务的接口
 */
@WebService
public interface HelloService {
    /**
     * 对外发布服务的接口的方法
     */
    public String sayHello(String name);
}

创建测试类Client,远程访问服务端。

package com.itheima;

import com.itheima.service.HelloService;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

public class Client {
    public static void main(String[] args) {
        //服务接口访问地址:http://localhost:8000/ws/hello

        //创建cxf代理工厂
        JaxWsProxyFactoryBean factory=new JaxWsProxyFactoryBean();

        //设置远程访问服务端地址
        factory.setAddress("http://localhost:8000/ws/hello");

        //设置接口类型
        factory.setServiceClass(HelloService.class);

        //对接口生成代理对象
        HelloService helloService = factory.create(HelloService.class);

        //代理对象类型: class com.sun.proxy.$Proxy34 {java代理:静态,动态{jdk接口代理,cglib子类代理}} $CGLIB123
        System.out.println(helloService.getClass());

        //远程访问服务端方法:返回值接收
        String content = helloService.sayHello("Jet,");
        System.out.println(content);
    }
}

添加日志拦截器,观察soap协议内容。

服务端加上如下代码:

  //添加日志输入,输出拦截器,观察SOAP请求以及SOAP响应内容
        factory.getInInterceptors().add(new LoggingInInterceptor());//日志输入
        factory.getOutInterceptors().add(new LoggingOutInterceptor());//日志输出

客户端调用,观察服务端的日志。

第一部分是服务端发送POST请求。

ID: 4
Address: http://localhost:8000/ws/hello
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], Content-Length=[195], content-type=[text/xml; charset=UTF-8], Host=[localhost:8000], Pragma=[no-cache], SOAPAction=[""], User-Agent=[Apache CXF 3.1.12]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHello xmlns:ns2="http://service.itheima.com/"><arg0>Jet,</arg0></ns2:sayHello></soap:Body></soap:Envelope>

第二部分是服务端的响应。

ID: 4
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHelloResponse xmlns:ns2="http://service.itheima.com/"><return>Jet,, Welcome to itheima!</return></ns2:sayHelloResponse></soap:Body></soap:Envelope>

测试 完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值