OKHTTP3 简单使用(二) GET方法

GET请求有两种方式:

  1. 同步请求
  2. 异步请求

请求步骤:

  1. 创建OkHttpClient
  2. 构建Request
  3. 构建Call
  4. 发起请求Call#execute()/Call#enqueue(Callback)

两种请求的区别是同步请求通过Call#execute()提交请求,而异步请求时通过Call#enqueue(Callback)提交请求

同步GET请求

1
2
3
4
5
6
7
8
9
10
11
12
13
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
Call call = client.newCall(request);
try{
Response response = call.execute();
if(response.isSuccessful()){
String result = response.body().string();
}
} catch (IOException e) {
e.printStackTrace();
}

同步方式会造成线程阻塞,Android3.0之后不允许在主线程中进行网络请求,需要另起线程
同步方式会返回一个Response对象,通过Response可以获取到所有返回的数据

异步GET请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}

@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
}
});

异步方式本身就是在子线程中运行,因此不需要再创建新的线程
异步方式通过Callback返回数据,通过Callback#onResponse()返回一个Response对象来获取数据
由于异步方式在子线程中进行请求,因此如果需要在Callback#onResponse()或者Callback#onFailure()进行UI操作时需要切换到UI线程

设置参数

方式一:

将所有的参数拼接在连接后面,看着有点low,不利于二次封装

方式二:

在Request#Builder类中有三种设置url的方式

1
2
3
public Builder url(HttpUrl url)
public Builder url(String url)
public Builder url(URL url)

通过源码发现,下面两种方式最终都是转换成了HttpUrl
在HttpUrl中也有一个Builder内部类,同时该内部类提供了一个addQueryParameter的方法

1
public Builder addQueryParameter(String name, @Nullable String value)

对于该方法文档中的注释为

Encodes the query parameter using UTF-8 and adds it to this URL’s query string.

因此通过HttpUrl就可以更加优雅的添加参数了

1
2
3
4
5
6
7
HttpUrl httpUrl = HttpUrl.parse(url);
HttpUrl.Builder httpUrlBuilder = httpUrl.newBuilder();
httpUrlBuilder.addQueryParameter("Param name1", "Param value1");
httpUrlBuilder.addQueryParameter("Param name2", "Param value2");
Request request = new Request.Builder()
.url(httpUrlBuilder.build())
.build();

虽然多了几行代码,但是看着舒服,类似于POST请求的参数添加方式,如果参数比较多的情况下看起来更加整洁,便于二次封装