- 有时间和能力的话会尝试研究一下retrofit的 源码.
本篇博客主要讲解以下问题
-
Retrofit简介
-
Retrofit的简单使用例子
-
Retrofit的get请求
-
Retrofit的put请求(提交表单数据)
-
如何为 retrofit添加header
-
如何提交json数据
Retrofit简介
Retrofit是square开源的网络请求库,底层是使用OKHttp封装的,网络请求速度很快.
主要有一下几种请求方法
| 格式 | 含义 |
| — | — |
| @GET | 表示这是一个GET请求 |
| @POST | 表示这个一个POST请求 |
| @PUT | 表示这是一个PUT请求 |
| @DELETE | 表示这是一个DELETE请求 |
| @HEAD | 表示这是一个HEAD请求 |
| @OPTIONS | 表示这是一个OPTION请求 |
| @PATCH | 表示这是一个PAT请求 |
各种请求注解的意思
| 格式 | 含义 |
| — | — |
| @Headers | 添加请求头 |
| @Path | 替换路径 |
| @Query | 替代参数值,通常是结合get请求的 |
| @FormUrlEncoded | 用表单数据提交 |
| @Field | 替换参数值,是结合post请求的 |
| @Body | 可以用来提交 Json 数据或者上传文件 |
Retrofit的简单使用例子
要使用retrofit请求网络数据,大概可以分为以下几步
- 1)添加依赖,这里以AndroidStudio为例:在build.grale添加如下依赖
compile ‘com.squareup.retrofit2:retrofit:2.1.0’
compile ‘com.squareup.retrofit2:converter-gson:2.1.0’
- 2) 创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder()
//使用自定义的mGsonConverterFactory
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(“http://apis.baidu.com/txapi/”)
.build();
mApi = retrofit.create(APi.class);
- 3)发起网络请求
mApi = retrofit.create(APi.class);
Call news = mApi.getNews(“1”, “10”);
news.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
}
@Override
public void onFailure(Call call, Throwable t) {
}
});
public interface APi {
@Headers(“apikey:81bf9da930c7f9825a3c3383f1d8d766”)
@GET(“word/word”)
Call getNews(@Query(“num”) String num,@Query(“page”)String page);
}
**到此一个简单的使用retrofit的网络请求就完成了。**接下来我们来了解retrofit的各种请求方式。
Retrofit的get请求
加入我们想请求这样的网址:http://apis.baidu.com/txapi/world/world?num=10&page=1,header为”apikey:81bf9da930c7f9825a3c3383f1d8d766”,我们可以这样请求:
第一步,在interface Api中 增加如下方法
@Headers(“apikey:81bf9da930c7f9825a3c3383f1d8d766”)
@GET(“word/word”)
Call getNews(@Query(“num”) String num,@Query(“page”)String page);
第二部,在代码里面请求
//创建retrofit对象
Retrofit retrofit = new Retrofit.Builder()
//使用自定义的mGsonConverterFactory
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(“http://apis.baidu.com/txapi/”)
.build();
// 实例化我们的mApi对象
mApi = retrofit.create(APi.class);
// 调用我们的响应的方法
Call news = mApi.getNews(number, page);
news.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
News body = response.body();
Logger.i(“onResponse: =”+body.toString());
}
@Override
public void onFailure(Call call, Throwable t) {
Logger.i(“onResponse: =”+t.getMessage());
}
});
解释说明
假设BaseUrl是http://apis.baidu.com/txapi/的前提下
-
1)其中 @GET(“word/word”)会追加到baseUrl :http://apis.baidu.com/txapi/的后面,即变成:http://apis.baidu.com/txapi/world/world
-
2)@Query(“num”) String num,@Query(“page”)String page;分别对应键值的名称与值。会追加到http://apis.baidu.com/txapi/world/world的后面,请求网址即变成:http://apis.baidu.com/txapi/world/world?num=10&page=1
-
3) @Headers(“apikey:81bf9da930c7f9825a3c3383f1d8d766”)是 在基础之上为 其添加响应头
-
4)如果想继续增加参数,只需要在方法参数追加这样的形式就OK了:
,@Query(“page”)String page
@Headers(“apikey:81bf9da930c7f9825a3c3383f1d8d766”)
@GET(“word/word”)
Call getNews(@Query(“num”) String num,@Query(“page”)String page,@Query(“type”) String type);
- 5)加入我们想要请求这样的网址http://apis.baidu.com/txapi/tiyu/tiyu?num=10&page=1,,我们可以这样写
@Headers({“apikey:81bf9da930c7f9825a3c3383f1d8d766” ,“Content-Type:application/json”})
@GET(“{type}/{type}”)
Call tiYu(@Path(“type”) String type, @Query(“num”) String num,@Query(“page”)String page);
String type=“tiyu”;
Call news = api.tiYu(type,number, page);
retrofit的post请求
假如我们想要 请求这样的网址http://apis.baidu.com/txapi/world/world?以post的 方式提交这样的 数据:num=10&page=1,我们可以写成 如下的 样子,注意post的时候必须使用@Field这种形式的注解,而不是使用@Query这种形式的注解,其他的 与get请求一样,这样只给出核心代码
@FormUrlEncoded
@Headers({“apikey:81bf9da930c7f9825a3c3383f1d8d766” ,“Content-Type:application/json”})
@POST(“world/world”)
Call postNews(@Field(“num”) String num, @Field(“page”)String page);
如何为retrofit添加请求头head
总共有以下几种方式
第一种方法
在OKHttpClient interceptors里面进行处理,这样添加的headKey不会覆盖掉 前面的 headKey
okHttpClient.interceptors().add(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
推荐学习资料
-
Android进阶学习全套手册
-
Android对标阿里P7学习视频
-
BAT TMD大厂Android高频面试题
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
片转存中…(img-uobqy9Ch-1714514962970)]
-
Android对标阿里P7学习视频
[外链图片转存中…(img-iX2mEL6A-1714514962970)]
-
BAT TMD大厂Android高频面试题
[外链图片转存中…(img-A6Ne1AQh-1714514962971)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!