- 简单介绍OkHttp的使用
- OkHttp相关类解析
For:能够通过OkHttp发送请求并处理响应
简单介绍OkHttp的使用
- 简单的发送GET请求的demo
private void sendGet() {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("https://www.baidu.com").get().build();
Call call = client.newCall(request);
try {
Response response = call.execute();
String string = response.body().string();
Log.i(TAG, "body:" + string);
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
- 实例化OkHttpClient对象
- 构建Request请求体
- 通过client生成Call对象
- 通过Call对象发送同步或异步请求,获得响应体Response
- 读取数据
OkHttp相关类解析
OkHttpClient
- 提供默认的构造器,一般封装成一个单例对象,所有请求共享。
- OkHttpClient.Builder可以设置客户端的属性
(1)超时
(2)拦截器
Request
通过Request.Builder连缀请求信息与请求参数,创建Request
Request.Builder常用方法:
- url()
public Builder url(String url)
url()方法支持传入的参数有:String、URL、HttpUrl。最后统一封装为HttpUrl。
- method()
public Builder method(String method, @Nullable RequestBody body)
常用的HTTP请求如:get()、post()、put()、delete()...都是调用了method方法
- header()与addHeader()
public Builder header(String name, String value)
public Builder addHeader(String name, String value)
设置Header头,header()方法会覆盖值,addHeader可以添加多个值
常见Header:
- User-Agent
- Cookie
- Accept
发送Post请求或者Put请求需要RequestBody
#RequestBody.Builder
public static RequestBody create(@Nullable MediaType contentType, String content)
最常见的MediaType即:application/json。
其他还有:text/plain、application/xml等
#MediaType
public static MediaType parse(String string)
构建一个GET请求(默认)
Request request = Request.Builder()
.url("https://www.baidu.com")
.header("User-Agent", "OkHttp Headers.java")
.addHeader("Accept", "application/json")
.addHeader("Accept", "application/vnd.github.v3+json")
.build();
构建一个POST请求
MediaType mediaType = MediaType.parse("application/json");
RequestBody requestBody = RequestBody.create(mediaType, jsonString);
Request request = Request.Builder()
.url("https://www.baidu.com")
.post(requestBody)
.build();
通过Request,可以设置url中的path参数、query参数,请求体body,请求首部Header,请求方法
Call
首先,得到Call对象
Call call = client.newCall(request);
之后,可以通过Call来发送同步请求或异步请求
同步请求
Response execute() throws IOException;
- 需要在子线程中调用,在主线程中调用会抛异常
- 会阻塞当前线程(即发送网络请求的子线程)
- 使用完Response后需要close()以避免内存泄露
- 一个Call对象只能执行一次,否则会抛出运行异常
- 由于超时、取消等情况会抛出IOException
异步请求
void enqueue(Callback responseCallback);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
- 传入回调,在异常情况(超时、取消)下回调onFailure(),成功则回调onResponse(),之后可读取参数Response
- 可以在主线程调用,不会阻塞线程,回调将在子线程中进行
Response
可以通过Response获得HTTP响应中的信息
- 状态码
public int code()
- 原因短语
public String message()
- 响应首部
public Headers headers()
- 响应体
public ResponseBody body()
ResponseBody
- 当响应数据量较小时:
public final String string()
可以获得返回的字符串,
public final byte[] bytes()
可以获得二进制字节数组
- 数据量大时:
public final InputStream byteStream()
可以获得流
- 获得数据类型以及长度
public MediaType contentType()
public long contentLength()
contentType可以表明返回string的类型
contentLength是字节数
网友评论