- OkHttp由Square公司开发,其不仅在接口封装上面做的简单易用,
就连在底层实现上也是自成一派,
比起原生的HttpURLConnection,可以说是有过之而无不及,
现在已经成了广大Android开发者的首选网络通信库。
- OkHttp项目主页地址:https://github.com/square/okhttp
- 使用之前,需添加OkHttp库依赖,
打开app/buid.gradle,在dependencies闭包中添加如下内容:
implementation("com.squareup.okhttp3:okhttp:3.14.0")
添加此依赖,会自动下载两个库:OkHttp库、Okio库(是前者的通信基础)。
- 注意,添加前最好是访问一下OkHttp项目主页查看当前最新的版本是多少,再在gradle处添加依赖;
下面是OkHttp具体用法
- 首先,需要创建OkHttpClient实例,如下:
OkHttpClient client = new OkHttpClient();
- 接下来,如想发起一条HTTP请求,需创建
Request对象
:
Request request = new Request.Builder().build();
- 当然上述代码只是创建一个空的Request对象,
需要在build()方法之前可连缀很多其他方法丰富此Request对象。
Request request = new Request.Builder()
.url("https://www.baidu.com")
.build();
- 之后调用OkHttpCilent的newCall()方法创建一个
Call对象
,
并调用它的execute()
方法发送请求
,
并获取服务器
返回的数据:
Response response = client.newCall(request).execute();
- request存请求;
- newCall接收request
- execute执行request
- Response对象接收服务器返回的数据;
- 下面得到返回的具体内容
String responseData = response.body().string();
如果发起一条POST请求,会比GET复杂些;
- 需先构建
RequestBody
对象存放待提交的参数
:
RequestBody requestBody = new FormBody.Builder()
.add("username", "admin")
.add("password", "123456")
.build();
- 然后在
Request.Builder
中以RequestBody
对象为传入的参数调用post()
方法,:
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(requestBody)
.build();
- 接下来的操作就和
GET
请求一样了,
调用execute()
方法发送请求并获取服务器返回的数据即可。
另外注意OkHttp可以把最后执行的execute()
方法换成enqueue(callback)
,
即调用enqueue()
并接收一个框架提供的okhttp3.Callback
接口;
public static void sendOkHttpRequest(String address, okhttp3.Callback callback){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(address).build();
client.newCall(request).enqueue(callback);//enqueue方法内部已经开好了子线程
}
使用时,复写okhttp3.Callback
的onResponse()
和onFailure()
两个方法,
处理成功请求
和请求失败
的情况;
sendOkHttpRequest("https://www.baidu.com", new okhttp3.Callback(){
@Override
public void onResponse(Call call, Response response) throws IOException{
//得到服务器返回的具体数据
String reponseData = reponse.body().string();
}
@Override
public void onFailure(Call call, IOException e){
//在这里对异常情况进行处理
}
});