zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Retrofit全攻略——基础篇

基础 全攻略 Retrofit
2023-09-27 14:24:59 时间
//如果用到gson解析 需要添加下面的依赖 compile com.squareup.retrofit2:converter-gson:2.1.0 }

我们以查号码归属地接口为例 https://www.juhe.cn/docs/api/id/11

Retrofit不能直接使用,需要进行初始化,在这里创建NetWork.java


if(retrofit==null){ Retrofit.Builder builder = new Retrofit.Builder();//创建Retrfit构建器 retrofit = builder.baseUrl("http://apis.juhe.cn/") //指定网络请求的baseUrl .addConverterFactory(GsonConverterFactory.create())//返回的数据通过Gson解析 .build(); return retrofit; }

Retrofit需要之地baseUrl,往往一个项目中有很多接口,接口都使用相同的服务器地址,这时候可以把接口地址相同的部分抽取到baseUrl中,Retrofit扩展性极好,可以指定返回的数据通过Gson解析,前提你需要保证项目中有Gson框架和com.squareup.retrofit2:converter-gson:2.1.0的依赖。


Gson: com.squareup.retrofit:converter-gson Jackson: com.squareup.retrofit:converter-jackson Moshi: com.squareup.retrofit:converter-moshi Protobuf: com.squareup.retrofit:converter-protobuf Wire: com.squareup.retrofit:converter-wire Simple XML: com.squareup.retrofit:converter-simplexml
public interface NetInterface {

 //获取号码归属地,返回来类型是Bean, 需要两个参数分别为phone何key

 @GET("mobile/get")

 Call Bean getAddress(@Query("phone") String phone, @Query("key") String key);

}

其中Bean是根据请求的结果创建的对象.

方法前添加@GET注解表示当前请求是Get方式请求,链接的地址是baseUrl+”mobile/get”,baseUrl在初始化Retrofit的时候指定了,拼到一起就是 http://apis.juhe.cn/mobile/get
对于 Retrofit 2.0中新的URL定义方式,这里是我的建议:


@DELETE 表明这是delete请求 @PATCH 表明这是一个patch请求,该请求是对put请求的补充,用于更新局部资源 @HEAD 表明这是一个head请求 @OPTIONS 表明这是一个option请求 @HTTP 通用注解,可以替换以上所有的注解,其拥有三个属性:method,path,hasBody

最后的HTTP通用注解写法比较特殊,请求可以代替之前的请求。下面的写法和之前的@GET效果是一样的。


@HTTP(method = "get",path = "mobile/get",hasBody = false) Call Bean getAddress(@Query("phone") String phone, @Query("key") String key);

@Quert表示查询参数,用于GET查询,注解里的字符串是参数的key值,参数会自动拼装到Url后面。
除了上面的注解,再给大家介绍几种不同的注解。


@Streaming @GET Call ResponseBody downloadFileWithDynamicUrlAsync(@Url String fileUrl);


long fileSize = body.contentLength(); InputStream inputStream = body.byteStream();

@Path:URL占位符,用于替换和动态更新,相应的参数必须使用相同的字符串被@Path进行注释


//实际请求地址会给句groupId的值发生变化-- http://baseurl/group/groupId/users

@GET("group/{id}/users") Call List User groupList(@Path("id") int groupId);

@QueryMap:查询参数,和@Query类似,区别就是后面需要Map集合参数。示例代码:


Call List News getNews((@QueryMap(encoded=true) Map String, String options);

@Body:用于POST请求体,将实例对象根据转换方式转换为对应的json字符串参数,这个转化方式是GsonConverterFactory定义的。 示例代码:


@Field,@FieldMap:Post方式传递简单的键值对,需要添加@FormUrlEncoded表示表单提交


@FormUrlEncoded @POST("user/edit") Call User updateUser(@Field("first_name") String first, @Field("last_name") String last);

@Part,@PartMap:用于POST文件上传,其中@Part MultipartBody.Part代表文件,@Part(“key”) RequestBody代表参数,需要添加@Multipart表示支持文件上传的表单。


@POST("upload") Call ResponseBody upload(@Part("description") RequestBody description, @Part MultipartBody.Part file);

了解了Retrofit,我们用Retrofit请求完成请求,Retrofit使用起来比较省事,核心代码如下所示:


//初始化Retrofit,加载接口

NetInterface netInterface = NetWork.getRetrofit().create(NetInterface.class);

//请求接口

netInterface.getAddress(editText.getText().toString(),"你的app key")

 .enqueue(new Callback Bean () {

 @Override

 public void onResponse(Call Bean call, Response Bean response) {

 //请求成功

 Bean bean = response.body();

 //...

 @Override

 public void onFailure(Call Bean call, Throwable t) {

 //请求失败

Retrofit会自动在子线程中进行网络请求,请求结束切换到主线程中,而且内部使用了线程池,对网络请求的缓存控制的也非常到位,网络响应速度也是很快的,使用起来非常的爽!


RxJava非常强大,就连Retrofit都要抱下他的大腿,Retrofit也可以用RxJava方式进行网络请求,只需要对上面的代码进行改造即可。


//如果用到gson解析 需要添加下面的依赖 compile com.squareup.retrofit2:converter-gson:2.1.0 //Retrofit使用RxJava需要的依赖 compile com.squareup.retrofit2:adapter-rxjava:2.1.0

修改Retrofit初始化的代码:


上面代码我们通过,添加代码addCallAdapterFactory(RxJavaCallAdapterFactory.create())就变成了使用RxJava模式。

接口也需要修改,把方法的返回值类型由Call改成了RxJava中的Observable。


public interface NetInterface {

 //获取号码归属地,返回来类型是Bean, 需要两个参数分别为phone何key

 @GET("mobile/get")

 Observable Bean getAddress(@Query("phone") String phone, @Query("key") String key);

}

接下来修改最终网络请求的代码,可以改成RxJava方式了。


 NetInterface netInterface = NetWork.getRetrofit().create(NetInterface.class);

 //RxJava方式

 netInterface.getAddress(editText.getText().toString(),"你的app key")

 .subscribeOn(Schedulers.io())//设置网络请求在子线程中

 .observeOn(AndroidSchedulers.mainThread())// 回调在主线程中

 .subscribe(new Action1 Bean () {

 @Override

 public void call(Bean bean) {

 //请求成功

 }, new Action1 Throwable () {

 @Override

 public void call(Throwable throwable) {

 //请求失败

 });

Dubbo3 源码解读-宋小生-16:模块发布器发布服务全过程 完整电子书下载地址: https://developer.aliyun.com/ebook/7894 Dubbo3 已经全面取代 HSF2 成为阿里的下一代服务框架,2022 双十一基于 Dubbo3 首次实现了关键业务不停推、不降级的全面用户体验提升,从技术上,大幅提高研发与运维效率的同时地址推送等关键资源利用率提升超 40%,基于三位一体的开源中间件体系打造了阿里在云上的单元化最佳实
Disconf源码解析(第一章) 用过Disconf的小伙伴都知道,这两个Bean配置是必不可少的,那么这两个Bean的作用是什么呢?其实很简单,Disconf有一个Web端,第一个DisconfMgrBean的作用就是从Web端下载配置文件,然后解析配置文件将配置信息存到Disconf配置仓库中,而DisconfMgrBeanSecond的作用就是给带有@DisconfFile注解的bean或者带有@DisconfItem注解的配置项注值。
Android体系课学习 之 网络请求库Retrofit源码分析-看这一篇就够了 - 网络请求在我们开发中起的很大比重,有一个好的网络框架可以节省我们的开发工作量,也可以避免一些在开发中不该出现的bug - *Retrofit*是一个轻量级框架,基于*OkHttp*的一个*Restful*框架
【SpringBoot基础系列】手把手实现国际化支持实例开发 国际化的支持,对于app开发的小伙伴来说应该比价常见了;作为java后端的小伙伴,一般来讲接触国际化的机会不太多,毕竟业务开展到海外的企业并没有太多 SpringBoot提供了国际化的支持,网上也有相关的教程,然而实际体验的时候,发现并没有预期的那么顺利;本文将介绍一下SpringBoot如何支持国家化,以及在支持的过程中,一些注意事项
搭建直播源码与软件开发的注意事项 搭建自己的直播平台,实现利益最大化,但网上打广告的技术公司太多,源码质量却良莠不齐,那么该如何搭建直播源码就成了问题。
先回顾下之前的 【Android架构】基于MVP模式的Retrofit2+RXjava封装(一)【Android架构】基于MVP模式的Retrofit2+RXjava封装之文件下载(二)【Android架构】基于MVP模式的Retrofit2+RXjava封装之文件上传(三) 今天要说的是使用Retrofit2和Okhttp 过程中遇到的一些问题。
上篇中我们介绍了基于MVP的Retrofit2+RXjava封装,还没有看的点击这里,这一篇我们来说说文件下载的实现。 首先,我们先在ApiServer定义好调用的接口 @GET Observable downloadFile(@Url St...
先回顾下之前的 【Android架构】基于MVP模式的Retrofit2+RXjava封装(一)【Android架构】基于MVP模式的Retrofit2+RXjava封装之文件下载(二) 今天要说的是文件上传
于连林520wcf 【爱上Android】作者,从事Android开发和教育多年,担当多个重点项目的负责人,项目涉及办公类、O2O、医疗等多元化类型,曾在培训机构从事Android教育多年,有上千课时讲课经验。