最近因为一些数据问题,需要跟第三方对接数据,OK!要联系方式,联系上了,然后人家就给我一个文档,说所有东西上面都有.....,没办法只能自己慢慢琢磨了!
然后发现他们是WSDL的方式调用的,百度了一下,WSDL是基于 XML 的用于描述 Web Services 以及如何访问 Web Services 的语言,以前只是知道有这么各东西,但是从来没用过,只能研究一下怎么搞了!以下只是我个人研究得一点点浅见哈,只是为了以后复习使用,有什么问题请各位指出哈!
一般拿到WSDL的接口文档以后,先得看下接口地址能不能调通,就是直接把接口地址放在浏览器里面看下能不能放文档xml文档内容。能访问到以后,就是要学会怎么看xml里面的内容了。
这个文档内容看起来很多,刚开始看的时候一头雾水,然后就是百度百度再百度,这里就直接说怎么用吧,感觉这里面有用的就最上面的xmlns对应的那一串地址以及<wsdl:types>里面的东西了,可以看到<wsdl:types>的<xs:element>里面有个name,这个就是对应的可以这个接口下面可以调用的方法了,sequence里面就是需要传入的参数。下面是java具体调用的代码
package com.zyh.car.util; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import javax.annotation.Resource; public class GetEquipMsgUtils { public static void main(String[] args) throws IOException { //第一步:创建服务地址,也就是提供的WSDL的接口地址 URL url = new URL("http://xxxxxxxxxxxxxxxx/xxxx/xxxxxxxxx?wsdl"); //第二步:打开一个通向服务地址的连接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //第三步:设置参数 //3.1发送方式设置:POST必须大写 connection.setRequestMethod("POST"); //3.2设置数据格式:content-type connection.setRequestProperty("Content-Type", "text/xml;charset=UTF-8"); //3.3设置输入输出,因为默认新创建的connection没有读写权限, connection.setDoInput(true); connection.setDoOutput(true); //第四步:组织SOAP数据,发送请求, String soapXML = getXML(方法名,参数1,参数2); //将信息以流的方式发送出去 OutputStream os = connection.getOutputStream(); os.write(soapXML.getBytes()); //第五步:接收服务端响应,打印 int responseCode = connection.getResponseCode(); if(200 == responseCode){//表示服务端响应成功 //获取当前连接请求返回的数据流 InputStream is = connection.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); StringBuilder sb = new StringBuilder(); String temp = null; while(null != (temp = br.readLine())){ sb.append(temp); } /** * 打印结果 */ System.out.println("---"+sb.toString()); try{ //对返回的数据进行JSON格式化 System.out.println(xml2Json(sb.toString())); }catch (Exception e){ e.printStackTrace(); } is.close(); isr.close(); br.close(); } os.close(); }
//请求入参 public static String getXML(String method,int begin,int end){ String soapXML = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tns=\"http://guizhou.fire.and.rescue\">" +"<soapenv:Header></soapenv:Header> " +"<soapenv:Body> " +"<tns:"+method+"> "//方法名 +"<tns:offset>"+begin+"</tns:offset>"//参数1 +"<tns:row_count>"+end+"</tns:row_count>"//参数2 +"</tns:"+method+">" +"</soapenv:Body>" +"</soapenv:Envelope>"; return soapXML; }
/** * xml转json * * @param xmlStr * @return * @throws DocumentException */ public static JSONObject xml2Json(String xmlStr) throws DocumentException { Document doc = DocumentHelper.parseText(xmlStr); JSONObject json = new JSONObject(); dom4j2Json(doc.getRootElement(), json); return json; } /** * xml转json * * @param element * @param json */ public static void dom4j2Json(Element element, JSONObject json) { List<Element> chdEl = element.elements(); for(Element e : chdEl){ if (!e.elements().isEmpty()) { JSONObject chdjson = new JSONObject(); dom4j2Json(e, chdjson); Object o = json.get(e.getName()); if (o != null) { JSONArray jsona = null; if (o instanceof JSONObject) { JSONObject jsono = (JSONObject) o; json.remove(e.getName()); jsona = new JSONArray(); jsona.add(jsono); jsona.add(chdjson); } if (o instanceof JSONArray) { jsona = (JSONArray) o; jsona.add(chdjson); } json.put(e.getName(), jsona); } else { if (!chdjson.isEmpty()) { json.put(e.getName(), chdjson); } } } else { if (!e.getText().isEmpty()) { json.put(e.getName(), e.getText()); } } } } }
然后运行,就能接收到接口的返回数据了!如果有中文乱码的话,就把编辑器以及项目的编码格式都改成UTF-8的就可以了