1.其实这个也没什么说的,webservice经常用到的 直接把代码贴出来了。
前面说的那么多,应用程序嘛,现在都和网络打交道的,特此贴出来 android 和 webservice打交道= =, http协议也是一定要学好的呢。
需要用到1个jar 包 ksoap2-android-assembly-3.0.0-jar-with-dependencies,链接 http://download.csdn.net/detail/kongbaidepao/6603281
这个遵循的是 soap协议,至于soap协议是什么,想详细了解下的就搜搜把,资料一大把。
简单说一下就是 :简单对象访问协议(simple object access protocol),可以让不同的应用程序透过 http 协定好,进行数据的交换。就好比 你要访问我的webservice
我不管你的前端是用什么 语言写的 只要你遵循我的规定,给我一个xml,这样我就可以按照你的要求给你相应的生成数据,返回1个数据给你。 至于怎么解析是你自己语言事。
smtp 和 http协议都可以传输 soap消息。
public class AndroidWebService{
/**
* @param nameSpace 命名空间
* @param wsurl 访问的网址
* @param doMethod 方法名
* @param List 需要给的参数list
* @return
*/
public static SoapObject GetWebServiceData(String nameSpace,String wsurl, String doMethod, List<WebParameter> List){
// String resultInfo = "";
// 1.定义必要的常量
SoapObject result = null;
String soapAction = nameSpace + doMethod;
// 2.得到KSOAP2的核心对象,并将参数传递给SoapObject
String wsurl1 = wsurl + "?wsdl";
SoapObject request = new SoapObject(nameSpace, doMethod);
if (List != null){
for (WebParameter WebParameter : List){
request.addProperty(WebParameter.parameter, WebParameter.value);
}
}
// 3.造信封
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut = request;// 将含有参数的SoapObject装到信封里面
//声明一下服务器是.net做的
envelope.dotNet = true;
//4造一条通向目的地的大路 设置超时时间 10秒
HttpTransportSE se = new HttpTransportSE(wsurl1,1000 * 10);
se.debug = true;
try{
/**
* 5.进行通信
* 将信封发送出去,并且将对方返回的信息同样装到信封里面,然后寄回,
* 此时信封里面携带了需要的结果数据
*/
se.call(soapAction, envelope);
if (envelope.getResponse() != null){
// 判断一下返回的信息是否到达本地,如果到达,则从信封里面取出结果
result = (SoapObject) envelope.getResponse();// 取出结果,放的时候是SoapObject对象,取的时候同样是SoapObject对象
}
} catch (Exception e){
e.printStackTrace();
}
return result;
}
}
WebParameter.java
//参数
public class WebParameter{
public String parameter;
public String value;
public WebParameter(String parameter, String value){
this.parameter = parameter;
this.value = value;
}
}
返回来1个 soap 对象然后就可以自己解析到数据了
public class FormatGetCheckTable {
public static object format(SoapObject object) {
for (int i = 0; i < object.getPropertyCount(); i++) {
SoapObject property = (SoapObject) object.getProperty(i);
//.....................................................................
}
return object;
}
}
2. 当你不用jar的时候也可以。那就我上面解释说的了,要自己按照人家的要求给生成一个相应的 xml文件,人家看到了解析了才能给你返回相应的数据。
好了代码:
你自己这边的xml。照着上面我的截图直接 copy过来就好了 加个占位符。
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<getMobileCodeInfo xmlns="http://WebXml.com.cn/">
<mobileCode>$mobile</mobileCode>
<userID></userID>
</getMobileCodeInfo>
</soap12:Body>
</soap12:Envelope>
获取手机号的代码:
其实就是把 上面的xml的占位符 换成 你的手机号,然后把xml传过去。然后解析人家给你返回来的xml数据
public class GetAddressService {
public static String getAddress(String mobileNum) throws Exception{
String soap = readSoap();
// 特殊字符 要转义一下
soap = soap.replaceAll("\\$mobile", mobileNum);
byte[] entity = soap.getBytes();
String path = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";
HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
conn.setRequestProperty("Content-Length", String.valueOf(entity.length));
conn.getOutputStream().write(entity);
if(conn.getResponseCode() == 200){
return parseSOAP(conn.getInputStream());
}
return null;
}
/** 这个是返回来的格式 上面也截图了呢 **/
private static String parseSOAP(InputStream xml)throws Exception{
XmlPullParser pullParser = Xml.newPullParser();
pullParser.setInput(xml, "UTF-8");
int event = pullParser.getEventType();
//这里是 pull 解析
while(event != XmlPullParser.END_DOCUMENT){
switch (event) {
case XmlPullParser.START_TAG:
if("getMobileCodeInfoResult".equals(pullParser.getName())){
return pullParser.nextText();
}
break;
}
event = pullParser.next();
}
return null;
}
private static String readSoap() throws Exception{
InputStream inStream = GetAddressService.class.getClassLoader().getResourceAsStream("soap.xml");
byte[] data = StreamRead.read(inStream);
return new String(data);
}
}
//这就是把数据读到。
public class StreamRead {
public static byte[] read(InputStream inStream) throws Exception{
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] bb = new byte[1024];
int len = 0;
while( (len = inStream.read(bb)) != -1){
outputStream.write(bb, 0, len);
}
inStream.close();
return outputStream.toByteArray();
}
}