• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

匪徒在线的博客

路漫漫其修远兮,吾将上下而求索。
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

初识安卓之从web服务器上获取资源显示到手机,实现手机归属地查询功能

主界面上负责显示的代码

public class MainActivity extends Activity {
    private EditText numET;
    private TextView addressTV;
 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        
        numET = (EditText) findViewById(R.id.numET);
        addressTV = (TextView) findViewById(R.id.addressTV);
    } 
    点击查询按钮时,执行请求  
    public void query(View view) {
        try {
            //获取用户输入的电话号码
            String num = numET.getText().toString();
            //拿着这个电话号码去访问归属地服务器
            QueryService service = new QueryService();
            //服务器返回一个结果值
            String address = service.query(num);
            //把结果值设置到对应文本控件上给客户看
            addressTV.setText(address);
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(this, "服务器忙!", 0).show();
        }
    }
}
 
以下为负责具体请求的服务层代码
public class QueryService {
 
    public String query(String num) throws Exception {
//将准备好的存在本地磁盘上的,要发给服务器的xml文件(内含一个占位符phoneNum,后面要被替换为用户输入的待查询电话号码),加载到输入流中
        InputStream in = QueryService.class.getClassLoader().getResourceAsStream("template.xml");        
//利用工具类将输入流转为含有xml中所有内容的字符串data(xml文件->流->xml字符串),便于进行文本替换
        String data = new String(Util.read(in));    
        in.close();
        //将xml字符串中的占位符替换成待查询的电话号码
        data = data.replace("phoneNum", num);    
        
        //创建要请求的服务器网址对象,将xml字符串作为正文内容发给服务器
        URL url = new URL("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx");        
        //打开链接,开始请求
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(3000);
        
        //必须设置的请求头
        conn.setRequestMethod("POST");        
        conn.setRequestProperty("Host", "webservice.webxml.com.cn");
        conn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
        conn.setRequestProperty("Content-Length", data.getBytes().length + "");
        conn.setDoOutput(true);
        //发出!
        conn.getOutputStream().write(data.getBytes());
        
        //获取服务器的响应:
        int code = conn.getResponseCode();
        if (code == 200) {
            //解析服务器发以流的形式发回来的xml,得到归属地结果
            return parseAddress(conn.getInputStream());        
        }
        throw new NetworkErrorException("服务器出错: " + code);
    }
    //接收服务器返回的xml型的流文件
    private String parseAddress(InputStream inputStream) throws Exception {
        //创建pull解析对象
        XmlPullParser parser = Xml.newPullParser();
        //将服务器返回的流交给解析器,并告知解析器按照utf-8将流解析成字符串
        parser.setInput(inputStream, "UTF-8");
        //只要没读到结束文档的标签,就不停的向下一个标签进行解析
        for (int type = parser.getEventType(); type != XmlPullParser.END_DOCUMENT;
 type = parser.next()) {
            //精准定位名字为"getMobileCodeInfoResult"的开始标签,获取标签名:parser.getName()
            if (type == XmlPullParser.START_TAG && 
parser.getName().equals("getMobileCodeInfoResult")) {
                //返回改标签的文本
                return parser.nextText();
            }
        }
        return null;
    }
}

 

以下为请求服务器时,需要给服务器发的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/">
phoneNum作为占位符,等xml被读取到后,其被替换成用户输入的电话号码
      <mobileCode>phoneNum</mobileCode>
      <userID></userID>
    </getMobileCodeInfo>
  </soap12:Body>
</soap12:Envelope>

posted on 2012-11-27 17:40  匪徒在线  阅读(300)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3