介绍
简介
OkHttp 库的设计和实现的首要目标是高效。这也是选择 OkHttp 的重要理由之一。OkHttp 提供了对最新的 HTTP 协议版本 HTTP/2 和 SPDY 的支持,这使得对同一个主机发出的所有请求都可以共享相同的套接字连接。如果 HTTP/2 和 SPDY 不可用,OkHttp 会使用连接池来复用连接以提高效率。OkHttp 提供了对 GZIP 的默认支持来降低传输内容的大小。OkHttp 也提供了对 HTTP 响应的缓存机制,可以避免不必要的网络请求。当网络出现问题时,OkHttp 会自动重试一个主机的多个 IP 地址。
优势
- 允许连接到同一个主机地址的所有请求,提高请求效率
- 共享Socket,减少对服务器的请求次数
- 通过连接池,减少了请求延迟
- 缓存响应数据来减少重复的网络请求
- 减少了对数据流量的消耗
- 自动处理GZip压缩
功能
- get,post请求
- 文件的上传下载
- 加载图片(内部会图片大小自动压缩)
- 支持请求回调,直接返回对象、对象集合
- 支持session的保持
引入包
gradle
// https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp
compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.6.0'
maven
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.6.0</version>
</dependency>
原生API使用
package com.kingboy.test;
import okhttp3.*;
import org.junit.Test;
import java.io.IOException;
/**
* @Author kingboy
* @Date 2017/4/14 09:45
* @Description OkHttpTest is used to http
*/
public class OkHttpTest {
/**
* POST方式:测试网易云音乐歌曲搜索接口
* @throws IOException
*/
@Test
public void httpPostTest() throws IOException {
/**
* 准备好请求体
*/
FormBody formBody = new FormBody.Builder()
.add("s","hello")
.add("offset","5")
.add("limit","10")
.add("type","1")
.build();
/**
* 准备好访问的url和方式
*/
Request request = new Request.Builder()
.url("http://music.163.com/api/search/pc")
.post(formBody)
.build();
//构造访问实例
OkHttpClient httpClient = new OkHttpClient();
/**
* 执行访问
*/
Response execute = httpClient.newCall(request).execute();
if(execute.isSuccessful()){
ResponseBody body = execute.body();
String string = body.string();
System.out.println(string);
}else{
throw new IOException("访问失败!");
}
}
/**
* GET方式:测试百度首页
* @throws IOException
*/
@Test
public void httpGetTest() throws IOException {
/**
* 准备好访问的url和方式
*/
Request request = new Request.Builder()
.url("http://www.baidu.com")
.get()
.build();
//构造访问实例
OkHttpClient httpClient = new OkHttpClient();
/**
* 执行访问
*/
Response execute = httpClient.newCall(request).execute();
if(execute.isSuccessful()){
ResponseBody body = execute.body();
String string = body.string();
System.out.println(string);
}else{
throw new IOException("访问失败!");
}
}
}