最近做医保,医保的请求是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;
}
}