[017] Android平台HttpClient的使用-手机号码归属地查询 .

2024-03-10 03:20

本文主要是介绍[017] Android平台HttpClient的使用-手机号码归属地查询 .,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android平台主要提供了四种数据存储方式:Shared Preferences、文件存储、Sqlite存储和网络存储。其中:
      1) Shared Preferences 一个轻量级的键-值存储机制,专门用于存储键-值对数据,并且仅可以存储基本的数据类型(boolean、int、long、float和String);通常使用它来存储应用程序的配置信息。
      2) 文件存储 通过FileInputStream和FileOutputStream对文件进行操作,在Android中,文件是一个应用程序私有的,一个应用程序无法读写其它应用程序的文件。
      3) SQLite存储 SQLite是一款轻型的数据库,支持标准SQL。它的设计目标是嵌入式的,占用资源非常的低,在嵌入式设备中,只需要几百K的内存就够了。Android平台也为我们提供了SQLite数据库。
      4) 网络存储 以上3种方式数据均存储在手机上,而网络存储的数据是存储在远程服务器上,手机客户端通过联接到网络来存储和获取数据。

      今天要讲解的HttpClient正是常用的网络存储工具之一。记得最早接触HttpClient是在两年前,当时要做一个垂直搜索引擎,数据自然是来源于互联网,通过一个爬虫系统不断从指定网站上爬取感兴趣的数据,然后通过Lucene搜索引擎框架实现海量数据的快速检索。而爬虫系统最开始是想采用开源的爬虫框架Heritrix来实现,但接触一段时间后发现Heritrix过于庞大,而且是作为一个独立的系统运行,不方便嵌入到现有的系统中,再加上学习成本高,最后还是选择了“HttpClient + HtmlParser”来实现的小型爬虫系统;其中HttpClient可以模拟HTTP的POST和GET请求,用于从指定网站获取网页数据,而HtmlParser用于解析爬取到的页面,过滤HTML标记,取得最终数据。
      是不是发现HttpClient还挺强大的?让我们看看它是什么来头。"HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议"。如果你以前没有接触过HttpClient,那么你只需要简单记住两点就可以了:1)HttpClient是一个HTTP协议开发包;2)HttpClient不是Android的专利。

      HttpClient的功能介绍:
            1)实现了HTTP请求的所有方法(如GET、POST、PUT、HEAD 等);
            2)支持自动转向;
            3)支持 HTTPS 协议;
            4)支持代理服务器等
      HttpClient的基本使用(以POST请求为例):
            1)创建HttpClient实例(类似于浏览器客户端);
                        HttpClient client = new DefaultHttpClient();
            2)创建HttpPost请求,需要向HttpPost的构造方法传入所请求的URL;
                        HttpPost post = new HttpPost(requestUrl);
            3)发出POST请求(调用HttpClient的execute()方法,execute()的参数为HttpPost实例);
                        HttpResponse response = client.execute(post);
            4)读取返回结果;
            5)释放连接;
            6)对返回的结果进行处理。

      在Android平台上使用HttpClient,并不需要添加额外的jar包,因为Android平台吸收了许多优秀的开源框架,其中就包括HttpClient。(注意我写的是吸收,不是收购,两码事),下面就来看一个Android平台使用HttpClient的例子。
1)首先来看布局文件res/layout/main.xml
     

[xhtml] view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:paddingTop="5dip"  
  7.     android:paddingLeft="5dip"  
  8.     android:paddingRight="5dip"  
  9.     >  
  10.     <TextView  
  11.         android:layout_width="fill_parent"   
  12.         android:layout_height="wrap_content"   
  13.         android:text="手机号码(段):"  
  14.     />  
  15.     <EditText android:id="@+id/phone_sec"  
  16.         android:layout_width="fill_parent"  
  17.         android:layout_height="wrap_content"  
  18.         android:inputType="textPhonetic"  
  19.         android:singleLine="true"  
  20.         android:hint="例如:1398547"  
  21.     />  
  22.     <Button android:id="@+id/query_btn"  
  23.         android:layout_width="wrap_content"  
  24.         android:layout_height="wrap_content"  
  25.         android:layout_gravity="right"  
  26.         android:text="查询"  
  27.     />  
  28.     <TextView android:id="@+id/result_text"  
  29.         android:layout_width="wrap_content"   
  30.         android:layout_height="wrap_content"   
  31.         android:layout_gravity="center_horizontal|center_vertical"  
  32.     />  
  33. </LinearLayout>  

2)Activity的代码
     
