Web Service 学习总结(二)

现在有很多公共的Web Service,比如手机号码归属地查询、天气预报查询等,我们可以通过其提供的WSDL文档来调用Web Service。

WSDL文档

URL的后面加上’?wsdl’就可以查看WSDL文档。以手机号码归属地查询为例。http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

看上去像XML文档。

从wsdl:types标签里,可以看到这个Web Service提供的方法:getMobileCodeInfo和getDatabaseInfo。从底部的wsdl:service 标签(name=”MobileCodeWS”)能知道请求地址:http:address location=”http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx”

根据WSDL调用Web Service

以Java为例,如果只使用JDK的Jar包,需要5步就能获得WS返回的数据。

第一步:创建服务地址

URL url = new URL(“http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl”);

第二步:打开一个通向服务地址的连接

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

第三步:设置参数

connection.setRequestMethod("POST");  //发送方式设置:POST必须大写
connection.setRequestProperty("content-type", "text/xml;charset=utf-8");
//设置输入输出,因为默认新创建的connection没有读写权限,
connection.setDoInput(true);
connection.setDoOutput(true);

第四步:组织SOAP数据,发送请求

String soapXML = getMobileCodeInfoXML("12345678910");
// 将信息以流的方式发送出去
OutputStream os = connection.getOutputStream();
os.write(soapXML.getBytes());

public static String getMobileCodeInfoXML(String phone) {

	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>"
				+ "<web:getMobileCodeInfo>" 
				+ phone 
				+ "</web:getMobileCodeInfo>" 
				+ "</soap:Body>" 
				+ "</soap:Envelope>";
	return soapXML;
}

第五步:接收服务端响应,打印

int responseCode = connection.getResponseCode();
if (200 == responseCode) {// 200:表示服务端响应成功
	// 获取当前连接请求返回的数据流
	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);
	}

	//打印结果(XML格式的字符串)
	System.out.println(sb.toString());

	
	is.close();
	isr.close();
	br.close();
}
os.close();

按照上面的5步,不需要导入其他Jar包就可以调用WS。不过缺点很明显,SOAP协议是以XML的方式交换数据的。请求需要自己拼接XML,响应也需要额外代码来解析XML。