这是我参与「第四届青训营 」笔记创作活动的的第6天
一、前言
对应绝大部分应用来说,都离不开网络通信,通过网络通信可以让你的App更加的精彩丰富,比如实现实时新闻、聊天等功能。
文章的主要内容如下:
- 网络框架对比
- OkHttp的使用
- Retrofit的使用
二、网络框架对比
HttpURLConnection
HttpURLConnection是一个简单的请求类,如果用它实现一个规范化的请求,需要自己去完成很多内容的封装:线程池的管理、数据解析、请求日志等。所以我们一般不会直接用它,当然它的好处就是不需要引入新的包。
Volley
Volley也是Google官方推出的网络请求库,它不适合用来文件的上传与下载,而且现在停更了,因此也不推荐使用。
OkHttp & Retrofit
OkHttp是square公司推出的网络请求库,它可以设置拦截器,支持大文件上传和下载。而且基于NIO和Okio,它的性能会更好。
Retrofit也是square公司的产品,它可以看作OkHttp的封装,它拥有restful api设计风格,支持通过注解配置请求,还可以搭配各种Converter去将获取到的数据进行解析。
三、OkHttp的使用
1. 引入包
在项目下的app目录中的build.gradle中的dependencies中添加依赖
dependencies {
implementation("com.squareup.okhttp3:okhttp:4.10.0")
}
2. 开始使用
开始使用之前,我们需要在清单文件中添加网络请求权限。
<uses-permission android:name="android.permission.INTERNET"/>
我以每日一言的接口为例,为大家介绍一下怎么使用OkHttp。
Get请求
首先我们要创建一个OkHttpClient实例。
OkHttpClient client = new OkHttpClient();
接着我们创建一个请求实例,在build()之前我们可以设置很多内容,url表示我们要请求的对应网址,addHeader可以添加首部,还有很多方法,这里就不一一介绍了。
Request request = new Request.Builder()
.url("https://saying.api.azwcl.com/saying/get")
.build();
接着通过我们的OkHttpClient实例调用newCall方法传入我们的请求request,并返回一个Call对象。我们可以通过调用call对象的enqueue方法发送请求,并传入一个回调函数来接收响应信息。
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://saying.api.azwcl.com/saying/get")
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Log.d(TAG,"网络请求失败");
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
Log.d(TAG,"网络请求成功");
Log.d(TAG,"响应内容:" + response.body().string());
}
});
然后我们看一下log,一个请求就成功了。
POST请求
对于POST请求,我们需要传入数据。
首先创建一个RequestBody对象来存放参数。
RequestBody formBody = new FormBody.Builder()
.add("key", "value")
.build();
然后将我们的RequestBody对象添加到请求中。
Request request = new Request.Builder()
.url("xxx")
.post(formBody)
.build();
最后再根据通过newCall发送请求即可,后面的操作和Get请求一样。
OkHttp官网:square.github.io/okhttp/
四、Retrofit的使用
1. 引入包
在项目下的app目录中的build.gradle中的dependencies中添加依赖
dependencies {
// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
// Gson - json数据的转换器
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
}
2. 开始使用
开始使用之前,我们需要在清单文件中添加网络请求权限。
<uses-permission android:name="android.permission.INTERNET"/>
我以每日一言的接口为例,为大家介绍一下怎么使用Retrofit。
构建实体类
首先我们看一下接口的返回数据,我们以面向对象的方式根据下面的数据构建出实体类。
{"code":200,"data":{"author":"休谟","content":"用在事业上的精力,应该在多字上"}}
实体类如下。
public class Word {
private String author;
private String content;
// getter、setter
...
@Override
public String toString() {
return "Word{" +
"author='" + author + ''' +
", content='" + content + ''' +
'}';
}
}
public class Response {
private int code;
private Word data;
// getter、setter
...
@Override
public String toString() {
return "Response{" +
"code=" + code +
", data=" + data +
'}';
}
}
编写请求接口
可以看到,我们这里并没有写我们的接口网址前部分,这个后面会说到。
public interface MyService {
@GET("/saying/get")
Call<Response> getDaySaying();
}
发送请求
首先创建一个Retrofit.Builder的实例并设置好baseUrl以及数据转换器。
通过这个baseUrl我们可以把同一个网址前缀的接口统一提取出来,这个更贴近我们实际的开发。
Retrofit build = new Retrofit.Builder()
.baseUrl("https://saying.api.azwcl.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
然后通过这个build实例去创建我们接口的动态代理对象。
MyService myService = build.create(MyService.class);
然后再通过myService去调用我们的接口,返回的是一个Call,然后调用它的enqueue方法发送请求。
可以看到这里与不添加GsonConverterFactory的区别,这里我们请求成功之后返回的response中的body()方法返回的对象是我们之前创建好的实体类,这样更方便我们的工作。
Retrofit build = new Retrofit.Builder()
.baseUrl("https://saying.api.azwcl.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
MyService myService = build.create(MyService.class);
Call<Response> daySaying = myService.getDaySaying();
daySaying.enqueue(new Callback<Response>() {
@Override
public void onResponse(Call<Response> call, retrofit2.Response<Response> response) {
Log.d(TAG, "onResponse: " + response.body());
}
@Override
public void onFailure(Call<Response> call, Throwable t) {
Log.d(TAG, "onFailure: 请求失败" );
}
});
然后我们看一下log,一个请求就成功了。
Retrofit官网:square.github.io/retrofit/
五、总结
这里主要为大家介绍了android中常用的网络请求框架,以及比较热门的OkHttp与Retrofit的简单使用。
当然我比较推荐大家使用Retrofit。
相信很多学过Spring框架的小伙伴们看到Retrofit中我们创建的接口和Spring中Controller的方法很像,所以这更方便了我们的开发。
Retrofit除了以上的使用,还可以结合RxJava进行使用,返回Observable、Flowable等可以观察的对象。
还可以通过设置拦截器,去记录请求的日志或添加全局header等等操作,这些我就不一一介绍了。
六、结语
如果喜欢或有所帮助的话,希望能点赞关注,鼓励一下作者。
如果文章有不正确或存疑的地方,欢迎评论指出。