HttpUrlConnection,OKHttp学习总结大全

一,Android 4种网络连接方式:HttpClient、HttpURLConnection、OKHttp和Volley

1,HttpClient:Java开发用HttpClient,由于在android 2.2及以下版本中HttpUrlConnection存在着一些bug,所以建议在android 2.3以后使用HttpUrlConnection,2.3之前使用HttpClient。
2,HttpUrlConnection:android 2.3以后官方推荐Android开发用HttpUrlConnection,它的API简单,体积较小,因而非常适用于Android项目。
3,OkHttp是一款优秀的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题。Android 2.3以上支持OkHttp,Android4.4开始HttpURLConnection的底层实现采用的是okHttp,已经集成在Android sdk中。
4,Volley由谷歌开发,是一个简化网络任务的库。他负责处理请求,加载,缓存,线程,同步等问题。它可以处理JSON,图片,缓存,文本源,支持一定程度的自定义。Volley在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android 2.2及以下版本,使用的是HttpClient。不过再怎么封装Volley在功能拓展性上始终无法与OkHttp相比。

二,OkHttp的优点

1,OkHttp 处理了很多网络疑难杂症:会从很多常用的连接问题中自动恢复。
2,如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHttp会自动尝试下一个IP。
3,OkHttp还处理了代理服务器问题和SSL握手失败问题。
4,使用 OkHttp 无需重写您程序中的网络代码。
5,OkHttp实现了几乎和java.net.HttpURLConnection一样的API。

三,网络请求框架支持的功能

1,支持自定义请求的Header
2,支持Http的基本请求方法:GET、POST
3,支持文件上传和下载
4,可以加载图片
5,支持多任务网络请求操做
6,支持缓存
7,支持请求回调
8,支持session的保持

四,HttpUrlConnection对象获取及简单设置

URL url = new URL("https://www.baidu.com");
//获取HttpURLConnection实例
connection = (HttpURLConnection) url.openConnection();
//设置请求方法
connection.setRequestMethod("GET");
//设置连接超时
connection.setConnectTimeout(8000);
//设置读取超时的毫秒数
connection.setReadTimeout(8000);
// 在Header中设置token参数
connection.setRequestProperty("Access-Token", token);
//设置传输文件类型
connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
//获取返回header中的参数
connection.getHeaderField("set-cookie");
//获取服务端返回的Json字符串responseDtata
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);
}
String responseDtata = response.toString();
//将Http连接关闭掉
if(connection != null) {
    connection.disconnect();}

https请求绕过SSL证书验证

HttpURLConnection conn = null;
URL url = new URL("https://www.baidu.com");
if (url.getProtocol().toLowerCase().equals("https")) {
    trustAllHosts();
    HttpsURLConnection httpsConn = (HttpsURLConnection) url.openConnection();
    httpsConn.setHostnameVerifier(DO_NOT_VERIFY);
    conn = httpsConn;
} else {
    conn = (HttpURLConnection) url.openConnection();
}

private void trustAllHosts() {
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] {
            new X509TrustManager() {
                @Override
                public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws java.security.cert.CertificateException {

                }

                @Override
                public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws java.security.cert.CertificateException {

                }

                @Override
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return new java.security.cert.X509Certificate[] {};
                }
            }
    };

    // Install the all-trusting trust manager
    try {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

五,OkHttp的使用

// 创建OkHttpClient对象
OkHttpClient client = new OkHttpClient();
// 构建一个RequestBody对象来存放待提交的数据
RequestBody requestBody = new FormBody.Builder()
        .add("username", "admin")
        .add("password", "123456")
        .builder();
// 创建网络请求,post方法
Request request = new Request.Builder
        .url(“http://sethfeng.github.io/index.html”)
        .post(requestBody)
        .build();
// 创建网络请求,get方法
Request request = new Request.Builder
        .url(“http://sethfeng.github.io/index.html”)
        .method("GET", null)
        .build();
// 创建Call对象, 实际创建的是一个RealCall对象,RealCall中有一个对client对象的引用
Call call = client.newCall(request);
// 同步请求
new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            //同步调用,返回Response,会抛出IO异常
            Response response = call.execute();
	   String responseData = response.body().string();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}).start();
// 异步请求
call.enqueue(new Callback() {
    //请求失败执行的方法
    @Override
    public void onFailure(Call call, IOException e) {
    }
    //请求成功执行的方法
    @Override
    public void onResponse(Call call, Response response) throws IOException {
	String responseData = response.body().string();
    }
});

由此可见OkHttp的接口设计的确实非常人性化,它将一些实用的功能进行了很好的封装,使得我们只需编写少量的代码就能完成较为复杂的网络操作。

你可能感兴趣的:(Android)