• Android学习笔记47:使用HttpClient接口实现网络通信


      在Android中,我们可以通过使用标准的Java接口来完成Android应用程序的联网操作。但是在实际开发中,可能会需要用到更复杂的联网操作,为此,Android平台提供了Apache HttpClient接口,为客户端的HTTP编程提供了高效、便捷、功能丰富的工具包支持。

      Android平台在引入Apache HttpClient的同时,还对其进行了一些封装和扩展,如设置缺省的HTTP超时和缓存大小等。使用Apache HttpClient接口,我们可以创建HttpClient、HttpGet/HttpPost、HttpResponse等对象,设置连接参数,执行HTTP操作,处理服务器返回结果等。

      本文将以两个实例演示在Android开发中如何使用HttpClient接口完成客户端HTTP编程。其中,一个实例使用GET方式获取服务器上的图片进行显示;一个实例使用POST方式向服务器提交数据,完成登录功能。

     

    1.常用的接口和类

      在讲解实例之前,我们有必要先了解一下在HttpClient接口中,为我们提供了哪些常用的接口和类。

    1.1 ClientConnectionManager接口

      ClientConnectionManager是客户端连接管理器接口,用于对连接到服务器上的客户端进行管理,主要提供了以下6个抽象方法:

      (1)abstract void closeExpiredConnections();

      (2)abstract void closeIdleConnections(long idletime, TimeUnit tunit);

      (3)abstract SchemeRegistry getSchemeRegistry();

      (4)abstract void releaseConnection(ManagedClientConnection conn, long validDuration, TimeUnit timeUnit);

      (5)abstract ClientConnectionRequest requestConnection(HttpRoute route, Object state); 

      (6)abstract void shutdown();

      其中,closeExpiredConnections()方法用于关闭所有过期的连接;closeIdleConnections()方法用于关闭所有空闲的连接;getSchemeRegistry()方法用于获得注册方案;releaseConnection()方法用于释放连接;requestConnection()方法用于请求一个新的连接;shutdown()方法用于关闭管理器并释放资源。

    1.2 DefaultHttpClient

      DefaultHttpClient是HttpClient接口的一个直接子类,它是一个默认的HTTP客户端,通常我们可以使用它来创建一个HTTP连接。在HttpClient接口中提供了多个重载的execute()方法,用来执行HTTP请求。

    1.3 HttpRequest接口

      HttpGet和HttpPost都是HttpRequest接口的直接子类,分别用于向服务器提交GET请求和POST请求。

    1.4 HttpResponse接口

      HttpResponse接口提供了HTTP的响应信息,其主要方法如图1所示。

    图1 HttpResponse接口提供的主要方法

      其中,getEntity()方法用于获取响应的消息实体;getStatusLine()方法用于获取响应的状态行,在返回结果StatusLine对象中包含了HTTP响应的状态码,可以使用方法getStatusCode()获得。

     

    2.使用GET方式获取服务器上的图片

      在该实例中,我们使用了在上一篇博文《Android学习笔记46:使用Post方式提交数据》中搭建好的Web工程作为服务器,并在该工程中添加了一张名为“cat.jpg”的图片作为我们将要获取的对象。

      使用GET方式获取服务器上的图片,可以按照以下4个步骤进行:

      (1)创建一个GET方式的HttpRequest请求对象。

      (2)创建一个默认的HTTP客户端,并执行该GET方式的HTTP请求。

      (3)获得服务器的响应码,据此判断服务器是否正确响应。

      (4)获得服务器的响应内容(InputStream),转换成Bitmap图片。

      以上4个步骤的具体实现代码如下:

     1     /*
     2      * Function   :   发送GET请求
     3      * Author     :   博客园-依旧淡然
     4      */
     5     public static Bitmap sendGetResquest(String path) {
     6         Bitmap bitmap = null;
     7         HttpGet httpGet = new HttpGet(path);                           //创建一个GET方式的HttpRequest对象
     8         DefaultHttpClient httpClient = new DefaultHttpClient();        //创建一个默认的HTTP客户端
     9         try {
    10             HttpResponse httpResponse = httpClient.execute(httpGet);               //执行GET方式的HTTP请求
    11             int reponseCode = httpResponse.getStatusLine().getStatusCode();        //获得服务器的响应码
    12             if(reponseCode == HttpStatus.SC_OK) {
    13                 InputStream inputStream = httpResponse.getEntity().getContent();   //获得服务器的响应内容
    14                 bitmap = BitmapFactory.decodeStream(inputStream);
    15                 inputStream.close();
    16             }
    17         } catch (ClientProtocolException e) {
    18             e.printStackTrace();
    19         } catch (IOException e) {
    20             e.printStackTrace();
    21         }
    22         return bitmap;
    23     }

      最后,我们在Activity中通过一个Button按钮来向服务器发送GET请求,并调用sendGetResquest()方法将得到的Bitmap对象显示在ImageView控件中。具体的实现代码如下:

     1     /*
     2      * Function  :   点击事件响应
     3      * Author    :   博客园-依旧淡然
     4      */
     5     public void onClick(View view) {
     6         switch(view.getId()) {
     7         case R.id.button_get:
     8             String url = "http://192.168.1.101:8080/myhttp/cat.jpg";
     9             Bitmap bitmap = HttpUtils.sendGetResquest(url);
    10             mImageView.setImageBitmap(bitmap);
    11             break;
    12         }
    13     }

      运行该工程,点击“提交GET请求”按钮后,可以看到如图2所示的显示界面,在“提交GET请求”按钮的下面所显示的图片正是我们从服务器上得到的图片。

    使用GET方式获取服务器上的图片

     

    3.使用POST方式向服务器提交数据

      在该实例中,我们同样使用了在上一篇博文《Android学习笔记46:使用Post方式提交数据》中搭建好的Web工程作为服务器。运行Tomcat,在浏览器中访问该Web工程,可以看到如图3所示的界面。 

    图3 Web工程的显示页面

      该实例要做的就是,使用POST方式向服务器提交用户名和密码,模拟登录过程,并获得服务器的验证信息,显示登录是否成功。

      使用POST方式向服务器提交数据,比GET方式要稍微复杂点,具体可以按照以下5个步骤进行:

      (1)对请求体参数(也就是username和password)进行封装。

      (2)创建一个POST方式的HttpRequest对象,并设置POST方式的请求体。

      (3)创建一个默认的HTTP客户端,并执行该POST方式的HTTP请求。

      (4)获得服务器的响应码,据此判断服务器是否正确响应。

      (5)获得服务器的响应内容(InputStream),转换成String字符串进行显示。

      以上5个步骤的具体实现代码如下:

     1     /*
     2      * Function  :   发送POST请求
     3      * Author    :   博客园-依旧淡然
     4      */
     5     public static String sendPostResquest(String path, Map<String, String> params, String encoding) {
     6         List<NameValuePair> list = new ArrayList<NameValuePair>();      //封装请求体参数
     7         if((params != null) && !params.isEmpty()) {
     8             for(Map.Entry<String, String> param : params.entrySet()) {
     9                 list.add(new BasicNameValuePair(param.getKey(), param.getValue()));
    10             }
    11         }
    12         try {
    13             UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, encoding);    //对请求体参数进行URL编码
    14             HttpPost httpPost = new HttpPost(path);           //创建一个POST方式的HttpRequest对象
    15             httpPost.setEntity(entity);                       //设置POST方式的请求体
    16             DefaultHttpClient client = new DefaultHttpClient();
    17             HttpResponse httpResponse = client.execute(httpPost);                      //执行POST请求
    18             int reponseCode = httpResponse.getStatusLine().getStatusCode();            //获得服务器的响应码
    19             if(reponseCode == HttpStatus.SC_OK) {
    20                 String resultData = EntityUtils.toString(httpResponse.getEntity());    //获得服务器的响应内容
    21                 return resultData;
    22             }
    23         } catch (IOException e) {
    24             e.printStackTrace();
    25         }
    26         return "";
    27     }

      同样的,我们在Activity中通过一个Button按钮来向服务器发送POST请求,并调用sendPostResquest()方法将得到的服务器响应结果显示在TextView控件中。具体的实现代码如下:

     1     /*
     2      * Function  :   点击事件响应
     3      * Author    :   博客园-依旧淡然
     4      */
     5     public void onClick(View view) {
     6         switch(view.getId()) {
     7         case R.id.button_submit:
     8             String username = mEditText_userName.getText().toString();
     9             String password = mEditText_password.getText().toString();
    10             Map<String, String> params = new HashMap<String, String>();
    11             params.put("username", username);
    12             params.put("password", password);
    13             String url = "http://192.168.1.101:8080/myhttp/servlet/LoginAction";
    14             mTextView_result.setText(HttpUtils.sendPostResquest(url, params, "utf-8"));
    15             break;
    16         }
    17     }

      运行该工程,在EditText控件中分别输入用户名和密码,点击“提交数据”按钮后,可以看到如图4所示的显示界面,在“提交数据”按钮下面的TextView控件中可以看到服务器返回了“Login succeeded!” 的提示信息。

    作者:依旧淡然
    邮箱:menlsh@163.com
    本文版权归作者所有,未经作者同意,严禁转载及用作商业传播,否则将追究法律责任。
  • 相关阅读:
    2019-08-10T12:18:27.745963Z 7 [Note] Slave I/O thread for channel '': connected to master 'repl_user@192.168.43.81:3306',replication started in log 'mysql-bin.000001' at position 154 2019-08-10T12:18:
    yum安装的mysql 目录结构
    Starting MySQL.. ERROR! The server quit without updating PID file (/db/data/110.pid).
    CentOS7修改主机名
    使用ssh登陆远程主机
    traceroute命令
    Linux设置开机启动
    检查是否安装服务包
    CSS之盒子模型
    BFC块级格式化上下文
  • 原文地址:https://www.cnblogs.com/menlsh/p/3099479.html
Copyright © 2020-2023  润新知