生成 Web Service 客户端调用代码的两种方式

Last Modified: 2024/01/10

概述

虽然现在 web service 已经很少用了,但有时仍然避免不了和老系统打交道,这些老系统的接口很有可能是通过当年流行的 web service 对外提供的。想要调用这些 web service 接口,我们可以通过 wsdl 来生成客户端调用代码,本文介绍两种方式来生成 web service 客户端调用代码。

1、使用 wsdl2java 生成 web service 客户端代码

由于 wsdl2java 是 apache-cxf 提供的一个命令行工具,所以需要先下载 apache-cxf。下载地址:https://cxf.apache.org/download.html

解压完成后,进入到 bin 目录可以看到 wsdl2java 命令。打开命令行,进入到 bin 目录,执行如下命令:

# Linux
./wsdl2java -encoding utf8 -verbose -d /tmp/cli -p net.v.prac.ws.cli -client 'http://localhost:8081/ws/addService?wsdl'
# Windows
.\wsdl2java -encoding utf8 -verbose -d x:\tmp\cli -p net.v.prac.ws.cli -client http://localhost:8081/ws/addService?wsdl

  • -d 用于指定生成代码存放的路径,可以使用相对路径,也可以使用绝对路径;
  • -p 用于指定生成代码所使用的包名;
  • -encoding 用于指定生成代码的编码格式,建议使用 utf8
  • -verbose 用于打印详细信息,方便调试。

2、使用 wsimport 生成 web service 客户端代码

除了使用 apache-cxf 的 wsdl2java 还可以直接使用 JDK 自动的命令行工具 wsimport。假设你知道 webservice 的 wsdl 地址为:http://localhost:8081/ws/addService?wsdl,想将生成的代码放到 /tmp/add 目录下,并且生成代码的包名为 net.v.prac.ws.cli,则命令为:

wsimport -encoding utf8 -s /tmp/add -p net.v.prac.ws.cli -verbose 'http://localhost:8081/ws/addService?wsdl'
  • -s 用于指定生成代码存放的目录,可以使用相对路径,也可以使用绝对路径,该目录必须在运行命令之前创建好
  • -p 用于指定生成代码所使用的包名;
  • -encoding 用于指定生成代码的编码格式,建议使用 utf8
  • -verbose 用于打印详细信息,方便调试。

注:Windows 上的目录路径和 Linux 上的目录路径写法不同,Windows 上目录路径的分隔符为 \

出于安全考虑,有些 wsdl url 必须要输入用户名和密码才能访问,这种一般使用 HTTP basic authentication(Http 基本认证) 方式对用户进行认证,此时需要使用 -Xauthfile 参数来指定认证文件才可以生成客户端调用代码。

wsimport -encoding utf8 -s .\Documents\add -p net.v.prac.ws.cli -verbose -Xauthfile .\Documents\auth.txt http://localhost:8081/ws/addService?wsdl

假设用户名为 admin,密码为 123456,则 auth.txt 文件的内容为:

http://admin:123456@localhost:8081/ws/addService?wsdl

让 Web Service 客户端调用支持 Http basic auth

如果 web service 的 wsdl url 需要 Http basic auth 方式认证,则需要在客户端代码调用之前提供用户名和密码,方法如下:

static {
    java.net.Authenticator.setDefault(new java.net.Authenticator() {
        @Override
        protected java.net.PasswordAuthentication getPasswordAuthentication() {
            return new java.net.PasswordAuthentication("admin", "123456".toCharArray());
        }
    });
}

跟踪 web service 请求和响应

在调试阶段,跟踪 web service 请求和响应是很有必要的。可以通过 VM options 参数实现。

-Dcom.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true

VM options 一般可以通过 ide 调试界面配置界面设置,需要注意的是不同版本的 jdk 配置可能不同,以上是针对 jdk8 的。

开了 VM options 之后,请求和响应的内容会被输出到控制台,类似下面这样:

---[HTTP request - http://v.net:8000/XISOAPAdapter/MessageServlet?senderParty=&senderService=BS_OA_DEV&receiverParty=&receiverService=&interface=Add&interfaceNamespace=http%3A%2F%2Fnet.v.cn%2FOA%2FIF151%2FOA_SHIP_REQ%2FSender]---
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://v.net/xi/WebService/soap1.1"
User-Agent: JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e
<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:ADD_REQ xmlns:ns2="urn:v-net:document:rfc:functions"><IV_INPUT>{"head":"xyz"}</IV_INPUT></ns2:ADD_REQ></S:Body></S:Envelope>--------------------

---[HTTP response - http://v.net:8000/XISOAPAdapter/MessageServlet?senderParty=&senderService=BS_OA_DEV&receiverParty=&receiverService=&interface=Add&interfaceNamespace=http%3A%2F%2Fnet.v.cn%2FOA%2FIF151%2FOA_SHIP_REQ%2FSender - 200]---
null: HTTP/1.1 200 OK
content-description: SOAP
content-disposition: attachment;filename="soap-dbc5b461ab7611eebc3b000000179b8e@v.net.xml"
content-length: 308
content-type: text/xml; charset=utf-8
date: Fri, 05 Jan 2024 03:02:27 GMT
server: ****************************************************
set-cookie: JSESSIONMARKID=SgL1DAb9_H6cnj_eK3j28sjABTUPOEdxitcI6bFwA; Version=1; Path=/
<SOAP:Envelope xmlns:SOAP='http://schemas.xmlsoap.org/soap/envelope/'><SOAP:Header/><SOAP:Body><ns0:ADD_REQ.Response xmlns:ns0='urn:v-net:document:rfc:functions'><EV_OUTPUT>{"MSGTY":"S","MESSAGE":"zzz"}</EV_OUTPUT></ns0:ADD_REQ.Response></SOAP:Body></SOAP:Envelope>--------------------

{"MSGTY":"S","MESSAGE":"abc"}

Web Service 客户端代码生成实战

为了实战需要,我特地写了一个简单 web service 服务,你可以在这里 clone 项目。启动项目,访问 http://localhost:8081/ws/addService?wsdl 可以查看 wsdl 文件。随后便可以使用上面提到的两种方式的任意一种来生成客户端调用代码了。

有问题吗?点此反馈!

温馨提示:反馈需要登录