在开发过程中获取到了提供方的wsdl服务地址,然后在网页上能够访问wsdl文档以后,如何调用对方的webservic借口呢?
内容说明
1、WSDL文档基本说明
2、httpURLConnection方式调用
3、获取的数据用dom4j就可以解析了
WSDL文档基本说明
接口文档如下:以下是公共对外开放的查询手机号归属地的一个接口文档:
WSDL:http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
具体去这个链接看,太长就不截图了
很长接口看起来很复杂,较为繁琐。 但是作为开发人员,使用的时候, 我们可以查看关注点信息,就能实现接口的调用了!!
那么我们需要了解吗哪些信息呢?
从上面的文档里面,我们需要从头部(最上面一行)了解到:
系统的targetNamespace="http://WebXml.com.cn/"
从<wsdl:types>标签里的<s:element ></s:element>的name=“xxxxxxx”,获知该文档提供了两个方法:
getMobileCodeInfo、getDatabaseInfo(后面带Response的是对应方法的回复)
从底部的<wsdl:service name=“MobileCodeWS”></wsdl:service>标签里面,能获知<http:address location=“http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx”/>请求地址。
http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx
一般而言,知悉以上信息,你就能调用借口了。需要传参数调用的,可能在业务上需要与对方了解一下,参数的格式(数据类型,文档里是可以知晓的)
httpURLConnection方式调用
代码如下:
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;
public class WSDLTest {
public static void main(String[] args) throws IOException {
//第一步:创建服务地址 //http://ws.webxml.com.cn/
URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?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("155748093xx");
//将信息以流的方式发送出去
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());
is.close();
isr.close();
br.close();
}
os.close();
}
public static String getXML(String phone){
//http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?op=getMobileCodeInfo
String soapXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2003/XMLSchema-instance\" "
+"xmlns:web=\"http://WebXml.com.cn/\" "
+"xmlns:xsd=\"http://www.w3.org/2003/XMLSchema\" "
+"xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+"<soap:Body>"
+"<getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">"
+"<mobileCode>"+phone+"</mobileCode>"
// +"<userID>"+phone+"</userID>"
+"</getMobileCodeInfo>"
+"</soap:Body>"
+"</soap:Envelope>";
return soapXML;
}
}
说明 :
一般的HTTP请求大部分都是相同的,但是由于webservice是基于soap协议的,所以,请求时的文本格式需要设置好。
文中的soapXML信息,需要注意xmlns:web=“tns” 这个xml命名空间, 这个空间是依据wsdl文档里的头部NameSpace信息,确定的
程序会依据这个名称,检索到该文档里面的方法,譬如:
<web: getDatabaseInfo> 获取getDatabaseInfo方法 (web是xmlns的名字,可以自定义,相当于“id”)