你的位置:首页 > 软件开发 > 操作系统 > Android网络编程随想录

Android网络编程随想录

发布时间:2015-09-19 18:00:25
大多数Android的app都会使用HTTP协议来发送和接收数据。在Android开发中,通常使用两种http客户端:一个是Apache的HttpClient,另一个是HttpURLConnection。这两种HTTP客户端API都支持HTTPS协议,流数据上传和下载,配置超时, ...

        大多数Android的app都会使用HTTP协议来发送和接收数据。在Android开发中,通常使用两种http客户端:一个是Apache的HttpClient,另一个是HttpURLConnection。这两种HTTP客户端API都支持HTTPS协议,流数据上传和下载,配置超时,IPV6协议以及连接池等等。

Apache HttpClient

        HttpClient的API众多,并且bug少比较稳定。但是,HttpClient的API比较大,很难在保证兼容性的前提下去对其进行扩展。所以很多Android团队并不太喜欢使用它。HttpClient是一个接口,里面封装了需要执行的http请求,身份验证,连接管理等等,有三个主要的实现类:AbstractHttpClient, AndroidHttpClient, DefaultHttpClient。下面我们来看一下AndroidHttpClient,它对DefaultHttpClient进行了改进使之更适合于Android开发。于是,AndroidHttpClient进行请求发送和响应接收步骤如下:

  1. 创建HttpClient对象,通过静态方法newInstance()方法来获得AndroidHttpClient对象。
  2. 创建对应的发送请求的对象,如果需要发送GET请求,则创建HttpGet对象,如果需要发送POST请求,则创建HttpPost对象。
  3. 对于发送请求的参数,GET和POST使用的方式不同,GET方式可以使用拼接字符串的方式,把参数拼接在URL结尾;POST方式需要使用setEntity(HttpEntity entity)方法来设置请求参数。
  4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse对象。
  5. 调用HttpResponse的对应方法获取服务器的响应头、响应内容等。

        通常情况下,我们并不在主线程中进行网络请求操作,而是新开一个子线程来进行网络操作,下面的代码展示了如何利用AndroidHttpClient完成网络登录验证的任务:

public class LoginTask implements Runnable {  private String username;  private String password;  public LoginTask(String username, String password) {    // 初始化用户名和密码    this.username = username;    this.password = password;  }  @Override  public void run() {    // 设置访问的Web站点    String path = "http://xxxx/loginas.aspx";    //设置Http请求参数    Map<String, String> params = new HashMap<String, String>();    params.put("username", username);    params.put("password", password);    String result = sendHttpClientPost(path, params, "utf-8");    //把返回的接口输出    System.out.println(result);  }  /**   * 发送Http请求到Web站点   * @param path Web站点请求地址   * @param map Http请求参数   * @param encode 编码格式   * @return Web站点响应的字符串   */  private String sendHttpClientPost(String path,Map<String, String> map,String encode)  {    List<NameValuePair> list=new ArrayList<NameValuePair>();    if(map!=null&&!map.isEmpty())    {      for(Map.Entry<String, String> entry:map.entrySet())      {        //解析Map传递的参数,使用一个键值对对象BasicNameValuePair保存。        list.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));      }    }    try {      //实现将请求 的参数封装封装到HttpEntity中。      UrlEncodedFormEntity entity=new UrlEncodedFormEntity(list, encode);      //使用HttpPost请求方式      HttpPost httpPost=new HttpPost(path);      //设置请求参数到Form中。      httpPost.setEntity(entity);      //实例化一个默认的Http客户端,使用的是AndroidHttpClient      HttpClient client=AndroidHttpClient.newInstance("");      //执行请求,并获得响应数据      HttpResponse httpResponse= client.execute(httpPost);      //判断是否请求成功,为200时表示成功,其他均问有问题。      if(httpResponse.getStatusLine().getStatusCode()==200)      {        //通过HttpEntity获得响应流        InputStream inputStream=httpResponse.getEntity().getContent();        return changeInputStream(inputStream,encode);      }          } catch (UnsupportedEncodingException e) {      // TODO Auto-generated catch block      e.printStackTrace();    } catch (ClientProtocolException e) {      // TODO Auto-generated catch block      e.printStackTrace();    } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }        return "";  }            /**   * 把Web站点返回的响应流转换为字符串格式   * @param inputStream 响应流   * @param encode 编码格式   * @return 转换后的字符串   */  private String changeInputStream(InputStream inputStream,      String encode) {     ByteArrayOutputStream outputStream = new ByteArrayOutputStream();    byte[] data = new byte[1024];    int len = 0;    String result="";    if (inputStream != null) {      try {        while ((len = inputStream.read(data)) != -1) {          outputStream.write(data,0,len);                  }        result=new String(outputStream.toByteArray(),encode);              } catch (IOException e) {        e.printStackTrace();      }    }    return result;  }}

原标题:Android网络编程随想录

关键词:Android

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录