[java] view plain copy print ?
  1. package com.liufeng.web.activity;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.apache.http.HttpResponse;  
  7. import org.apache.http.HttpStatus;  
  8. import org.apache.http.NameValuePair;  
  9. import org.apache.http.client.HttpClient;  
  10. import org.apache.http.client.entity.UrlEncodedFormEntity;  
  11. import org.apache.http.client.methods.HttpPost;  
  12. import org.apache.http.impl.client.DefaultHttpClient;  
  13. import org.apache.http.message.BasicNameValuePair;  
  14. import org.apache.http.protocol.HTTP;  
  15. import org.apache.http.util.EntityUtils;  
  16.   
  17. import android.app.Activity;  
  18. import android.os.Bundle;  
  19. import android.view.View;  
  20. import android.view.View.OnClickListener;  
  21. import android.widget.Button;  
  22. import android.widget.EditText;  
  23. import android.widget.TextView;  
  24.   
  25. /** 
  26.  * HttpClient运用之手机号码归属地查询 
  27.  *  
  28.  * @author liuyq 
  29.  * @date 2011-05-11 
  30.  */  
  31. public class MainActivity extends Activity {  
  32.     private EditText phoneSecEditText;  
  33.     private TextView resultView;  
  34.     private Button queryButton;  
  35.   
  36.     @Override  
  37.     public void onCreate(Bundle savedInstanceState) {  
  38.         super.onCreate(savedInstanceState);  
  39.         setContentView(R.layout.main);  
  40.   
  41.         phoneSecEditText = (EditText) findViewById(R.id.phone_sec);  
  42.         resultView = (TextView) findViewById(R.id.result_text);  
  43.         queryButton = (Button) findViewById(R.id.query_btn);  
  44.   
  45.         queryButton.setOnClickListener(new OnClickListener() {  
  46.             @Override  
  47.             public void onClick(View v) {  
  48.                 // 手机号码(段)   
  49.                 String phoneSec = phoneSecEditText.getText().toString().trim();  
  50.                 // 简单判断用户输入的手机号码(段)是否合法   
  51.                 if ("".equals(phoneSec) || phoneSec.length() < 7) {  
  52.                     // 给出错误提示   
  53.                     phoneSecEditText.setError("您输入的手机号码(段)有误!");  
  54.                     phoneSecEditText.requestFocus();  
  55.                     // 将显示查询结果的TextView清空   
  56.                     resultView.setText("");  
  57.                     return;  
  58.                 }  
  59.                 // 查询手机号码(段)信息   
  60.                 getRemoteInfo(phoneSec);  
  61.             }  
  62.         });  
  63.     }  
  64.   
  65.     /** 
  66.      * 手机号段归属地查询 
  67.      *  
  68.      * @param phoneSec 手机号段 
  69.      */  
  70.     public void getRemoteInfo(String phoneSec) {  
  71.         // 定义待请求的URL   
  72.         String requestUrl = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo";  
  73.         // 创建HttpClient实例   
  74.         HttpClient client = new DefaultHttpClient();  
  75.         // 根据URL创建HttpPost实例   
  76.         HttpPost post = new HttpPost(requestUrl);  
  77.   
  78.         List<NameValuePair> params = new ArrayList<NameValuePair>();  
  79.         // 设置需要传递的参数   
  80.         params.add(new BasicNameValuePair("mobileCode", phoneSec));  
  81.         params.add(new BasicNameValuePair("userId"""));  
  82.         try {  
  83.             // 设置URL编码   
  84.             post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));  
  85.             // 发送请求并获取反馈   
  86.             HttpResponse response = client.execute(post);  
  87.   
  88.             // 判断请求是否成功处理   
  89.             if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  
  90.                 // 解析返回的内容   
  91.                 String result = EntityUtils.toString(response.getEntity());  
  92.                 // 将查询结果经过解析后显示在TextView中   
  93.                 resultView.setText(filterHtml(result));  
  94.             }  
  95.         } catch (Exception e) {  
  96.             e.printStackTrace();  
  97.         }  
  98.     }  
  99.   
  100.     /** 
  101.      * 使用正则表达式过滤HTML标记 
  102.      *  
  103.      * @param source 待过滤内容 
  104.      * @return 
  105.      */  
  106.     private String filterHtml(String source) {  
  107.         if(null == source){  
  108.             return "";  
  109.         }  
  110.         return source.replaceAll("</?[^>]+>","").trim();  
  111.     }  
  112. }  

3)在AndroidManifest.xml中添加访问网络的权限
     
[xhtml] view plain copy print ?
  1. <uses-permission android:name="android.permission.INTERNET" />   

4)运行结果截图
     

备注:是不是发现HttpClient很容易使用呢?其实,上面所讲解的只是HttpClient最基本的功能(发起POST请求);我们在浏览器客户端所执行的大多数操作HttpClient都能够模拟,例如:提交表单、查询数据、上传下载文档、页面跳转、Session存储等。比如大家经常玩“抢车位”、“偷菜”,就可以通过HttpClient编程自动实现。(其实这就相当于外挂的原型了,尝试一下可以,小心被封号!)

这篇关于[017] Android平台HttpClient的使用-手机号码归属地查询 .的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/792860

相关文章

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

Python 字典 (Dictionary)使用详解

《Python字典(Dictionary)使用详解》字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力,:本文主要介绍Python字典(Dictionary)... 目录字典1.基本特性2.创建字典3.访问元素4.修改字典5.删除元素6.字典遍历7.字典的高级特性默认字典

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更