最近项目上遇到了一个需要对接客户Soap系统,查看他们C#源码发现格式如下,与之前用过的Xml数据还不太一样,于是又研究了下如何封装。
请求数据
String sendMsg="<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
" <soap:Body>\n" +
" <GetUserInfo xmlns=\"http://tempuri.org/\">\n" +
" <code>103431</code>\n" +
" <pwd>19</pwd>\n" +
" </GetUserInfo>\n" +
" </soap:Body>\n" +
"</soap:Envelope>";
请求方法
/**
* 拼接请求体
* @param table 表面
* @param fields 参数键值对 name:key value:value
* @return 拼接后xml
*/
public static String requestWeb(String table, Map<String, String> fields) {
String fieldsMsg = "";
for (Map.Entry<String, String> entry : fields.entrySet()) {
fieldsMsg += "<" + entry.getKey() + ">" + entry.getValue() + "</" + entry.getKey() + ">";
}
String sendMsg = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
" <soap:Body>\n" +
" <" + table + " xmlns=\"http://tempuri.org/\">\n" +
fieldsMsg +
" </" + table + ">\n" +
" </soap:Body>\n" +
"</soap:Envelope>";
return sendMsg;
}
//表名
String table="GetUserInfo";
Map<String, String> fields = new HashMap<>();
//参数
fields.put("code", username);
fields.put("pwd", password);
String sendMsg = SoapUtils.requestWeb(table, fields);
//发送请求时需要加上.mediaType(MediaType.parse("text/xml; charset=utf-8"))
解析数据使用 dom4j
有两种数据格式,单数据(如获取用户信息),列表数据(获取单据信息)
/**
* 解析SOAP返回数据
* @param response 数据源
* @param table 表名
* @return Map;空数据返回null
* 单数据形式
* <XXResponse>
* <XXResult>
* <ID></ID>
* <NAME></NAME>
* </XXResult>
* </XXResponse>
*/
public static Map<String, String> responseWeb(String response, String table) {
//创建Reader对象
SAXReader reader = new SAXReader();
//加载xml
Document document = null;
Map<String, String> request = new HashMap();
try {
//获取数据流
InputStream is = new ByteArrayInputStream(response.getBytes());
document = reader.read(is);
} catch (DocumentException e) {
e.printStackTrace();
}
//获取根节点
Element rootElement = document.getRootElement();
Iterator iterator = rootElement.elementIterator();
while (iterator.hasNext()) {
request = new HashMap();
Element stu = (Element) iterator.next();
//判断节点是否为Result 如果不是则向下遍历
while (!stu.getName().equals((table + "Result"))) {
if (stu.elementIterator().hasNext()) {
stu = stu.elementIterator().next();
}else {
return null;
}
}
// List<Attribute> attributes = stu.attributes();
// System.out.println("======获取属性值======");
// for (Attribute attribute : attributes) {
// System.out.println(attribute.getValue());
// }
Log.d(TAG, "responseWeb: ======遍历子节点======");
Iterator iterator1 = stu.elementIterator();
while (iterator1.hasNext()) {
Element stuChild = (Element) iterator1.next();
Log.d(TAG, "节点名:" + stuChild.getName() + "---节点值:" + stuChild.getStringValue());
request.put(stuChild.getName(), stuChild.getStringValue());
}
}
return request;
}
/**
* 解析SOAP返回数据
*
* @param response 数据源
* @param table 表名
* @return List Map;空数据返回null
* list数据形式
* <XXResponse>
* <XXResult>
* <T_XX_XX>
* <ID></ID>
* <NAME></NAME>
* </T_XX_XX>
* <T_XX_XX>
* <ID></ID>
* <NAME></NAME>
* </T_XX_XX>
* </XXResult>
* </XXResponse>
*/
public static List<Map<String, String>> responseWebList(String response, String table) {
//创建Reader对象
SAXReader reader = new SAXReader();
//加载xml
Document document = null;
List<Map<String, String>> requestList = new ArrayList<>();
Map<String, String> request = new HashMap();
try {
//获取数据流
InputStream is = new ByteArrayInputStream(response.getBytes());
document = reader.read(is);
} catch (DocumentException e) {
e.printStackTrace();
}
//获取根节点
Element rootElement = document.getRootElement();
Iterator iterator = rootElement.elementIterator();
while (iterator.hasNext()) {
Element stu = (Element) iterator.next();
//判断节点是否为Result 如果不是则向下遍历
while (!stu.getName().equals((table + "Result"))) {
if (stu.elementIterator().hasNext()) {
stu = stu.elementIterator().next();
} else {
return null;
}
}
// List<Attribute> attributes = stu.attributes();
// System.out.println("======获取属性值======");
// for (Attribute attribute : attributes) {
// System.out.println(attribute.getValue());
// }
Log.d(TAG, "responseWebList: ======遍历子节点======");
Iterator iterator1 = stu.elementIterator();
while (iterator1.hasNext()) {
Element stuChild = (Element) iterator1.next();
if (stuChild.elementIterator().hasNext()) {
Log.d(TAG, "responseWebList: ======遍历孙节点======");
Iterator iterator2 = stuChild.elementIterator();
request = new HashMap();
while (iterator2.hasNext()) {
Element stuSon = (Element) iterator2.next();
Log.d(TAG, "节点名:" + stuSon.getName() + "---节点值:" + stuSon.getStringValue());
request.put(stuSon.getName(), stuSon.getStringValue());
}
}
requestList.add(request);
}
}
return requestList;
}