SOAP协议:简单对象访问协议(Simple Object Access Protocol)是一种轻量的、简单的、基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息。
在Android上使用SOAP协议比较常用的方式是第三方的库,比如:kSOAP 2:http://ksoap2.sourceforge.net。
下面给出一个使用OutputStreamWriter实现的SOAP协议,比较简单,直接上主要代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
public class SopaObject {
private String nameSapce = null;
private String method = null;
private StringBuffer soapXmlOut = null;
private StringBuilder soapXmlIn = null;
private HashMap<String, String> headMap = null;
private HashMap<String, String> bodyMap = null;
private String responseCode = null;
private String responseMessage = null;
public SopaObject(String nameSapce, String method) {
this.nameSapce = nameSapce;
this.method = method;
headMap = new HashMap<String, String>();
bodyMap = new HashMap<String, String>();
soapXmlOut = new StringBuffer();
soapXmlOut.append("<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">");
}
public void setSoapHead(HashMap<String, String> headMap) {
this.headMap = headMap;
}
public void setSoapBody(HashMap<String, String> bodyMap) {
this.bodyMap = bodyMap;
}
public void request(String urlPath) {
try {
URL url = new URL(urlPath);
URLConnection connection = url.openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Pragma:", "no-cache");
connection.setRequestProperty("Cache-Control", "no-cache");
connection.setRequestProperty("Content-Type", "text/xml");
OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
// Head
Object[] headKeys = headMap.keySet().toArray();
soapXmlOut.append("<soap:Header><Credentials xmlns=\"" + nameSapce + "\">");
for (Object key : headKeys) {
soapXmlOut.append("<" + key + ">" + headMap.get(key) + "</" + key + ">");
}
soapXmlOut.append("</Credentials></soap:Header>");
// Body
Object[] bodyKeys = bodyMap.keySet().toArray();
soapXmlOut.append("<soap:Body><" + method + " xmlns=\"" + nameSapce + "\">");
for (Object key : bodyKeys) {
soapXmlOut.append("<" + key + ">" + bodyMap.get(key) + "</" + key + ">");
}
soapXmlOut.append("</" + method + "></soap:Body>");
soapXmlOut.append("</soap:Envelope>");
// Send
out.write(new String(soapXmlOut.toString().getBytes("UTF-8")));
// Flush and close
out.flush();
out.close();
// Get response
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
soapXmlIn = new StringBuilder();
String line = null;
for (line = bufferedReader.readLine(); line != null; line = bufferedReader.readLine()) {
soapXmlIn.append(line);
}
System.out.println("wangleyiang:" + soapXmlIn.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试一下,使用一个基于WebService的气象服务:http://www.webservicex.net/globalweather.asmx,测试代码如下:
SopaObject object = new SopaObject("http://www.webservicex.net", "GetCitiesByCountry");
HashMap<String, String> map = new HashMap<String, String>();
map.put("CountryName", "China");
object.setSoapBody(map);
object.request("http://www.webservicex.net/globalweather.asmx");
SoapObject的方法比较少,意思比较明确,就不做说明了!:)