基于SOAP的WebService协议的通信机制的接口开发

基于SOAP的WebService协议的通信机制的接口开发

技术实现要求

  1. WebService每个方法的请求和应答消息的参数,包括两个部分:RequestHeader(消息头)与Body(消息体)。其中,RequestHeader用于存储交易请求以及应答的公共部分和消息的控制数据,起到接口校验的效果;而Body包含交易请求和应答的业务数据。
  2. 具体就是要实现能通过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接口工程遇到的一些问题和解决办法, 具体情况还需要具体分析,有什么问题欢迎大家指出,有什么问题也可以一起探讨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值