Android中HttpURLConnection与HttpClient的使用与封装

1.写在前面

大部分andriod应用需要与服务器进行数据交互,HTTP、FTP、SMTP或者是直接基于SOCKET编程都可以进行数据交互,但是HTTP必然是使用最广泛的协议。
    本文并不针对HTTP协议的具体内容,仅探讨android开发中使用HTTP协议访问网络的两种方式——HttpURLConnection和HttpClient
    因为需要访问网络,需在AndroidManifest.xml中添加如下权限

<uses-permission android:name="android.permission.INTERNET" />

2.HttpURLConnection

2.1 GET方式

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

// 以下代码实现了以GET方式发起HTTP请求
// 连接网络是耗时操作,一般新建线程进行

private void connectWithHttpURLConnection() {
  new Thread( new Runnable() {
    @Override
    public void run() {
      HttpURLConnection connection = null;
      try {
        // 调用URL对象的openConnection方法获取HttpURLConnection的实例
        URL url = new URL("http://www.jb51.net");
        connection = (HttpURLConnection) url.openConnection();
        // 设置请求方式,GET或POST
        connection.setRequestMethod("GET");
        // 设置连接超时、读取超时的时间,单位为毫秒(ms)
        connection.setConnectTimeout(8000);
        connection.setReadTimeout(8000);
        // getInputStream方法获取服务器返回的输入流
        InputStream in = connection.getInputStream();
        // 使用BufferedReader对象读取返回的数据流
        // 按行读取,存储在StringBuider对象response中
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        StringBuilder response = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
          response.append(line);
        }
        //..........
        // 此处省略处理数据的代码
        // 若需要更新UI,需将数据传回主线程,具体可搜索android多线程编程
      } catch (Exception e){
        e.printStackTrace();
      } finally {
        if (connection != null){
          // 结束后,关闭连接
          connection.disconnect();
        }
      }
    }
  }).start();
}

2.2 POST方式

import java.io.DataOutputStream;

//将对应部分改为
connection.setRequestMethod("POST");
DataOutputStream data = new DataOutputStream(connection.getOutputStream());
data.writeBytes("stu_no=12345&stu_name=Tom");

传入多个参数用&隔开
如需传入复杂的参数,可使用JSON,关于JSON的用法介绍,可以参考我的另一篇随笔JSON解析的两种方法。
3.HttpClient

3.1 GET方式

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.HttpResponse;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;

// 创建DefaultHttpClient实例
HttpClient httpClient = new DefaultHttpClient();
//传入网址,然后执行
HttpGet httpGet = new HttpGet("http://www.jb51.net");
HttpResponse httpResponse = httpClient.execute(httpGet);
// 由状态码判断请求结果,
// 常见状态码 200 请求成功,404 页面未找到
// 关于HTTP的更多状态码直接GOOGLE
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
  // 请求成功,使用HttpEntity获得返回数据
  // 使用EntityUtils将返回数据转换为字符串
  HttpEntity entity = httpResponse.getEntity();
  String response = EntityUtils.toString(entity);
  //如果是中文,指定编码
  //==>String response = EntityUtils.toString(entity, "utf-8");
}

3.2 POST方式

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.message.BasicNameValuePair;

HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost("http://www.jb51.net");
// 使用NameValuePair(键值对)存放参数
List<NameValuePair> data = new ArrayList<NameValuePair>();
// 添加键值对
data.add(new BasicNameValuePair("stu_no", 12345));
data.add(new BasicNameValuePair("stu_name", "Tom"));
// 使用setEntity方法传入编码后的参数
httpPost.setEntity(new UrlEncodedFormEntity(data, "utf-8"));
// 执行该POST请求
HttpResponse httpResponse = httpClient.execute(httpPost);
// .....省略处理httpResponse的代码,与GET方式一致

3.3 android 6.0移除HttpClient

