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; } }