Java学习之SoapUI报文发送和解析
SoapUI工具测试
1、新建项目
2、编写名称和填写url路径,点击Ok
测试url:http://www.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx?wsdl
这是个测试获取电视节目的url
3、软件会自动创建demo,所以可以直接打开报文demo组装信息
Java代码实现
1、组装报文
public static String getMessage() { StringBuffer buff = new StringBuffer(); buff.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"http://WebXml.com.cn/\">"); buff.append("<soapenv:Header/>"); buff.append("<soapenv:Body>"); buff.append("<web:getAreaString/>"); buff.append("</soapenv:Body>"); buff.append("</soapenv:Envelope>"); return buff.toString(); }
2、发送并接收请求
补充:需要pom.xml中引入“dom4j”的依赖
<dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency>
public class RequestUtil { private final static String REQUEST_METHOD = "POST"; public static Document sendRequest(String url, String message) { URL connect; HttpURLConnection connection = null; Document resDoc = null; if (StringUtils.isEmpty(url)) { return null; } try { connect = new URL(url); connection = (HttpURLConnection) connect.openConnection(); connection.setRequestMethod(REQUEST_METHOD); connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false);// post请求不能使用缓存 //设置连接超时时间 connection.setConnectTimeout(2000); connection.setReadTimeout(10000); connection.setInstanceFollowRedirects(true); connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); connection.setRequestProperty("Content-Type", "text/xml; charset=utf-8"); OutputStreamWriter outParam = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); outParam.write(message); outParam.flush(); outParam.close(); InputStream responseIn = connection.getInputStream(); SAXReader reader = new SAXReader(); resDoc = reader.read(responseIn); return resDoc; } catch (Exception e) { log.info(e.getMessage()); } finally { connection.disconnect(); } return resDoc; } }
3、解析返回报文
public class SoapService { public void getSoapResponse() { String message = RequestUtil.getMessage(); String url = "http://www.webxml.com.cn/webservices/ChinaTVprogramWebService.asmx?wsdl"; Document document = UrlSendUtil.sendRequest(url, message); List<Element> elementList1 = document.getRootElement().elements(); for (Element element1 : elementList1) { List<Element> elementList2 = element1.elements(); for (Element element2 : elementList2) { List<Element> elementList3 = element2.elements(); for (Element element3 : elementList3) { List<Element> elementList4 = element3.elements(); for (Element element4 : elementList4) { System.out.println(element4.getName() + " - " + element4.getStringValue()); } } } } } public static void main(String[] args) { SoapService soapService = new SoapService(); soapService.getSoapResponse(); } }
结果
string - -4@数字电视@数字 string - -3@海外电视@海外 string - -2@卫星电视@卫星 string - -1@中央电视@中央 string - 1@北京市@华北地区 string - 2@天津市@华北地区 string - 3@河北省@华北地区 string - 4@山西省@华北地区 string - 5@内蒙古自治区@华北地区 string - 6@辽宁省@东北地区 string - 7@吉林省@东北地区 string - 8@黑龙江省@东北地区 string - 9@上海市@华东地区 string - 10@江苏省@华东地区 string - 11@浙江省@华东地区 string - 12@安徽省@华中地区 string - 13@福建省@华南地区 string - 14@江西省@华中地区 string - 15@山东省@华东地区 string - 16@河南省@华中地区 string - 17@湖北省@华中地区 string - 18@湖南省@华中地区 string - 19@广东省@华南地区 string - 20@广西壮族自治区@华南地区 string - 21@海南省@华南地区 string - 22@重庆市@西南地区 string - 23@四川省@西南地区 string - 24@贵州省@西南地区 string - 25@云南省@西南地区 string - 26@西藏自治区@西南地区 string - 27@陕西省@西北地区 string - 28@甘肃省@西北地区 string - 29@青海省@西北地区 string - 30@宁夏回族自治区@西北地区 string - 31@新疆维吾尔自治区@西北地区 string - 32@香港@港澳台地区 string - 33@澳门@港澳台地区 string - 34@台湾省@港澳台地区
补充:因为返回结果不同,而且是从rootElement解析,所以可以写个递归方法,例如:
public List<Element> getSoapUIResponse(List<Element> elements) { for (Element element : elements) { if ("string".equals(element.getName())) {//取什么节点的值根据实际业务确定 return element.elements(); } return getSoapUIResponse(element.elements()); } return null; }