android 6.0(API 23)版本的SDK已将Apache HttpClient相关类移除,解决办法自行GOOGLE,推荐使用HTTPURLConnection。
若还需使用该类,点击查看解决办法。
4.HttpURLConnection实战
如果你使用过JQuery(一个javasript库),你一定对JQuery的网路编程印象深刻,比如一个HTTP请求只需以下几行代码。

// JQuery的post方法
$.post("http://www.jb51.net",{
    "stu_no":12345,
    "stu_name":"Tom",
  }).done(function(){
    //...请求成功的代码
  }).fail(function(){
    //...请求失败的代码
  }).always(function(){
    //...总会执行的代码
  })

我们当然不希望每次网络请求都写下2.1中那么繁琐的代码,那么android的HTTP请求能否像JQuery那么简单呢?当然可以!下面的代码实现了HttpURLConnection的HTTP请求方法封装:

4.1 定义接口HttpCallbackListener,为了实现回调

// 定义HttpCallbackListener接口
// 包含两个方法,成功和失败的回调函数定义
public interface HttpCallbackListener {
  void onFinish(String response);
  void onError(Exception e);
}

4.2 创建HttpTool类,抽象请求方法(GET)

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

/* 创建一个新的类 HttpTool,将公共的操作抽象出来
 * 为了避免调用sendRequest方法时需实例化,设置为静态方法
 * 传入HttpCallbackListener对象为了方法回调
 * 因为网络请求比较耗时,一般在子线程中进行,
 * 为了获得服务器返回的数据,需要使用java的回调机制 */

public class HttpTool {
  public static void sendRequest(final String address,
      final HttpCallbackListener listener) {
    new Thread(new Runnable() {
      @Override
      public void run() {
        HttpURLConnection connection = null;

        try {
          URL url = new URL(address);
          connection = (HttpURLConnection) url.openConnection();
          connection.setRequestMethod("GET");
          connection.setConnectTimeout(8000);
          connection.setReadTimeout(8000);
          InputStream in = connection.getInputStream();
          BufferedReader reader = new BufferedReader(new InputStreamReader(in));
          StringBuilder response = new StringBuilder();   String line;
          while ((line = reader.readLine()) != null) {
            response.append(line);
          }
          if (listener != null) {
            // 回调方法 onFinish()
            listener.onFinish(response.toString());
          }
        } catch (Exception e) {
          if (listener != null) {
            // 回调方法 onError()
            listener.onError(e);
          }
        } finally {
          if (connection != null) {
            connection.disconnect();
          }
        }
      }
    }).start();
  }
}

4.3 调用示例

//使用该HttpTool发起GET请求
String url = "http://www.jb51.net";
HttpTool.sendRequest(url,new HttpCallbackListener(){
  @Override
  public void onFinish(String response) {
    // ...省略对返回结果的处理代码
  } 

  @Override
  public void onError(Exception e) {
    // ...省略请求失败的处理代码
  }
});

4.4 抽象请求方法(POST)

/* 在GET方法实现的基础上增加一个参数params即可,
 * 将参数转换为字符串后传入
 * 也可以传入键值对集合,再处理 */
