Retrofit使用详解

  • 1

简单示例


添加Gradle依赖项

在这里我们最好查看一下retrofit的官网添加最新依赖。

compile ‘com.squareup.retrofit2:retrofit:2.0.1’

  • 1

创建API接口

在retrofit中通过一个Java接口作为http请求的api接口。

public interface GitHubApi {

@GET(“repos/{owner}/{repo}/contributors”)

Call contributorsBySimpleGetCall(@Path(“owner”) String owner, @Path(“repo”) String repo);

}

  • 创建retrofit实例

在这里baseUrl是在创建retrofit实力的时候定义的,我们也可以在API接口中定义完整的url。在这里建议在创建baseUrl中以”/”结尾,在API中不以”/”开头和结尾。

Retrofit retrofit = new Retrofit.Builder()

.baseUrl(“https://api.github.com/”)

.build();

调用API接口

在调用API接口请求后,获得一个json字符串,通过Gson进行解析,获得login以及contributions。

GitHubApi repo = retrofit.create(GitHubApi.class);

Call call = repo.contributorsBySimpleGetCall(mUserName, mRepo);

call.enqueue(new Callback() {

@Override

public void onResponse(Call call, Response response) {

try {

Gson gson = new Gson();

ArrayList contributorsList = gson.fromJson(response.body().string(), new TypeToken<List>(){}.getType());

for (Contributor contributor : contributorsList){

Log.d(“login”,contributor.getLogin());

Log.d(“contributions”,contributor.getContributions()+“”);

}

} catch (IOException e) {

e.printStackTrace();

}

}

@Override

public void onFailure(Call call, Throwable t) {

}

});

效果展示

这样就完成了一个http请求,上面请求的完整地址为:https://api.github.com/repos/square/retrofit/contributors

然后我们看一下运行结果:

这里写图片描述

取消请求


我们可以终止一个请求。终止操作是对底层的httpclient执行cancel操作。即使是正在执行的请求,也能够立即终止。

call.cancel();

  • 1

转换器


在上面的例子中通过获取ResponseBody后,我们自己使用Gson来解析接收到的Json格式数据。在Retrofit中当创建一个Retrofit实例的时候可以为其添加一个Json转换器,这样就会自动将Json格式的响应体转换为所需要的Java对象。那么先来看一下如何根据已有的Json格式数据如何生成Java对象。当然我们可以根据已知的数据手动创建Java对象,也可以通过工具更具Json格式为我们自动生成Java对象。

自动生成Java对象

在这里介绍两种根据Json数据自动生成Java对象的工具。

jsonschema2pojo

可以通过访问jsonschema2pojo网站。先来看一下它的使用方法。

这里写图片描述

上面配置中所选注解若是使用的Gson解析,可以选择Gson,当然没有也是可以的。对于@Generated注解若是需要保留的话添加如下依赖,也可以直接删除@Generated注解,没有任何影响。

compile ‘org.glassfish:javax.annotation:10.0-b28’

  • 1
GsonFormat

GsonFormat是AndroidStudio中的一个插件,在AndroidStudio的插件选项中直接搜索安装这个插件即可。在这里看一下是如何使用这个插件的。

这里写图片描述

添加转换器

在这里我们需要为retrofit添加gson转换器的依赖。添加过converter-gson后不用再添加gson库。在converter-gson中已经包含gson。

compile ‘com.squareup.retrofit2:converter-gson:2.0.1’

  • 1

在这里先创建一个Java类Contributor,用来保存接收到的数据。

public class Contributor {

private String login;

private Integer contributions;

public String getLogin() {

return login;

}

public void setLogin(String login) {

this.login = login;

}

public Integer getContributions() {

return contributions;

}

public void setContributions(Integer contributions) {

this.contributions = contributions;

}

}

这时候修改我们的API接口。

@GET(“repos/{owner}/{repo}/contributors”)

Call<List> contributorsByAddConverterGetCall(@Path(“owner”) String owner, @Path(“repo”) String repo);

创建retrofit实例,我们通过addConverterFactory指定一个factory来对响应反序列化,在这里converters被添加的顺序将是它们被Retrofit尝试的顺序。

Retrofit retrofit = new Retrofit.Builder()

.baseUrl(“https://api.github.com/”)

.addConverterFactory(GsonConverterFactory.create())

.build();

调用上面所修改的API接口。

GitHubApi repo = retrofit.create(GitHubApi.class); Call<List<Contributor>> call = repo.contributorsByAddConverterGetCall(mUserName, mRepo); call.enqueue(new Callback<List<Contributor>>() { @Override public void onResponse(Call<List<Contributor>> call, Response<List<Contributor>> response) { List<Contributor> contributorList = response.body(); for (Contributor contributor : contributorList){ Log.d("login", contributor.getLogin()); Log.d("contributions", contributor.getContributions() + ""); } } @Override public void onFailure(Call<List<Contributor>> call, Throwable t) { } });``最后在来看一下运行结果。

这里写图片描述

retrofit不仅仅只支持gson,还支持其他许多json解析库。以下版本号需要与retrofit版本号保持一致,并且以retrofit官网给出的版本号为准。

  • Gsoncompile 'com.squareup.retrofit2:converter-gson:2.0.1'

  • Jacksoncompile 'com.squareup.retrofit2:converter-jackson:2.0.1'

  • Moshicompile 'com.squareup.retrofit2:converter-moshi:2.0.1'

  • Protobufcompile 'com.squareup.retrofit2:converter-protobuf:2.0.1'

  • Wirecompile 'com.squareup.retrofit2:converter-wire:2.0.1'

  • Simple XMLcompile 'com.squareup.retrofit2:converter-simplexml:2.0.1'

  • Scalars (primitives, boxed, and String): compile 'com.squareup.retrofit2:converter-scalars:2.0.1'

增加日志信息


在retrofit2.0中是没有日志功能的。但是retrofit2.0中依赖OkHttp,所以也就能够通过OkHttp中的interceptor来实现实际的底层的请求和响应日志。在这里我们需要修改上一个retrofit实例,为其自定自定义的OkHttpClient。代码如下:

HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();

httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

OkHttpClient okHttpClient = new OkHttpClient.Builder()

.addInterceptor(httpLoggingInterceptor)

.build();

Retrofit retrofit = new Retrofit.Builder().addCallAdapterFactory(RxJavaCallAdapterFactory.create())

.client(okHttpClient)

.baseUrl(“https://api.github.com/”)

.addConverterFactory(GsonConverterFactory.create())

.build();

还需要添加如下依赖。

compile ‘com.squareup.okhttp3:logging-interceptor:3.1.2’

其他代码没有任何变化,我们来看一下运行结果。

这里写图片描述

添加请求头


我们可以通过@Headers来添加请求头。

@Headers({

“Accept: application/vnd.github.v3.full+json”,

“User-Agent: RetrofitBean-Sample-App”,

“name:ljd”

})

@GET(“repos/{owner}/{repo}/contributors”)

Call<List> contributorsAndAddHeader(@Path(“owner”) String owner,@Path(“repo”) String repo);

运行结果。

这里写图片描述

同步请求


在这里我们可以直接通过call.execute()执行一个同步请求,由于不允许在主线程中进行网络请求操作,所以我们需要再子线程中进行执行。

new Thread(new Runnable() {

@Override

public void run() {

try {

Response<List> response = call.execute();

List contributorsList = response.body();

for (Contributor contributor : contributorsList){

Log.d(“login”,contributor.getLogin());

Log.d(“contributions”,contributor.getContributions()+“”);

}

} catch (IOException e) {

e.printStackTrace();

}

}

}).start();

在这里看一下运行结果。

这里写图片描述

clone


在这里无论是同步操作还是异步操作每一个call对象实例只能被执行一次。多次执行抛出如下异常。

这里写图片描述

在这里如果我们的request和respone都是一一对应的。我们通过Clone方法创建一个一模一样的实例,并且它的开销也是很小的。

Call<List> cloneCall = call.clone();

cloneCall.execute();

get请求


在前面的一些例子当中我们都是采用get请求。当然我们也可以为URL指定查询参数。使用@Query即可。

@GET(“search/repositories”)

Call queryRetrofitByGetCall(@Query(“q”)String owner,

@Query(“since”)String time,

@Query(“page”)int page,

@Query(“per_page”)int per_Page);

当我们的参数过多的时候我们可以通过@QueryMap注解和map对象参数来指定每个表单项的Key,value的值。

@GET(“search/repositories”)

Call queryRetrofitByGetCallMap(@QueryMap Map<String,String> map);

下面的call对象实例为上面api中所返回call对象。更具所返回的json数据所创建的实体类在这里就不在贴出代码,下载源码详细查看。

call.enqueue(new Callback() {

@Override

public void onResponse(Call call, Response response) {

RetrofitBean retrofit = response.body();

List list = retrofit.getItems();

if (list == null)

return;

Log.d(TAG, “total:” + retrofit.getTotalCount());

Log.d(TAG, “incompleteResults:” + retrofit.getIncompleteResults());

Log.d(TAG, “----------------------”);

for (Item item : list) {

Log.d(TAG, “name:” + item.getName());

Log.d(TAG, “full_name:” + item.getFull_name());

Log.d(TAG, “description:” + item.getDescription());

Owner owner = item.getOwner();

Log.d(TAG, “login:” + owner.getLogin());

Log.d(TAG, “type:” + owner.getType());

}

}

@Override

public void onFailure(Call call, Throwable t) {

}

});

上面请求中的完整连接为: https://api.github.com/search/repositories?q=retrofit&since=2016-03-29&page=1&per_page=3,运行结果如下。

这里写图片描述

在Retrofit 2.0添加了一个新的注解:@Url,它允许我们直接传入一个请求的URL。这样以来我们可以将上一个请求的获得的url直接传入进来。方便了我们的操作。

@GET

Call<List> repoContributorsPaginate(@Url String url);

Form encoded和Multipart


Form encoded

我们可以使用@FormUrlEncoded注解来发送表单数据。使用 @Field注解和参数来指定每个表单项的Key,value为参数的值。

@FormUrlEncoded

@POST(“user/edit”)

Call updateUser(@Field(“first_name”) String first, @Field(“last_name”) String last);

当我们有很多个表单参数时可以通过@FieldMap注解和Map对象参数来指定每个表单项的Key,value的值。

@FormUrlEncoded

@POST(“user/edit”)

Call updateUser(@FieldMap Map<String,String> fieldMap);

Multipart

我们还可以通过@Multipart注解来发送Multipart数据。通过@Part注解来定义需要发送的文件。

@Multipart

@PUT(“/user/photo”)

User updateUser(@Part(“photo”) TypedFile photo, @Part(“description”) TypedString description);

Retrofit与RxJava结合


Retrofit能够与RxJava进行完美结合。下面就来看一下Retrofit与RxJava是如何结合在一起的。对于RxJava在这就不在进行详细介绍,对于RXJava的使用可以参考附录里面给出链接。

首先我们需要添加如下依赖。

compile ‘com.squareup.retrofit2:adapter-rxjava:2.0.1’

compile ‘io.reactivex:rxandroid:1.1.0’

创建retrofit对象实例时,通过addCallAdapterFactory来添加对RxJava的支持。

HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();

httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

OkHttpClient okHttpClient = new OkHttpClient.Builder()

.addInterceptor(httpLoggingInterceptor)

.build();

Retrofit retrofit = new Retrofit.Builder()

.client(okHttpClient)

.addCallAdapterFactory(RxJavaCallAdapterFactory.create())

.addConverterFactory(GsonConverterFactory.create())

.baseUrl(“https://api.github.com/”)

.build();

使用Observable创建一个API接口。

@GET(“repos/{owner}/{repo}/contributors”)

Observable<List> contributorsByRxJava(@Path(“owner”) String owner,@Path(“repo”) String repo);

下面来调用这个API接口。

private CompositeSubscription mSubscriptions = new CompositeSubscription();

mSubscriptions.add(

mGitHubService.contributorsByRxJava(mUserName, mRepo)

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(new Observer<List>() {

@Override

public void onCompleted() {

}

@Override

public void onError(Throwable e) {

}

@Override

public void onNext(List contributors) {

for (Contributor c : contributors) {

Log.d(“TAG”, “login:” + c.getLogin() + " contributions:" + c.getContributions());

}

}

}));

下面来看一下运行结果。

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

如果你需要这些资料, ⬅ 专栏获取
ublic void onCompleted() {

}

@Override

public void onError(Throwable e) {

}

@Override

public void onNext(List contributors) {

for (Contributor c : contributors) {

Log.d(“TAG”, “login:” + c.getLogin() + " contributions:" + c.getContributions());

}

}

}));

下面来看一下运行结果。

最后

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

[外链图片转存中…(img-fuhWfx3q-1719253836651)]

[外链图片转存中…(img-dE0SEUwz-1719253836652)]

[外链图片转存中…(img-5mKgiqx8-1719253836652)]

[外链图片转存中…(img-WKZAAdVj-1719253836653)]

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

如果你需要这些资料, ⬅ 专栏获取

Retrofit是一个基于OkHttp的RESTful API库,可以方便地调用网络接口。下面是一个简单的示例,展示如何使用Retrofit调用接口。 首先,需要在项目中添加Retrofit的依赖项。可以在build.gradle文件中添加以下代码: ``` implementation 'com.squareup.retrofit2:retrofit:2.9.0' ``` 接下来,需要定义一个接口,用于描述要调用的API。这个接口需要使用注解来描述请求的方式、URL和请求参数等信息。例如: ``` public interface MyApi { @GET("users/{userId}/repos") Call<List<Repo>> listRepos(@Path("userId") String userId); } ``` 这个接口定义了一个名为listRepos的方法,该方法使用GET请求,URL为/users/{userId}/repos,其中{userId}是一个路径参数。该方法返回一个Call对象,表示异步调用API并返回一个List<Repo>对象。 接下来,需要创建一个Retrofit实例,并使用该实例创建一个API对象。例如: ``` Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com/") .build(); MyApi myApi = retrofit.create(MyApi.class); ``` 这里创建了一个基础URL为https://api.github.com/的Retrofit实例,并使用它创建了一个MyApi对象。 最后,可以调用API方法并处理响应。例如: ``` Call<List<Repo>> call = myApi.listRepos("octocat"); call.enqueue(new Callback<List<Repo>>() { @Override public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) { List<Repo> repos = response.body(); // 处理响应数据 } @Override public void onFailure(Call<List<Repo>> call, Throwable t) { // 处理请求失败 } }); ``` 这里使用listRepos方法异步调用API,并在响应时处理返回的数据。如果请求失败,则调用onFailure方法。 这就是使用Retrofit调用接口的基本流程。通过定义API接口并使用Retrofit创建API对象,可以方便地调用网络接口并处理响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值