大多数连接网络的 Android app 会使用 HTTP 来发送与接收数据。Android 提供了三种 HTTP client:HttpURLConnection、 HttpClient和OkHttpClient。都支持 HTTPS、流媒体上传和下载、可配置的超时、IPv6 与连接池(connection pooling)。

    一、Java.net包中的HttpURLConnection类

    HttpUrlConnection是JDK里提供的联网API,我们知道Android SDK是基于Java的,所以当然优先考虑HttpUrlConnection这种最原始最基本的API,其实大多数开源的联网框架基本上也是基于JDK的HttpUrlConnection进行的封装罢了


二、HttpClient ,目前Android库已弃用

 

    三、 OkHttpClient

    http是现在主流应用使用的网络请求方式, 用来交换数据和内容, 有效的使用HTTP可以使你的APP变的更快和减少流量的使用。

    OkHttpClient是一个很棒HTTP客户端:

        支持SPDY,可以合并多个到同一个主机的请求

        使用连接池技术减少请求的延迟(如果SPDY是可用的话)

        使用GZIP压缩减少传输的数据量

        缓存响应避免重复的网络请求

    当你的网络出现拥挤的时候,就是OKHttp大显身手的时候,它可以避免常见的网络问题,如果你的服务是部署在不同的IP上面的,如果第一个连接失败,OkHTtp会尝试其他的连接。这对现在IPv4+IPv6中常见的把服务冗余部署在不同的数据中心上也是很有必要的。OkHttpClient将使用现在TLS特性(SNI ALPN)来初始化新的连接,如果握手失败,将切换到TLS 1.0。

    使用OkHttpClient很容易,同时支持异步阻塞请求和回调.

    如果你使用OkHttpClient,你不用重写你的代码, okhttp-urlconnection模块实现了 java.net.HttpURLConnection 中的API, okhttp-apache模块实现了HttpClient中的API

最近很火的Retrofit网络请求框架,内部封装也是OkHttpClient.

 

顺便说下OkHttpClient. POST请求传递参数的方法总结

1,使用FormBody传递键值对参数

这种方式用来上传String类型的键值对
使用示例如下:

private void postDataWithParame() {
         OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
         FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
         formBody.add("username","zhangsan");//传递键值对参数
         Request request = new Request.Builder()//创建Request 对象。
                 .url("http://www.baidu.com")
                 .post(formBody.build())//传递请求体
                 .build();
         client.newCall(request).enqueue(new Callback() {。。。});//此处省略回调方法。
     }

2,使用RequestBody传递Json或File对象

RequestBody是抽象类,故不能直接使用,但是他有静态方法create,使用这个方法可以得到RequestBody对象。

这种方式可以上传Json对象或File对象。
上传json对象使用示例如下:

OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
 * MediaType JSON = MediaType.parse("application/json; charset=utf-8");//数据类型为json格式,
 * String jsonStr = "{\"username\":\"lisi\",\"nickname\":\"李四\"}";//json数据.
 * RequestBody body = RequestBody.create(JSON, josnStr);
     Request request = new Request.Builder()
             .url("http://www.baidu.com")
             .post(body)
             .build();
     client.newCall(request).enqueue(new Callback() {。。。});//此处省略回调方法。

3.上传File对象使用示例如下:

MediaType fileType = MediaType.parse("File/*");//数据类型为json格式,
 File file = new File("path");//file对象.
 RequestBody body = RequestBody.create(fileType , file );