需求说明:
http接口,向远程服务器发送xml格式报文,发送成功后接收返回报文,转换成前端需要的json格式
需求样例:
请求路径:
http://url:port/接口名
请求报文:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<IN>
<META_DATA>
<APP_CODE>1123456</APP_CODE>
<CASE_NO>963852741</CASE_NO>
</META_DATA>
</IN>
返回报文:
<?xml version="1.0" encoding="UTF-8"?>
<OUT>
<HEAD>
<DOWN_LOAD ID="" NAME="">
<MESSAGE URL="/credit/2018/7/12/S2018071103923/mejrxg1xzduvspypbx3xkpg9gsqve.jpg" ID="7"
NAME="微信图片_20180206090923.jpg" />
<MESSAGE URL="/credit/2018/7/12/S2018010053923/hy8c5due78r472cixs2scoxd2zs202.jpg" ID="1"
NAME="微信图片_20180206090949.jpg" />
</DOWN_LOAD>
</HEAD>
<APPLYCODE>S201807110053923</APPLYCODE>
<ISSUCCESS>true</ISSUCCESS>
</OUT>
实现方式:
1:获取XML入参对象
- 最外层标签格式
@XmlRootElement(name="IN")
public class IN {
private META_DATA META_DATA;
private BASE_DATA BASE_DATA;
public com.sinosig.otms.litigation.image.vo.domain.META_DATA getMETA_DATA() {
return META_DATA;
}
public void setMETA_DATA(com.sinosig.otms.litigation.image.vo.domain.META_DATA META_DATA) {
this.META_DATA = META_DATA;
}
public com.sinosig.otms.litigation.image.vo.domain.BASE_DATA getBASE_DATA() {
return BASE_DATA;
}
public void setBASE_DATA(com.sinosig.otms.litigation.image.vo.domain.BASE_DATA BASE_DATA) {
this.BASE_DATA = BASE_DATA;
}
}
- 添加内部标签
@XmlRootElement(name="BASE_DATA")
public class BASE_DATA {
private String imageNo;
private String imageTypeId;
private String imageName;
public String getImageNo() {
return imageNo;
}
public String getImageTypeId() {
return imageTypeId;
}
public String getImageName() {
return imageName;
}
@XmlElement
public void setImageNo(String imageNo) {
this.imageNo = imageNo;
}
@XmlElement
public void setImageTypeId(String imageTypeId) {
this.imageTypeId = imageTypeId;
}
@XmlElement
public void setImageName(String imageName) {
this.imageName = imageName;
}
}
2:向远程服务器发送xml格式并接收返回实现
public JSONArray toPrinted(String jsonPrettyPrintString) throws JAXBException, IOException {
JAXBContext context = JAXBContext.newInstance(IN.class, META_DATA.class); // 获取上下文对象
Marshaller marshaller = context.createMarshaller(); // 根据上下文获取marshaller对象
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); // 设置编码字符集
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 格式化XML输出,有分行和缩进
// marshaller.marshal(getSimpleDepartment(), System.out); // 打印到控制台
ByteArrayOutputStream baos = new ByteArrayOutputStream();
marshaller.marshal(getSimpleDepartment(), baos);//传入参的对象拼装的xml报文
String xmlObj = new String(baos.toByteArray()); // 生成XML字符串
//System.out.println("=="+xmlObj);
CloseableHttpClient client = null;
CloseableHttpResponse resp = null;
HttpPost httpPost = new HttpPost("http接口url");
httpPost.setHeader("Content-Type", "text/xml; charset=UTF-8");
client = HttpClients.createDefault();
//发送请求获取出参数据
StringEntity entityParams = new StringEntity(xmlObj,"utf-8");
httpPost.setEntity(entityParams);
client = HttpClients.createDefault();
resp = client.execute(httpPost);
String resultMsg = EntityUtils.toString(resp.getEntity(),"utf-8");//获取出参
//System.out.println("=resultMsg="+resultMsg);//此处返回XML格式出参报文
//xml格式出参报文转json
cn.hutool.json.JSONObject xmlJSONObj = XML.toJSONObject(resultMsg);
//设置缩进
jsonPrettyPrintString = xmlJSONObj.toString();
//输出格式化后的json
// System.out.println("jsonPrettyPrintString"+jsonPrettyPrintString);
//获取指定节点的json数据
JSONObject jsonObject = JSONObject.parseObject(jsonPrettyPrintString);
JSONArray downLoadJson = jsonObject.getJSONObject("OUT").getJSONObject("HEAD").getJSONArray("DOWN_LOAD");
return downLoadJson;
}
//入参报文拼装数据
private static IN getSimpleDepartment () {
IN inn = new IN();
BASE_DATA bd = new BASE_DATA();
bd.setImageNo("V021012018173050");
bd.setImageTypeId("A0304,A020502,B0101");
inn.setBASE_DATA(bd);
return inn;
}
如果想要获取更准备节点数据,可以往下继续获取,或者循环获取数据
该博客介绍了如何通过Java实现XML格式的请求报文发送到远程服务器,并将接收到的XML返回报文转换为JSON格式。主要涉及了JAXB库用于XML对象绑定,HttpClient进行HTTP请求,以及Hutool库的XML转JSON功能。
8573

被折叠的 条评论
为什么被折叠?



