//目录结构

//看下运行效果

//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;
- }
- }
//GetMobileAddressActivity.java 控制层代码,主要实现取得数据,并设置前台展示
- package sn.len.getmbaddress;
- import java.io.InputStream;
- import sn.len.getmbaddress.service.GetMobileAddressService;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.EditText;
- import android.widget.TextView;
- public class GetMobileAddressActivity extends Activity implements OnClickListener
- {
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- View start_send=findViewById(R.id.start_send);
- start_send.setOnClickListener(this);
- }
- @Override
- public void onClick(View v)
- {
- switch(v.getId())
- {
- case R.id.start_send:
- {
- try
- {
- EditText phone_number=(EditText)findViewById(R.id.phone_number);
- TextView addressText=(TextView)findViewById(R.id.getaddress);
- String phone=phone_number.getText().toString();
- //通过类加载器得到webservicerequest.xml这个请求数据文件
- InputStream inStream=this.getClass().getClassLoader().getResourceAsStream("webservicerequest.xml");
- //利用这种就可以实现即使是静方法也可以使用类加载器
- //InputStream inStream=GetMobileAddressService.class.getClassLoader().getResourceAsStream("webservicerequest.xml");
- String address=GetMobileAddressService.getMobileAddress(inStream,phone);
- Log.i("ADDRESS", address);
- if(address!=null && !"".equals(address))
- {
- addressText.setText(address);
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }break;
- default:break;
- }
- }
- }
转自:http://blog.csdn.net/yanglian20009/article/details/7064755

浙公网安备 33010602011771号