GET请求有两种方式:
- 同步请求
- 异步请求
请求步骤:
- 创建OkHttpClient
- 构建Request
- 构建Call
- 发起请求Call#execute()/Call#enqueue(Callback)
两种请求的区别是同步请求通过Call#execute()提交请求,而异步请求时通过Call#enqueue(Callback)提交请求
同步GET请求
1 | OkHttpClient client = new OkHttpClient(); |
同步方式会造成线程阻塞,Android3.0之后不允许在主线程中进行网络请求,需要另起线程
同步方式会返回一个Response对象,通过Response可以获取到所有返回的数据
异步GET请求
1 | OkHttpClient client = new OkHttpClient(); |
异步方式本身就是在子线程中运行,因此不需要再创建新的线程
异步方式通过Callback返回数据,通过Callback#onResponse()返回一个Response对象来获取数据
由于异步方式在子线程中进行请求,因此如果需要在Callback#onResponse()或者Callback#onFailure()进行UI操作时需要切换到UI线程
设置参数
方式一:
将所有的参数拼接在连接后面,看着有点low,不利于二次封装
方式二:
在Request#Builder类中有三种设置url的方式1
2
3public 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
7HttpUrl 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请求的参数添加方式,如果参数比较多的情况下看起来更加整洁,便于二次封装