• android HttpClient接口实现网络通信


    引自http://www.cnblogs.com/menlsh/archive/2013/05/25/3099479.html,稍有改动

    在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方式获取服务器上的图片

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

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

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

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

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

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

     public static Bitmap sendGetResquest(String path) {
    	 Bitmap bitmap = null;
    	 HttpGet httpGet = new HttpGet(path);                           //创建一个GET方式的HttpRequest对象
    	 DefaultHttpClient httpClient = new DefaultHttpClient();        //创建一个默认的HTTP客户端
    	 try {
    		 HttpResponse httpResponse = httpClient.execute(httpGet);               //执行GET方式的HTTP请求
    		 int reponseCode = httpResponse.getStatusLine().getStatusCode();        //获得服务器的响应码
    		 if(reponseCode == HttpStatus.SC_OK) {
    			 InputStream inputStream = httpResponse.getEntity().getContent();   //获得服务器的响应内容
    			 bitmap = BitmapFactory.decodeStream(inputStream);
    			 inputStream.close();
    		 }
    	 } catch (ClientProtocolException e) {
    		 e.printStackTrace();
    	 } catch (IOException e) {
    		 e.printStackTrace();
    	 }
    	 return bitmap;
     } 

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

     public void onClick(View view) {
    	 switch(view.getId()) {
    	 case R.id.button_get:
    		 String url = "http://192.168.1.101:8080/myhttp/cat.jpg";
    		 Bitmap bitmap = HttpUtils.sendGetResquest(url);   //提交get请求
    		 mImageView.setImageBitmap(bitmap);
    		 break;
    	 }
     }

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

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

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

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

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

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

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

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

     public static String sendPostResquest(String path, Map<String, String> params, String encoding) {
    	 List<NameValuePair> list = new ArrayList<NameValuePair>();      //封装请求体参数
    	 if((params != null) && !params.isEmpty()) {
    		 for(Map.Entry<String, String> param : params.entrySet()) {
    			 list.add(new BasicNameValuePair(param.getKey(), param.getValue()));
    		 }
    	 }
    	 try {
    		 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list, encoding);    //对请求体参数进行URL编码
    		 HttpPost httpPost = new HttpPost(path);           //创建一个POST方式的HttpRequest对象
    		 httpPost.setEntity(entity);                       //设置POST方式的请求体
    		 DefaultHttpClient client = new DefaultHttpClient();
    		 HttpResponse httpResponse = client.execute(httpPost);                      //执行POST请求
    		 int reponseCode = httpResponse.getStatusLine().getStatusCode();            //获得服务器的响应码
    		 if(reponseCode == HttpStatus.SC_OK) {
    			 String resultData = EntityUtils.toString(httpResponse.getEntity());    //获得服务器的响应内容
    			 return resultData;
    		 }
    	 } catch (IOException e) {
    		 e.printStackTrace();
    	 }
    	 return "";
     }

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

     public void onClick(View view) {
    	 switch(view.getId()) {
    	 case R.id.button_submit:
    		 String username = mEditText_userName.getText().toString();
    		 String password = mEditText_password.getText().toString();
    		 Map<String, String> params = new HashMap<String, String>();
    		 params.put("username", username);
    		 params.put("password", password);
    		 String url = "http://192.168.1.101:8080/myhttp/servlet/LoginAction";
    		 mTextView_result.setText(HttpUtils.sendPostResquest(url, params, "utf-8")); //提交post请求
    		 break;
    	 }
     }
  • 相关阅读:
    【CFD之道】2018年原创文章汇总
    【OpenFOAM案例】03 Docker安装OpenFOAM
    【OpenFOAM案例】02 自己动手
    【OpenFOAM案例】01 elbow
    Fluent动网格【13】:网格光顺总结及实例
    Fluent动网格【12】:扩散光顺
    Fluent动网格【10】:区域运动案例
    Fluent动网格【11】:弹簧光顺
    happyChat开发系列:使用websocket.io实现双向通信的乐聊大前端开发
    vue,vuex的后台管理项目架子structure-admin,后端服务nodejs
  • 原文地址:https://www.cnblogs.com/flowers-yang/p/3381376.html
Copyright © 2020-2023  润新知