public static void sendRequest(final String address,
  final String params, final HttpCallbackListener listener){
    //...
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • Golang+Android基于HttpURLConnection实现的文件上传功能示例

    本文实例讲述了Golang+Android基于HttpURLConnection实现的文件上传功能.分享给大家供大家参考,具体如下: 这里要演示的是使用Android程序作为客户端(使用HttpURLConnection访问网络),Golang程序作为服务器端,实现文件上传. 客户端代码: public static String uploadFile(String uploadUrl, String filePath) { Log.v(TAG, "url:" + uploadUrl)

  • Android使用URLConnection提交请求的实现

    URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和URL之间的通信连接.程序可以通过URLConnection实例向该URL发送请求,读取URL引用的资源. 通常创建一个和URL的连接,并发送请求.读取此URL引用的资源需要如下几个步骤: Step1: 通过调用URL对象的openConnection()方法来创建URLConnection对象: Step2:设置URLConnection的参数和普通请求属性: Step3:如果只是发送GE

  • Android基于HttpUrlConnection类的文件下载实例代码

    废话不多说了,直接给大家贴代码了,具体代码如所示: /** * get方法的文件下载 * <p> * 特别说明 android中的progressBar是google唯一的做了处理的可以在子线程中更新UI的控件 * * @param path */ private void httpDown(final String path) { new Thread() { @Override public void run() { URL url; HttpURLConnection connectio

  • Android HttpURLConnection断点下载(单线程)

    HttpCilent 跟 HttpURLConnection 是安卓原生的用来实现http请求的类: Android 6.0之后取消了HttpClient,不支持跟新 ,今天小编使用的是HttpURLConnection : 直接上代码: URL url = null; BufferedInputStream bin = null; HttpURLConnection httpURLConnection = null; Context context; try { //你要下载文件的路径 Str

  • Android通过HttpURLConnection和HttpClient接口实现网络编程

    Android中提供的HttpURLConnection和HttpClient接口可以用来开发HTTP程序.以下是学习中的一些经验. 1.HttpURLConnection接口 首先需要明确的是,Http通信中的POST和GET请求方式的不同.GET可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器.而POST方法的参数是放在Http请求中.因此,在编程之前,应当首先明确使用的请求方法,然后再根据所使用的方式选择相应的编程方式.HttpURLConnection是继承于URLCon

  • Android中使用HttpURLConnection实现GET POST JSON数据与下载图片

    Android6.0中把Apache HTTP Client所有的包与类都标记为deprecated不再建议使用所有跟HTTP相关的数据请求与提交操作都通过HttpURLConnection类实现,现实是很多Android开发者一直都Apache HTTP Client来做andoird客户端与后台HTTP接口数据交互,小编刚刚用HttpURLConnection做了一个android的APP,不小心踩到了几个坑,总结下最常用的就通过HttpURLConnection来POST提交JSON数据与

  • Android程序开发通过HttpURLConnection上传文件到服务器

    一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HTTP API作为后台上传接口,android客户端我选择用HttpURLConnection来通过form提交文件数据实现上传功能,本来想网上搜搜拷贝一下改改代码就好啦,发现根本没有现成的例子,多数的例子都是基于HttpClient的或者是基于Base64编码以后作为字符串来传输图像数据,于是我不得不自己动手,参考了网上一些资料,最终实现基于HttpURLConnect

  • Android网络技术HttpURLConnection详解

    介绍 早些时候,Android 上发送 HTTP 请求一般有 2 种方式:HttpURLConnection 和 HttpClient.不过由于 HttpClient 存在 API 数量过多.扩展困难等缺点,Android 团队越来越不建议我们使用这种方式.在 Android 6.0 系统中,HttpClient 的功能被完全移除了.因此,在这里我们只简单介绍HttpURLConnection 的使用. 代码 (核心部分,目前只演示 GET 请求): 1. Manifest.xml 中添加网络权

  • Android 中HttpURLConnection与HttpClient使用的简单实例

    1:HttpHelper.java 复制代码 代码如下: public class HttpHelper {    //1:标准的Java接口    public static String getStringFromNet1(String param){        String result="";        try{            URL url=new URL(param);            HttpURLConnection conn=(HttpURLCo

  • Android HttpURLConnection.getResponseCode()错误解决方法

    导语:个人对网络连接接触的不多,在使用时自己发现一些问题,记录一下. 正文:我在使用HttpURLConnection.getResponseCode()的时候直接报错是IOException错误,responseCode = -1.一直想不明白,同一个程序我调用了两次,结果有一个链接一直OK,另一个却一直报这个错误.后来发现两个链接的区别,有一个返回的内容是空的,所以导致了这个错误. 解决方法: 方法1.网页返回内容不能是空: 方法2.不要用这个接口咯.

随机推荐