Android 利用Soap协议查询电话号码归属地
Android 利用Soap协议查询电话号码归属地
//目录结构
//webservicerequest.xml
这个是内容是http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?op=getMobileCodeInfo SOPA 1.2的请求部份内容,至于那些main.xml strings.xml很简单的自己写就行了。
- <?xml version="1.0" encoding="utf-8"?>
- <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>#phone</mobileCode>
- <userID></userID>
- </getMobileCodeInfo>
- </soap12:Body>
- </soap12:Envelope>
//响应部份主要是你通过HTTP请求过后,如果成功的话服务器端会给你发送XML响应数据。自己并通过程序解析即使获得响应值。也就是响应部份的<>string<>这个值
//GetMobileAddressService.java 业务的Service类,主要实现SOAP 协议的电话号码查询
- package sn.len.getmbaddress.service;
- import java.io.ByteArrayOutputStream;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.HttpURLConnection;
- import java.net.URL;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- import org.xmlpull.v1.XmlPullParser;
- import Android.util.Log;
- import android.util.Xml;
- public class GetMobileAddressService
- {
- //1,向webService发送XML请求数据参数
- public static String getMobileAddress(InputStream inStream,String phone) throws Exception
- {
- //返回的是一个输入流对象,所以要把inStream转换成二进制数据,写一个StreamToByte方法,以便以后使用
- byte reqeustByte[]=StreamToByte(inStream);
- //既然已经得到了xml的byte数据,则要把它变成String类型,再用正则把里面的电话电话号码给替换掉
- String requestXmlData=new String(reqeustByte);
- //写一个正则方法replacePhone()去替换内容。
- String replaced=replacePhone(requestXmlData,phone);
- byte replacedByte[]=replaced.getBytes();
- Log.i("REGCONTENT", replaced);
- //建立URL链接,向服务器端发送内容实体数据
- URL url=new URL("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx");
- HttpURLConnection conn=(HttpURLConnection)url.openConnection();
- conn.setRequestMethod("POST");
- conn.setReadTimeout(5*1000);
- conn.setDoOutput(true);
- //设置HTTP协议的数据请求类型和数据长度
- conn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
- conn.setRequestProperty("Content-Length", String.valueOf(replacedByte.length));
- //把XML数据向服务器端写入
- OutputStream outStream=conn.getOutputStream();
- outStream.write(replacedByte);
- outStream.flush();
- outStream.close();
- String address=null;
- Log.i("CODE",conn.getResponseCode()+"");
- //如果写入成功,服务器端会给你返回一个以XML文件保存的响应数据给你
- if(conn.getResponseCode()==200)
- {
- InputStream responeInStream=conn.getInputStream();
- //写一个方法parserResponseXML(),用PULL解析这个XML文档
- address=parserResponseXML(responeInStream);
- }
- return address;
- }
- //把流转换成二进制数据
- public static byte[] StreamToByte(InputStream inStream) throws Exception
- {
- byte casebyte[]=new byte[1024];
- ByteArrayOutputStream byteOutStream=new ByteArrayOutputStream();
- int n=0;
- while((n=inStream.read(casebyte))!=-1)
- {
- byteOutStream.write(casebyte,0,n);
- }
- inStream.close();
- byteOutStream.close();
- return byteOutStream.toByteArray();
- }
- //接收响应的数据并解析
- public static String parserResponseXML(InputStream responseInStream) throws Exception
- {
- XmlPullParser pullParser=Xml.newPullParser();
- pullParser.setInput(responseInStream, "utf-8");
- int evenType=pullParser.getEventType();
- String responseValue=null;//响应值
- while(evenType!=XmlPullParser.END_DOCUMENT)
- {
- switch(evenType)
- {
- case XmlPullParser.START_TAG:
- {
- String tag_name=pullParser.getName();
- if("getMobileCodeInfoResult".equals(tag_name))
- {
- responseValue=pullParser.nextText();
- return responseValue;
- }
- }break;
- default:break;
- }
- evenType=pullParser.next(); //NND检查了好久。。。
- }
- return null;
- }
- public static String replacePhone(String requestXmlData,String phone)
- {
- //预编译正则表达示,也就是你想要替换的内容xml里面的#phone
- Pattern p=Pattern.compile("\\#phone");
- //把整个XML的数据与正则匹配,并把比对后值存放在m适配器中
- Matcher m=p.matcher(requestXmlData);
- //因为第一个XML可能节点匹配找到匹配的,所以要向下寻找,继续匹配
- if(m.find())
- {
- requestXmlData=m.replaceAll(phone);
- }
- return requestXmlData;
- }
- }
|
评论暂时关闭