Wondercease

浙ICP备2022017321号

spring boot中使用xml请求

最近做医保,医保的请求是xml请求,很少用到记录一下:

他给的例子类似于下面这种

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.springframework.stereotype.Component;

import javax.xml.namespace.QName;


@Component
public class WebServiceInvokeUtil {
    /**
     *
     * @param object  拼装报文传入的实体类
     * @param msgNo   是此示例中拼装报文工具类方法中需要传的参数
     * @param URL  请求路径
     * @param methodName  接口方法名
     * @param namepaceURL 命名空间
     * @param timeout
     * @param ticket  是此示例中拼装报文工具类方法中需要传的参数
     * @return
     * @throws Exception
     */
    public String invoke(Object object , String msgNo, String URL, String methodName, String namepaceURL, long timeout, String ticket) throws Exception {
        String rspXmlStr ="";
        String reqXmlStr="";
        RPCServiceClient sender=null;
        try {
            EndpointReference targetEPR = new EndpointReference(URL);//指定webservice接口地址
            QName qname = new QName(namepaceURL,methodName);//设置命名空间和调用的方法名
            sender = new RPCServiceClient();//创建远程调用接口的RPC(RPCServiceClient)对象
            Options options = sender.getOptions();
            options.setTimeOutInMilliSeconds(timeout);//超时时间20s
            options.setTo(targetEPR);//设置接口的调用地址
            Class<?>[] types = new Class[]{String.class};  //这是针对返值类型的设置

            /*  此处是使用工具类江传入的参数实体转换成请求的XML字符串 reqXmlStr */
            RequestInfo<?> r = BasicUtils.createRequestInfo(object,msgNo);
            reqXmlStr = BasicUtils.getXmlFromRequestInfo(r);

            Object[] param = new Object[]{reqXmlStr};//设置请求报文
            Object[] response1 = sender.invokeBlocking(qname, param, types);
            rspXmlStr  =  (String) response1[0];

        } catch (AxisFault e) {
            e.printStackTrace();
        }
        return  rspXmlStr;
    }
}


public class BasicUtils {
    private static String XML_TAG = "<?xml version='1.0' encoding='UTF-8'?>";
    /**
     * RequestInfo 转 xml
     * @param r  ResultInfo 基础库实体
     * @param clazz data所属实体
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static <T> String getXmlFromRequestInfo(RequestInfo r,Class<T> clazz) {
        XStream xStream = new XStream(new Xpp3Driver(new NoNameCoder()));
        xStream.alias("ROOT", r.getClass());
        xStream.aliasSystemAttribute(null, "class");
        return addHeaderByXml(xStream.toXML(r));
    }

    public static <T> String getXmlFromRequestInfo(RequestInfo r) {
        XStream xStream = new XStream(new Xpp3Driver(new NoNameCoder()));
        xStream.alias("ROOT", r.getClass());
        xStream.aliasSystemAttribute(null, "class");
        return addHeaderByXml(xStream.toXML(r));
    }
    /**
     * 添加消息头至xml
     * @param  xml
     * @return
     */
    public static String addHeaderByXml(String xml) {
        StringBuffer buff=new StringBuffer();
        buff.append(XML_TAG);
        buff.append("\r\n"+xml);
        return buff.toString();
    }

    /**
     * xml to json
     * @param xml
     * @return
     */
    public static String xml2json(String xml) {
        return XML.toJSONObject(xml).toString();
    }


    /**
     *   初始化数据中心webservice请求头信息
     * @param ticket
     * @return
     */
    public static Head initHead( String msgNo) {
        Head head = new Head();
        head.setREQTIME("2019-12-31");
        head.setMSGID(getMsgId());
        head.setMSGNO(msgNo);//
        return head;
    }

    /**
     * @param obj datalist数据,非list
     * 创建数据中心webservice请求格式
     * @return
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static RequestInfo createRequestInfo(Object obj,String msgNo) {
        RequestInfo r = new RequestInfo<>();
        r.setHEAD(initHead(msgNo));
        r.setCONTENT(obj);
        return r;
    }

    /**
     * 生成流水号
     * @return
     */
    private static String getMsgId(){
        LocalDateTime date = LocalDateTime.now();
        System.out.println("当前日期=" + date);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddhhmmssSSS");
        System.out.println(date.format(formatter));
        return "36000000"+date.format(formatter);
    }

    /**
     * 拼装需要的xml格式
     * @param obj
     * @param ticket
     * @param msgNo
     * @return
     */
    public static String getXmlFromObj(Object obj,String ticket,String msgNo){
        RequestInfo<?> r = createRequestInfo(obj,msgNo);
        String xml = getXmlFromRequestInfo(r);
        return xml;
    }
}

发表评论

您的电子邮箱地址不会被公开。