Retrofit使用简介
Retrofit
Retrofit是一个整合的Http网络请求框架封装。
1.简单使用Restrofit
1.1 在gradle文件中添加依赖
compile 'com.squareup.retrofit2:retrofit:2.0.2'
1.2 定义接口
作为http请求,必然包含了get请求和post请求,而请求方式通过注解来进行。@GET用于指定get请求,而@FormurlEncoded、@POST用于Post请求。@Multipart用于指定流部分传输。
//GET请求方式
public interface 接口名称{@GET("请求path")Call<Response对象> 请求方法名(@Query("请求参数名") 请求参数类型 请求参数对象)
}//GET请求 ————定义接口示例
public interface UserService{@GET("/getuser")Call<User> getUser(@Query("userName") String name);
}//POST请求 ————POST请求需要多加一个注解
public interface UserService{@FormUrlEncoded@POST("/getuser")Call<User> getUser(@Field("userName") String name);
}
定义方式从代码分析:
1. 定义接口,创建相关网络功能部分
2. 选定注解,依照请求方式与请求内容选择目标,注解参数为相关url
3. 设置相关方法,设定相关参数与返回值。
1.3 构建Retrofit对象
Retrofit retrofit = new Retrofit.Builder().baseUrl("请求base路径").build();
UserService userService = retrofit.creat(UserService.class);
1.4 请求网络
Call<User> requ = userService.getUser("maye");//同步网络请求
User user = requ.execute();//异步网络请求
requ.enqueue(new CallBack<User>(){@Overridepublic void onResponse(Call<Person> call, Response<Person> response) {//回调事件在UI线程中,能够进行UI操作}@Overridepublic void onFailure(Call<Person> call, Throwable t) {//回调事件在UI线程中,能够进行UI操作}
});
以上代码是用于演示的。大部分情况下,在项目中同时使用两种网络请求是没有必要且无意义的,以上代码目的时展示网络请求的两种方式。
execute()是同步方法,耗时操作可能会导致线程阻塞
enqueue()是异步方法,异步执行
2.Retrofit小进阶
2.1文件上传
//接口部分
public interface UploadService{@Multipart@POST("")Call<ResponseBody> upload(@Part("description") RequestBody description,@Part MultipartBody.Part part);
}/**文件上传**/
Retrofit retrofit = new Retrofit.Builder().baseUrl("").build();
UploadService uploadService = retrofit.create(UploadService.class);//封装description
String descriptionString = "upload file";
RequestBody description = RequestBody.create(MediaType.parse("multipart/form-data"), descriptString);//获取文件对象
File file = new File("");
//封装文件
RequestBody requestFile = RequestBody.create(MediaType.parse("applicaiton/otcet-stream"), file);
MultipartBody.Part body = MultipartBody.Part.create("File", file.getName(), requestFile);//上传请求
Call<ResponseBody> request = uploadService.upload(description, body);
request.enqueue(new CallBack<ResponseBody>(){public void onResponse(){}public void onFailure(){}
})
以上就是一次基本的文件上传过程。下面将从代码逐步解析这一过程:
1. 接口定义,设置@Multipart注解,设定流媒体传递方式,选用@POST作为请求类型。
2. 获取文件对象,依照application/otcet-stream将文件封装为RequestBody。
3. 将封装文件的RequestBody封装至MultipartBody.Part对象中。
4. 创建描述String,依照multipart/form-data将String封装至RequestBody。
5. 调用接口中方法上传RequestBody与Multipart.Part对象。
6. 没了
2.2自定义RequestBodyConverter
上传的过程思路比较清晰了,然而完成这一个步骤我们创建了3个实例,为啥不直接把File传出去,而要传一个Multipart.Part类型的对象。这是因为在默认状态下使用的requestBodyConverter是GsonRequestBodyConverter,这个Converter默认是将requestBody作为Json数据处理的。
class FileRequestBodyConvert implemets Converter<File, RequestBody>{public RequestBody convert(File file) throws IOExcetion{return RequestBody.create(MultiType.parse("application/otcet-stream"), file);}}class FileRequestConvertFactory extends Converter.Factory{public Converter<File, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) { return new FileRequestBodyConverter();}
}
2.3自定义ResponseBodyConverter
之前的文件上传完成了自定义的RequestBody,将数据按照自定义的内容传递,那么当我们有一些特殊要处理的ResponseBody的时候,同样可以对它进行处理。
GsonConverterFactory这个Convertr大家应该有点印象,默认提供的json格式ResponseBody处理Converter。当有特殊格式的ResonseBody时,我们就可以自定义一个Converter进行处理。
实现方式:
// 1.首先定义最终需要的结果类class Result{String name;String hobby;int age;
}// 2.定义将ResponseBody转换为Result的类
class ResultConverter implements Converter<Response, Result>{public Result convert(Response response) throws IOException{}
}// 3.定义相应Factory ————参考一下GsonConverterFactory
public final class GsonConverterFactory extends Converter.Factory {public static GsonConverterFactory create() {return create(new Gson());}public static GsonConverterFactory create(Gson gson) {return new GsonConverterFactory(gson);}private final Gson gson;private GsonConverterFactory(Gson gson) {if (gson == null) throw new NullPointerException("gson == null");this.gson = gson;}@Overridepublic Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,Retrofit retrofit) {TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));return new GsonResponseBodyConverter<>(gson, adapter);}
}"我去除了一些复杂的重载,保留下关键的部分,可以看到Factory其实就是一次简单的实例化而已。那么照葫芦画瓢,完成我们的ResultFactory"//没有太多功能的Factory看起来比较简单
public final class ResultConverterFactory extends Converter.Factory{public static ResultConverterFactory create(){retrun new ResultConverterFactory();}public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,Retrofit retrofit){return new ResultConverter<>();}
}
总结
这次的文章是个小短篇,不过只涉及到了使用部分,关于内部的原理还没有涉及,因为最近确实有点忙,还有一篇MVP要写,所以关于原理可能在之后再做编辑。
刚才有人说什么屁股先锋的,我根本没有听过,什么甄姬的我都没玩过,嗯,是因为工作忙才没更的。。。
再有就是之前的RxJava,太惨了,我必须要打广告。
RxJava使用简介:http://blog.csdn.net/baidu_20596139/article/details/52145608
继续交流学习。
开黑吗 我源氏贼6!!!
Retrofit使用简介相关推荐
- 开源框架相关面试问题-retrofit网络框架面试问题讲解
retrofit使用简介: 在retrofit中通过一个接口作为Http请求的api接口. 注意:@GET("url")中的url只是一个路径,不包含主机号的. 创建一个retro ...
- 自己动手,实现一款轻量级 HTTP 调用工具
今日推荐 吊打 ThreadLocal,谈谈FastThreadLocal为啥能这么快?一个Github项目搞定微信.QQ.支付宝等第三方登录注解+反射优雅的实现Excel导入导出(通用版)Fluen ...
- 实现自己的轻量级http调用工具
本文来源:http://8rr.co/SUbF 本篇文章继介绍retrofit-spring-boot-starter的实现原理,从零开始介绍如何在spring-boot项目中基于Retrofit实现 ...
- Retrofit简介
1.Retrofit干什么的? Retrofit让你便捷地封装出一个类来给其它地方调用和服务器进行HTTP API调用. 比如,一般来说,不用retrofit的时候,你需要填写http参数,然后get ...
- Reading-又更新了一些内容【Kotlin+MVP+Retrofit】
Reading Kotlin版本--github.com/Hankkin/Rea- Flutter版本--github.com/Hankkin/rea-(待完善) 简介 Reading: Readin ...
- Retrofit 2.0
1.简介 2.使用介绍 1:添加Retrofit库的依赖 1. 在 Gradle加入Retrofit库的依赖 build.gradle dependencies {compile 'c ...
- Android:手把手带你深入剖析 Retrofit 2.0 源码
前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将手把手带你深入剖析Retrofit v2.0的源码,希望你们会喜 ...
- 如何使用Retrofit,OkHttp,Gson,Glide和Coroutines处理RESTful Web服务
Kriptofolio应用程序系列-第5部分 (Kriptofolio app series - Part 5) These days almost every Android app connect ...
- Retrofit的网络框架介绍
Retrofit简介 Retrofit是square开源的网络请求库,底层是使用OKHttp封装的,网络请求速度很快. 主要有一下几种请求方法 格式 含义 @GET 表示这是一个GET请求 @POST ...
最新文章
- 关于.NET玩爬虫这些事 【初码干货】
- 阿里云 物联网产品架构
- seg是伪操作符,用来取后面符号的段地址
- 用node搭一个静态服务
- 机器人布里茨说什么_LOL蒸汽机器人布里茨英雄介绍、技能加点、技巧攻略 机器人出什么装备...
- 【Linux】一步一步学Linux——w命令(97)
- 论文浅尝 | 利用图 Transformer 实现基于知识图谱的文本生成
- abstract class和interface的区别
- 在Git中找到破坏测试的提交
- Redis学习-性能与优化(五)
- NULL指针的奇妙之旅
- IReport导出PDF字体加粗失效
- 子元素和后代元素的区别
- 初一计算机教学论文,初中信息技术教学论文
- 机器人操作的“圣杯问题” -- Bin Picking
- RMA退货流程解决方案
- 正确处理Ordered Broadcasts
- G1D19-DPCS KEAttacKG复现
- JavaScript纯前端解析Excel文件
- 鸿蒙OS架构及关键技术整理
热门文章
- java jframe 图片_java中JFrame添加背景图片
- [PCL教程] PCL漫游之Filter、Features
- 专家观点——唐福林谈Redis应用实践
- mmse评估量表_简易精神状态评价量表(MMSE)
- 计算机科学与技术世界一流学科,2019上海软科世界一流学科排名计算机科学与工程专业排名香港科技大学排名第51-75...
- 谷歌钦定的编程语言Kotlin大揭秘
- MATLAB图形变换——绘制三角形
- 日历记事本java_日历记事本-JAVA课程设计..
- Java8新特性-使用Stream流来实现递归遍历树形结构(案例)
- 2022-11-12-读书