天天看点

一文带你了解Java对接soap接口

什么是soap协议

soap是一种简单的基于XML的协议:HTTP+RPC+XML

soap消息组成

A、Envelope(信封)元素,必选,可把此XML文档标识为一条SOAP消息。

B、Header(报头)元素,可选,包含头部信息(包含了使消息在到达最终目的地之前,能够被路由到一个或多个中间节点的信息)。

C、Body(主体)元素,必选,包含所有的调用和响应信息。

D、Fault元素,位于Body内,可选,提供有关处理此消息所发生错误的信息。

E、Attachment(附件)元素,可选,可通过添加一个或多个附件扩展SOAP消息。

SOAP接口调试工具:SoapUI

  1. 创建一个新的soap项目
    一文带你了解Java对接soap接口
  2. 填写项目名称以及wsdl接口
    一文带你了解Java对接soap接口
  3. 接口一般会有权限设置,这时需要输入对应的账号和密码或者也可以在request请求中的properties设置相应的账号和密码
    一文带你了解Java对接soap接口
一文带你了解Java对接soap接口
  1. soapUI根据wsdl解析出来的地址是基于内网,如果对接项目不是内网互通,那么需要把内网地址改成对接公司对应外网地址,这样接口才能ping得通
    一文带你了解Java对接soap接口
  2. 改完后根据业务组装相应数据后点击绿色箭头发送请求,至此接口调试完成
一文带你了解Java对接soap接口

Java对接调用soap接口:

  1. 相关http工具接口调用:该方式需要自己组装相应soap的xml,组装方式比较复杂(不推荐)

所以这里用postman模拟Java接口调用,请求方式POST:

(1)根据上面接口调试发现wsdl输入账号和密码后会重定向到一个地址,所以复制该地址至postman

一文带你了解Java对接soap接口

(2)构建认证请求头

一般SAP提供的接口都需要账号密码验证,所以第一步根据提供的账号(username)和密码(password)生成认证请求头。将其放置postman请求头以及设置内容为:xml

// 设置-授权信息
HttpHeaders headers = new HttpHeaders();
String basicStr = "Basic " + Base64.encodeBase64String((username + ":" + password).getBytes());
headers.add("Authorization", basicStr);
           
一文带你了解Java对接soap接口

(3)将参数组装至body,方式为xml,这样就可以调通接口了

一文带你了解Java对接soap接口

该方式对应复杂请求数据组装不友好,如需此方法调用对象组装成xml,可以考虑使用JAXB

  1. 通过SoapUI软件自动生成接口调用生成代码

    (1)在SoapUI软件中点击选中接口,右键 -> Genarate Code -> Axis 1.x Artifacts

    一文带你了解Java对接soap接口
    (2)输入wsdl地址以及文件夹目录,点击generate生成:
    一文带你了解Java对接soap接口
    (3)生成完去对应目录,将相应代码拷贝需要对接的项目中:
    一文带你了解Java对接soap接口
    (4)调用生成的类和方法

Java客户端调用接口代码已经自动生成,但是使用前还有3个地方需要调整

引入axis-1.4的依赖

<dependency>
	<groupId>axis</groupId>
	<artifactId>axis</artifactId>
	<version>1.4</version>
</dependency>
           

在生成的代码中设置账号和密码,如果不是基于内网还需将内网改成相应外网地址

自动生成的Java文件中有一个以Stub结尾的Java文件,找到createCall()这行代码的位置,设置账号和密码和相应的地址(如果自动生成的地址可以ping通这个就不用)的值。

一文带你了解Java对接soap接口

组装data请求参数,调用对应的locator类的getHTTP_Port()方法获取远程调用接口,直接调用接口内的方法即可

XXXServiceLocator locator = new XXXServiceLocator();
XXX xxx = locator.getHTTP_Port();
ResponseDataItems[] responseDataItems = xxx.XXX(data);
           

部分思路来源于:JAVA客户端调用SAP提供的接口(保姆级教程)