spring boot 接口处理:
import java.util.List;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import com.xianjinxia.sms.pojo.output.BaseResponse;
import com.xianjinxia.sms.service.impl.cloudfeng.sms.util.CloudFengUtil;
import com.xianjinxia.sms.service.impl.cloudfeng.sms.xmlutil.Body;
import com.xianjinxia.sms.service.impl.cloudfeng.sms.xmlutil.Record;
import com.xianjinxia.sms.service.impl.cloudfeng.sms.xmlutil.Records;
import com.xianjinxia.sms.service.impl.cloudfeng.sms.xmlutil.XmlRemoteDto;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class AA {
/**
* yunfeng POST 方式 用的是@RequestBody 注解 参数类型是String
* @param req
* @return
*/
@PostMapping("/rpt/smsStatusPullYunFeng")
public BaseResponse<Void> smsStatusPullYunFeng(@RequestBody String msgreport) {
BaseResponse<Void> resp = new BaseResponse();
log.info("yunfeng,回调参数为={}",msgreport);
XmlRemoteDto dto = (XmlRemoteDto) CloudFengUtil.convertXmlStrToObject(XmlRemoteDto.class, msgreport);
Body body = dto.getBody();
Records records = body.getRecords();
List<Record> rec = records.getRecord();
Record record = rec.get(0);
int count = 0;
// ...............
return resp;
}
}
xml 格式的字符串 转成 Java 对象的 工具类:
import java.io.StringReader;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
public class CloudFengUtil {
/**
* 解析内容
*
* @param clazz
* @param xmlStr
* @return
*/
public static Object convertXmlStrToObject(Class clazz, String xmlStr) {
Object xmlObject = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
// 进行将Xml转成对象的核心接口
Unmarshaller unmarshaller = context.createUnmarshaller();
StringReader sr = new StringReader(xmlStr);
xmlObject = unmarshaller.unmarshal(sr);
} catch (JAXBException e) {
e.printStackTrace();
}
return xmlObject;
}
}
XML 需要转换的几个JavaBean:
XmlRemoteDto:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
最重要的就是 不要 XmlType 和 XmlRootElement 注解不要弄混了
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"head","body"})
@XmlRootElement(name="xml")
public class XmlRemoteDto {
private Head head;
private Body body;
// setter getter 方法
// toString 方法
@Override
public String toString() {
return "XmlRemoteDto [head=" + head + ", body=" + body + "]";
}
}
Head:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="head") // 当前节点名称
public class Head {
@XmlElement(name = "app_key") // 子节点名称
private String appKey;
@XmlElement(name = "time_stamp") // 子节点名称
private String timeStamp;
@XmlElement(name = "nonce_str") // 子节点名称
private String nonceStr;
@XmlElement(name = "sign") // 子节点名称
private String sign;
// setter getter 方法
// toString 方法
@Override
public String toString() {
return "Head [appKey=" + appKey + ", timeStamp=" + timeStamp + ", nonceStr=" + nonceStr + ", sign=" + sign
+ "]";
}
}
Body :
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"records"}) // 子节点
@XmlRootElement(name="body") // 当前节点
public class Body {
@XmlElement(name = "records") // 子节点名称
private Records records;
// setter getter 方法
// toString 方法
@Override
public String toString() {
return "Body [records=" + records + "]";
}
}
Records:
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"record"})
@XmlRootElement(name="records")
public class Records {
private List<Record> record;
// setter getter 方法
//toString方法
@Override
public String toString() {
return "Records [record=" + record + "]";
}
}
Record :
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="record")
public class Record {
@XmlElement(name = "mission_num")
private String missionNum;
@XmlElement(name = "dest_id")
private String destId;
@XmlElement(name = "send_status")
private String sendStatus;
@XmlElement(name = "receive_status")
private String receiveStatus;
@XmlElement(name = "batch_num")
private String batchNum;
@XmlElement(name = "stat_time")
private String statTime;
// setter getter 方法
//toString方法
@Override
public String toString() {
return "Record [missionNum=" + missionNum + ", destId=" + destId + ", sendStatus=" + sendStatus
+ ", receiveStatus=" + receiveStatus + ", batchNum=" + batchNum + ", statTime=" + statTime + "]";
}
}
如果接口参数 这种类型 我们请求处理如下:
上图中的测试的xml 原文件:
<?xml version="1.0" encoding="utf-8"?>
<xml>
<head>
<app_key>mdDve0aYHGvSNZlcke0QyA3kSZihXYdi</app_key>
<time_stamp>20181106175812</time_stamp>
<nonce_str>go9d1cjk644d7wuaa7v8g7wkijh00ie2</nonce_str>
<sign>f716b0f0463f3df7356c473da37ff449</sign>
</head>
<body>
<records>
<record>
<mission_num>verify_code20181106175707</mission_num>
<dest_id>13272661024</dest_id>
<send_status>FAIL</send_status>
<receive_status>FAIL</receive_status>
<receive_real_status>DB:9141</receive_real_status>
<batch_num>shilukj0120181106175707</batch_num>
<stat_time>2018-11-06 17:58:12</stat_time>
</record>
</records>
</body>
</xml>