OkHttp是由Square公司开发的,除了OkHttp 之外,还开发了 Picasso、Retrofit等著名的开源项目,现在已经成了广大Android开发者首选的网络通信库。OkHttp地址是:https://github.com/square/okhttp。
一般在Java平台上,我们会使用Apache HttpClient作为Http客户端,用于发送 HTTP 请求,并对响应进行处理。比如可以使用http客户端与第三方服务(如SSO服务)进行集成,当然还可以爬取网上的数据等。OKHttp与HttpClient类似,也是一个Http客户端,提供了对 HTTP/2 和 SPDY 的支持,并提供了连接池,GZIP 压缩和 HTTP 响应缓存功能;
HTTP是现代网络应用程序的方式。 这是我们如何与媒体交换数据。 做HTTP有效地使你的东西加载更快,节省带宽。
OkHttp默认是一个有效的HTTP客户端:
HTTP / 2支持允许所有请求相同的主机共享一个套接字。
连接池可以减少请求延迟(如果HTTP / 2不可使用)。
透明的GZIP收缩下载大小。
响应缓存避免了网络完全重复请求。
OkHttp坚守网络时麻烦:它会悄然从常见的连接问题中恢复过来。 如果你的服务有多个IP地址OkHttp将尝试备用地址如果第一个连接失败。 这是必要的I Pv4 + IPv6和服务驻留在冗余的数据中心。 与现代TLS OkHttp发起新连接特性(SNI ALPN),并落回TLS 1.0如果握手失败。
使用OkHttp很容易。 它的请求/响应API设计流畅建筑商和不变性。 它同时支持同步阻塞调用和异步调用回调。
OkHttp支持安卓2.3及以上。 对于Java,最低要求是1.7。
使用okhttp能够轻松调用其他第三方接口,思路如下
@Test
public void testGet() throws IOException {
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.url("http:www.baidu.com")
.build();
Response response = okHttpClient.newCall(request).execute();//同步请求
String result = response.body().string();
System.out.println(result);
}
@Test
public void testPost() throws IOException {
OkHttpClient okHttpClient = new OkHttpClient();
RequestBody body = new FormBody.Builder()
.add("param1","111")
.add("param2","222")
.build();
Request request = new Request.Builder()
.url("https://www.XXX.com/api/get")
.post(body)
.build();
Response response = okHttpClient.newCall(request).execute();//同步请求
String result = response.body().string();
System.out.println(result);
}
多参数写法:
FormBody.Builder builder = new FormBody.Builder();
for (String key : paramsMap.keySet()) {
builder.add(key, paramsMap.get(key));//追加表单信息
}
FormBody body = builder.build();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(JSON,json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute()
return response.body().string();
}
异步请求和同步请求在调用API的区别就是:发送请求那一块,同步请求是Response response = client.newCall(request).execute();
,而异步请求是:client.newCall(request).enqueue(new Callback());
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("www.baidu.com")
.build();
client.newCall(request).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();
setUI(responseData);
}
});
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("", "")
.build();
Request request = new Request.Builder()
.url("www.baidu.com")
.post(requestBody)
.build();
client.newCall(request).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();
System.out.println(responseData);
}
});
用简单通俗一点的语言说一下:
同步请求:同步请求是发送请求后,只能等服务器处理完这个请求,才能去干别的
异步请求:异步请求是发送请求后,服务器会在一边处理请求,中途可以去干别的
优劣:异步请求的优势很明显,所以开发中能用异步请求就用异步请求