首先公布下我学习retrofit的思维导图

如果大家有需要这个思维导图,可在下面留言,我看到后会分享给你。

前言

什么是retrofit?

官方的回答是:

A type-safe HTTP client for Android and Java

翻译就是 用于Android和Java的类型安全HTTP客户端。 Rertofit其内部都是支持lambda语法(国内称只链式语法),内部支持okhttp, 并且支持响应式RxJAava,当然jdk1.8 和android studio工具也支持lambda。

Retrofit:

注意需要添加权限 

<uses-permission android:name="android.permission.INTERNET"/>

1 基本用法:

首先API接口需要这样写。

public interface GitHubService {@GET("users/{user}/repos")Call<List<Repo>> listRepos(@Path("user") String user);
}

接着生成一个 GitHubService对象 service

Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").build();GitHubService service = retrofit.create(GitHubService.class);

然后生成一个Call对象 repos,repos可以进行同步和异步请求 

Call<List<Repo>> repos = service.listRepos("octocat");

向服务器发起一个请求

repos.enqueue(new Callback<User>()
{@Overridepublic void onResponse(Call<User> call, Response<User> response){Log.e(TAG, "getUsePath:" + response.body());}@Overridepublic void onFailure(Call<User> call, Throwable t){}
});

完整的代码:

public interface GitHubService {@GET("users/{user}/repos")Call<List<Repo>> listRepos(@Path("user") String user);
}Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").build();GitHubService service = retrofit.create(GitHubService.class);Call<List<Repo>> repos = service.listRepos("octocat");repos.enqueue(new Callback<User>()
{@Overridepublic void onResponse(Call<User> call, Response<User> response){Log.e(TAG, "getUsePath:" + response.body());}@Overridepublic void onFailure(Call<User> call, Throwable t){}
});

2 请求方法:

每个方法都必须有一个提供请求方法和相对URL的HTTP注释。有五个内置注释:GET,POST,PUT,DELETE,和HEAD。

@GET (“users / list” )
@GET (“users / list?sort = desc” )//可以指定查询参数

2.1 @Get请求:

可以使用方法上的替换块和参数动态更新请求URL。替换块是由大括号里面的{字母数字字符串}。

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

也可以添加查询参数

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);

对于复杂的查询参数组合,可以使用Map。

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);

2.2@Post 请求:

基本用法

@POST("users/new")
Call<User> createUser(@Body User user);

表单编码和多个数据:

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

2.3 Put请求:

@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

@Multipart 可以用在单文件上传

@PartMap 用于多文件上传

 @Multipart@POST("register")Call<User> registerUser(@Part MultipartBody.Part photo, @Part("username") RequestBody username, @Part("password") RequestBody password);@Multipart@POST("register")Call<User> registerUser(@PartMap Map<String, RequestBody> params,  @Part("password") RequestBody password);

2.4 添加头部:

可以使用@Headers注解为一个方法设置静态头文件。项目需要添加头部就添加,不需要就不添加。

