基于SOAP的WebService协议的通信机制的接口开发
技术实现要求
- WebService每个方法的请求和应答消息的参数,包括两个部分:RequestHeader(消息头)与Body(消息体)。其中,RequestHeader用于存储交易请求以及应答的公共部分和消息的控制数据,起到接口校验的效果;而Body包含交易请求和应答的业务数据。
- 具体就是要实现能通过SOAI UI工具进行报文的模拟请求和响应。
3.基础框架 Spring集成WebService CXF
具体实现
实现方法一
最直观的方法就是可以直接使用字符串对报文进行拼接和截取,可以通过输入的拦截器拦截请求报文,将输入流转换成字符串,再提取字符串字段中的内容,入库,再拼接对应的响应报文格式的字符串输出响应。
下面提供输入拦截器的相关代码,输出的也类似,网上应该都可以查找到相应资料。(报文实质上也是字符串,可以把它当作字符串来做处理)
过滤器参考代码:
public void handleMessage(Message message) throws Fault {
InputStream is = message.getContent(InputStream.class);
if (is != null) {
try {
String str = IOUtils.toString(is);
int index = str.indexOf("<xsd:labelInfo>");
System.out.println(index);
// 原请求报文
LOG.info("====> 请求原文 xml=\r\n" + str);
LOG.info("====> 替换后 xml=\r\n" + str);
InputStream ism = new ByteArrayInputStream(str.getBytes());
message.setContent(InputStream.class, ism);
} catch (IOException e) {
e.printStackTrace();
}finally{
if(is != null){
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
具体可以在Spring配置文件中添加拦截器配置
实现方法二
方法一实质上就是纯字符串的拼接和解析,当然你也可以通过一些xml和pojo的工具类来实现对报文的请求和相应,具体可以参考以下的代码。
如果采用的是JaxbXmlUtil工具类来实现pojo转成xml可以参考我如下JavaBean的书写格式
@XmlAttribute是xml表空间的头部
@XmlElement是xml的元素(具体使用方法可以自行百度)
一层一层的嵌套下去,这样子的XML转换出来就会生成一个树形的结构。
(其它字段没有全部列出)
JaxbXmlUtil工具类部分参考代码:
public static final String DEFAULT_ENCODING = "UTF-8";
/**
* pojo转换成xml 默认编码UTF-8
*
* @param obj 待转化的对象
* @return xml格式字符串
* @throws Exception JAXBException
*/
public static String convertToXml(Object obj) throws Exception {
return convertToXml(obj, DEFAULT_ENCODING);
}
/**
* pojo转换成xml
*
* @param obj 待转化的对象
* @param encoding 编码
* @return xml格式字符串
* @throws Exception JAXBException
*/
public static String convertToXml(Object obj, String encoding) throws Exception {
String result = null;
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
// 指定是否使用换行和缩排对已编组 XML 数据进行格式化的属性名称。
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
StringWriter writer = new StringWriter();
marshaller.marshal(obj, writer);
result = writer.toString();
return result;
}
/**
* xml转换成JavaBean
*
* @param xml xml格式字符串
* @param t 待转化的对象
* @return 转化后的对象
* @throws Exception JAXBException
*/
@SuppressWarnings("unchecked")
public static <T> T convertToJavaBean(String xml, Class<T> t) throws Exception {
T obj = null;
JAXBContext context = JAXBContext.newInstance(t);
Unmarshaller unmarshaller = context.createUnmarshaller();
obj = (T) unmarshaller.unmarshal(new StringReader(xml));
return obj;
}
实现方法三
当然如果给你的需求方能直接给你提供WebService的WSDL文件,那简直不要太好了,那意味着你的开发将事倍功半。。
WSDL可以反向生成WebService服务端
具体参考这个大神的方法https://blog.csdn.net/jiandanfeng2/article/details/53439748
只要思想不滑坡,办法总比困难多。
以上是我在开发WebService接口工程遇到的一些问题和解决办法, 具体情况还需要具体分析,有什么问题欢迎大家指出,有什么问题也可以一起探讨。