目录
1 OKHttp
1.1 OKHttp简介
在讲述
OKHttp
之前
,
我们看下没有
OKHttp
的时代
,
我们是如何完成
http
请求的
在没有OKHttp
的日子
,
我们使用
HttpURLConnection
或者
HttpClient
.
那么这两者都有什么优缺点
呢
?
为什么不在继续使用下去呢
?
HttpClient
是
Apache
基金会的一个开源网络库
,
功能十分强大
, API
数量众多
,
但是正是由于庞大的
API数量使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,
所以
Android
团队在提升和优化HttpClient方面的工作态度并不积极。
HttpURLConnection
是一种多用途
,
轻量极的
HTTP
客户端
,
提供的
API
比较简单
,
可以容易地去使用和扩展.
不过在
Android 2.2
版本之前
,
HttpURLConnection
一直存在着一些令人厌烦的
bug.
比如说对一个可读的InputStream
调用
close()
方法时,就有可能会导致连接池失效了。那么我们通常的解决办法就是直接禁用掉连接池的功能:
private void disableConnectionReuseIfNecessary() {
// 这是一个2.2版本之前的bug
if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
System.setProperty("http.keepAlive", "false");
}
}
因此,一般的推荐是在
2.2
之前
,
使用
HttpClient
,
因为其
bug
较少
.。
在
2.2
之后
,
推荐使用
HttpURLConnection
,
因为
API
简单
,
体积小
,
并且有压缩和缓存机制
,
并且
Android
团队后续会继续优化HttpURLConnection 。
但是
,
上面两个类库和
OKHttp
比起来就弱爆了
,
因为
OKHttp
不仅具有高效的请求效率
,
并且提供了很多开箱即用的网络疑难杂症解决方案。
1.2 项目开源地址
https://github.com/square/OKHttp
1.3 什么是OKHttp
OKHttp
是一个网络请求开源项目,
Android
网络请求轻量级框架
,
支持文件上传与下载,支持
https
。
2 OKHttp的基本使用
2.1 Get请求
2.1.1同步GET
public static String getSynchronous(String url){
String result="";
OkHttpClient client=new OkHttpClient();
Request request=new Request.Builder()
.url(url)
.build();
try (Response response=client.newCall(request).execute()) {
result = response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
2.1.2 异步GET
public void nonSyncGet(String url, Callback responseCallback) {
String result = null;
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
Call call = client.newCall(request);
call.enqueue(responseCallback);
}
2.2 POST请求
2.2.1 同步POST
public static String postSynchronous(String url,String param){
String result="";
OkHttpClient client = new OkHttpClient();
MediaType type = MediaType.Companion.parse("application/json;charset=utf-8");
RequestBody responsebody = RequestBody.Companion.create(param,type);
Request request = new Request.Builder()
.url(url)
.post(responsebody)
.build();
try (Response response = client.newCall(request).execute()){
result = response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
2.2.2 异步POST
/**
* 异步POST
* @param url
* @param responseCallback
*/
public void nonSyncPost(String url, Callback responseCallback) {
String json = "test";
OkHttpClient client = new OkHttpClient();
//方法过时
//MediaType JSON = MediaType.parse("application/json; charset=utf-8");
//RequestBody body = RequestBody.create(JSON, json);
MediaType JSON = MediaType.Companion.parse("application/json;charset=utf-8");
RequestBody body = RequestBody.Companion.create(json,JSON);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
try {
client.newCall(request).enqueue(responseCallback);
} catch (Exception e) {
e.printStackTrace();
}
}