这篇文章主要利用URLconnection调用webService接口,并利用dom4解析返回的数据
1.wsdl数据(访问http://localhost:8081/ERPDEMO/service/users?wsdl)
- <wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://impl.service.demo.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns2="http://schemas.xmlsoap.org/soap/http" xmlns:ns1="http://service.demo.com/" name="UserServiceImplService" targetNamespace="http://impl.service.demo.com/">
- <wsdl:import location="http://localhost:8081/ERPDEMO/service/users?wsdl=UserService.wsdl" namespace="http://service.demo.com/"></wsdl:import>
- <wsdl:binding name="UserServiceImplServiceSoapBinding" type="ns1:UserService">
- <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
- <wsdl:operation name="getPermissions">
- <soap:operation soapAction="" style="document"/>
- <wsdl:input name="getPermissions">
- <soap:body use="literal"/>
- </wsdl:input>
- <wsdl:output name="getPermissionsResponse">
- <soap:body use="literal"/>
- </wsdl:output>
- </wsdl:operation>
- <wsdl:operation name="selectByUserName">
- <soap:operation soapAction="" style="document"/>
- <wsdl:input name="selectByUserName">
- <soap:body use="literal"/>
- </wsdl:input>
- <wsdl:output name="selectByUserNameResponse">
- <soap:body use="literal"/>
- </wsdl:output>
- </wsdl:operation>
- <wsdl:operation name="login">
- <soap:operation soapAction="" style="document"/>
- <wsdl:input name="login">
- <soap:body use="literal"/>
- </wsdl:input>
- <wsdl:output name="loginResponse">
- <soap:body use="literal"/>
- </wsdl:output>
- </wsdl:operation>
- <wsdl:operation name="insert">
- <soap:operation soapAction="" style="document"/>
- <wsdl:input name="insert">
- <soap:body use="literal"/>
- </wsdl:input>
- <wsdl:output name="insertResponse">
- <soap:body use="literal"/>
- </wsdl:output>
- </wsdl:operation>
- <wsdl:operation name="getRoles">
- <soap:operation soapAction="" style="document"/>
- <wsdl:input name="getRoles">
- <soap:body use="literal"/>
- </wsdl:input>
- <wsdl:output name="getRolesResponse">
- <soap:body use="literal"/>
- </wsdl:output>
- </wsdl:operation>
- <wsdl:operation name="getUserById">
- <soap:operation soapAction="" style="document"/>
- <wsdl:input name="getUserById">
- <soap:body use="literal"/>
- </wsdl:input>
- <wsdl:output name="getUserByIdResponse">
- <soap:body use="literal"/>
- </wsdl:output>
- </wsdl:operation>
- </wsdl:binding>
- <wsdl:service name="UserServiceImplService">
- <wsdl:port binding="tns:UserServiceImplServiceSoapBinding" name="UserServiceImplPort">
- <soap:address location="http://localhost:8081/ERPDEMO/service/users"/>
- </wsdl:port>
- </wsdl:service>
- </wsdl:definitions>
2.利用soapui获得你所有方法的soap格式数据
3.开始写方法,我将调用方法和dom4j解析方法写在一起,后期再分开吧
- public static void main(String[] args) throws Exception {
- // WebService服务的地址
- URL url = new URL("http://localhost:8081/ERPDEMO/service/users?wsdl");
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- // 是否具有输入参数
- conn.setDoInput(true);
- // 是否输出输入参数
- conn.setDoOutput(true);
- // 发POST请求
- conn.setRequestMethod("POST");
- // 设置请求头(注意一定是xml格式)
- conn.setRequestProperty("content-type", "text/xml;charset=utf-8");
- String username = "csdn1";
- // 构造请求体,符合SOAP规范(最重要的)
- String requestBody = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ser=\"http://service.demo.com/\" "
- + "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
- + " <soapenv:Header/>"
- + " <soapenv:Body>"
-
- + "<ser:selectByUserName>"
- + "<userName>"
- + username
- + "</userName>"
- + "</ser:selectByUserName>"
-
- + " </soapenv:Header/>"
- + "</soapenv:Body>"
- + "</soapenv:Envelope>";
-
- // 获得一个输出流
- OutputStream out = conn.getOutputStream();
- out.write(requestBody.getBytes());
-
- // 获得服务端响应状态码
- int code = conn.getResponseCode();
- StringBuffer sb = new StringBuffer();
- if (code == 200) {
- // 获得一个输入流,读取服务端响应的数据
- InputStream is = conn.getInputStream();
- byte[] b = new byte[1024];
- int len = 0;
-
- while ((len = is.read(b)) != -1) {
- String s = new String(b, 0, len, "utf-8");
- sb.append(s);
- }
- is.close();
- }
-
- out.close();
- System.out.println("服务端响应数据为:" + sb.toString());
-
- // 初始化报文,调用parse方法,获得结果map,然后按照需求取得字段,或者转化为其他格式
- Map map = new test01().parse(sb.toString());
- // 获得字段的值;
- String email = map.get("email").toString();
- String id = map.get("id").toString();
- String password = map.get("password").toString();
- String roleid = map.get("roleid").toString();
- String username1 = map.get("username").toString();
- System.out.println("email==" + email);
- System.out.println("id==" + id);
- System.out.println("password==" + password);
- System.out.println("roleid==" + roleid);
- System.out.println("username1==" + username1);
-
- }
dom4j解析方法
- public Map<String, Object> map = new HashMap<String, Object>();
-
- /**
- * 解析soap
- *
- * @param soap
- * @return
- * @throws DocumentException
- */
- public Map parse(String soap) throws DocumentException {
- Document doc = DocumentHelper.parseText(soap);// 报文转成doc对象
- Element root = doc.getRootElement();// 获取根元素,准备递归解析这个XML树
- getCode(root);
- return map;
- }
-
- /**
- * 遍历
- *
- * @param root
- */
- public void getCode(Element root) {
- if (root.elements() != null) {
- List<Element> list = root.elements();// 如果当前跟节点有子节点,找到子节点
- for (Element e : list) {// 遍历每个节点
- if (e.elements().size() > 0) {
- getCode(e);// 当前节点不为空的话,递归遍历子节点;
- }
- if (e.elements().size() == 0) {
- map.put(e.getName(), e.getTextTrim());
- }// 如果为叶子节点,那么直接把名字和值放入map
- }
- }
-
- }
下面是返回的数据
1.soap返回的数据格式
- 服务端响应数据为:<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
- <soap:Body>
- <ns1:selectByUserNameResponse xmlns:ns1="http://service.demo.com/"><return>
- <email>111qq.com</email>
- <id>1</id>
- <password>123</password><roleid>1</roleid><username>csdn1</username>
- </return>
- </ns1:selectByUserNameResponse></soap:Body>
- </soap:Envelope>
2.dom4j解析后的结果
- email==111qq.com
- id==1
- password==123
- roleid==1
- username1==csdn1