@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();
@Headers({"Accept: application/vnd.github.v3.full+json","User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);

同步与异步
Call实例可以同步或异步执行。每个实例只能使用一次,但调用clone()将创建一个可用的新实例。在Android上,回调将在主线程上执行。在JVM上,回调将发生在执行HTTP请求的同一个线程上。

3 Retrofit转换器

retrofit支持的转换器有以下几个:

Gson: com.squareup.retrofit2:converter-gson
Jackson: com.squareup.retrofit2:converter-jackson
Moshi: com.squareup.retrofit2:converter-moshi
Protobuf: com.squareup.retrofit2:converter-protobuf
Wire: com.squareup.retrofit2:converter-wire
Simple XML: com.squareup.retrofit2:converter-simplexml
Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars

下面是一个使用Gson的实例,把服务器返回的String类型数据转换为Json对象

Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com").addConverterFactory(GsonConverterFactory.create()).build();GitHubService service = retrofit.create(GitHubService.class);

4 Retrofit 下载 

jar包:

http://repo1.maven.org/maven2/com/squareup/retrofit2/retrofit/2.3.0/retrofit-2.3.0.jar

MAVEN:

<dependency><groupId>com.squareup.retrofit2</groupId><artifactId>retrofit</artifactId><version>2.3.0</version>
</dependency>

Gradle

compile 'com.squareup.retrofit2:retrofit:2.3.0'

5 混淆 PROGUARD

# Platform calls Class.forName on types which do not exist on Android to determine platform.
-dontnote retrofit2.Platform
# Platform used when running on Java 8 VMs. Will not be used at runtime.
-dontwarn retrofit2.Platform$Java8
# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature
# Retain declared checked exceptions for use by a Proxy instance.
-keepattributes Exceptions

6 Retrofit APi文档

http://square.github.io/retrofit/2.x/retrofit/

参考文章:

  • http://square.github.io/retrofit/
  • https://stackoverflow.com/questions/21890338/when-should-one-use-rxjava-observable-and-when-simple-callback-on-android
  • http://blog.csdn.net/lmj623565791/article/details/51304204
  • http://www.cnblogs.com/whoislcj/p/5539239.html

retrofit框架学习(一)----基本用法相关推荐

  1. retrofit框架学习(二)----retrofit封装

    retrofit 的封装 前言 上一篇文章的链接 http://blog.csdn.net/qq_26296197/article/details/78011188 1 上一篇文章讲到Retrofit ...

  2. Retrofit + Rxjava框架学习使用(举例:酷狗搜索和详情接口)

    在我上一篇博客Retrofit框架简单学习使用基础上修改. 依赖: dependencies {implementation 'com.squareup.retrofit2:retrofit:2.5. ...

  3. python中module用法_Python学习之module用法

    Python学习之module用法 Python学习之module用法 为什么80%的码农都做不了架构师?>>> Python has a way to put definition ...

  4. PyTorch框架学习十——基础网络层(卷积、转置卷积、池化、反池化、线性、激活函数)

    PyTorch框架学习十--基础网络层(卷积.转置卷积.池化.反池化.线性.激活函数) 一.卷积层 二.转置卷积层 三.池化层 1.最大池化nn.MaxPool2d 2.平均池化nn.AvgPool2 ...

  5. php框架费尔康,GitHub - majixian/study-phalcon: phalcon(费尔康)框架学习笔记

    phalcon(费尔康)框架学习笔记 以实例程序invo为例(invo程序放在网站根目录下的invo文件夹里,推荐php版本>=5.4) 环境不支持伪静态网址时的配置 第一步: 在app\con ...

  6. Query框架学习第九天:jQuery工具函数介绍与使用

    j jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用j ...

  7. jQuery框架学习第七天:jQuery动画–jQuery让页面动起来!

    jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQu ...

  8. jQuery框架学习第九天:jQuery工具函数介绍与使用

    jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQu ...

  9. Android图片加载框架 Glide 4 的用法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/78582548 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...

最新文章

  1. C# 利用SharpPcap实现网络包捕获嗅探
  2. AttributeError: ‘Request‘ object has no attribute ‘is_xhr‘ 报错
  3. 解决centos sudo执行仍旧显示Permission denied
  4. selenium3 + python - expected_conditions判断元素
  5. 【深度优先搜索】牛客网:剪绳子
  6. 在Spring+Hibernate项目中使用原生SQL进行查询和执行SQL处理
  7. 视觉SLAM十四讲 罗德里格斯公式推导 全解
  8. CRM 安装不规范,亲人两行泪
  9. foobox 3.8(foobar2000 CUI配置)
  10. 《富爸爸穷爸爸 》 读书笔记
  11. 美团店铺评价语言处理以及分类(tfidf,SVM,决策树,随机森林,Knn,ensemble)...
  12. 借助Jackson的JsonTypeInfo注解实现多态类的解析
  13. 明明都保意外,定期寿险和意外险到底区别在哪里?
  14. 阿里笔试模拟题-74.钱庄
  15. 护肤品行业竞争格局:2022年外资品牌护肤品占据主导地位
  16. java ldj_面试小记--python相关常识
  17. 【毕业设计】单片机家用燃气的可视化实时监控报警仪 - 物联网 嵌入式 stm32
  18. 揭秘:历史上十大被丢失的中国城市
  19. 史上R语言最强--资源(免费课程、书籍、教程和各种高级图表)
  20. 在w ndoWS7中屏幕保护程序,“屏保”存放在WINDOWS下的哪个文件夹 – 手机爱问

热门文章

  1. php markdown 文章目录,markdown 文本内跳转,生成目录
  2. Ubuntu 20.10 每日构建镜像已经可以下载测试
  3. 电子邮件地址验证:详细解释,生产质量WPF文本框代码
  4. OpenJS 基金会推出 Node.js 证书,JS 开发者可以“考证”了
  5. android activity焦点,android启动activity文本框不获得焦点
  6. 我的世界java版如何装mod_Minecraft如何安装Mod?Minecraft添加Mod的方法
  7. 艾为数字ic面试题_秋招 应聘FPGA/数字IC笔试面试经验分享(简单列举FPGA/数字IC公司)...
  8. 戴毅茹同济matlab,Stateflow系统建模(全)解读.pptx
  9. php期末考试题机考_phP基础知识期末考试题
  10. 干活的不如写ppt的吗_干活的干不过写PPT的?或许只是工作汇报的方式错了……...