背景
在很多Java项目中,仍然会使用基于WebService的数据传输接口,而webservice实际上就是http+xml。而在实践过程中,主要需要注意接收和发送的格式。
实践
被调用接口
如果处于被调用方,则需要声明出一个WebService服务,也就是生成、发布一个WSDL文件。
什么是WSDL?
WSDL – WebService Description Language – Web服务描述语言。
- 通过XML形式说明服务在什么地方-地址。
- 通过XML形式说明服务提供什么样的方法 – 如何调用。
将接口声明为一个ws服务
在Java中可以依靠javax.jws包中的相关注解来实现一个WebService接口
1 |
|
- 使用 @WebService 注解标注该接口为一个WebService接口,可以修改服务名、端口名、命名空间等信息,如
@WebService(targetNamespace = "http://ujn.cn/",serviceName = "UserService", portName = "UserPort")
- 使用 @SOAPBinding 注解标注绑定的形式,根据绑定的不同的形式,客户端使用不同的调用约定进行调用。
- Document Wrapped(默认使用方式)
- Document Bare
- RPC
- 使用 @WebMethod 方法标注为一个WebService中的一个方法服务
- 最后实现接口中的方法即可,如果需要返回信息,直接封装为一个对象即可,如上面代码中的ResponseRoot对象。最后会解析出一个对象。
添加XML对象
在上面的代码中可以看到不管是接受还是返回,都是面向对象的,然而最后都需要形成为一个XML文档,那么,是如何将这些对象解析为有一整个XML对象的呢?
1 | "MessageHeader") (name = |
- 使用
@XmlRootElement
注解标注在对象上,说明此对象是一个可解析为XML节点的对象。 - 复杂对象必须继承
Serializable
接口,进行序列化。 - 使用
@XmlElement(name = "GUID")
注解,声明出其中的子节点和子节点的名称。 - 在get方法上添加
@XmlTransient
注解,否则会报对象节点重复的错误。 - 对对象通过以上的配置,可以完整的XML类型的数据映射到对象上,从而实现进一步的处理。
形成可接受的XML格式
1 | <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webService.test.com/"> |
可以使用SOAP-UI 这个工具进行生成,使用免费版,添加SOAP服务,后点击方法的request则会自动生成格式。
接口调用
在调用其他服务的接口时,对方法等没有特殊的要求,只需要遵守对方特定的接口格式即可。在接口调用时,同样有多种调用的方式,在此处我使用xml格式拼接,http服务直接调用的方式。
XML格式拼接
1 | ResQuestionBean resQuestionBean = new ResQuestionBean(); |
- 声明出一个返回对象 resQuestionBean ,对对象中的数据进行装载。
- 使用objectToXML方法将对象转换为XML字符串。
1 | public static String objectToXML(Object object) throws JAXBException { |
通过HTTP调用方法,推送数据
1 | private synchronized String doSend(String address, String invokeMethod, |
- 设置地址、调用方式等http的基本信息后,使用write方法将数据写入到请求中。
- 使用reader读取返回数据,并返回、解析,形成最终数据后返回给前台做最终的处理
最后XML整体拼接
在 buildSendXml 方法中,将第一步格式化为XML的Object进行拼接。
1 | private String buildSendXml(String invokeMethod, String guid, |
- 接口无法联通后的再次重试问题
- 此篇文章写于WebService接口联合调试前,可能存在问题与风险未被发现。如果有请与我联系并进行规避。
- 如果有更好、更便捷的接口编写方案,欢迎一起讨论。