[旧][Android] Retrofit 初步使用
备注
原发表于2016.04.13,资料已过时,仅作备份,谨慎参考
Retrofit 是什么?
Retrofit is a type-safe HTTP client for Android and java.
互联网上的资料很多很杂,在收集资料初步了解后,我先粗糙地认为:Retrofit 适用于与 Web 服务器提供的 API 接口进行通信。
当你想要做更多的 HTTP 操作时,可以使用 OkHttp,Retrofit的底层也是由 OkHttp 网络加载库来支持的。
关于 Retrofit 的原理,有三个十分重要的概念:『注解』,『动态代理』,『反射』。将会在以后逐步进行分析。
初步使用 Retrofit
Retrofit 在使用上与其他网络开源库有些区别,初次使用可能会感到困惑,其使用主要有四个步骤。
在使用前,我们首先假设我们要从某个 API 接口来获取数据,这里我们使用一位博主所提供的接口。接口的 URL 地址如下:
添加依赖和权限
在 build.gradle 文件中添加依赖,在 Manifest.xml文件中添加所需的网络权限。
// build.gradle
compile 'com.squareup.retrofit:retrofit:2.0.1-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
// AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
在 Retrofit 2.0 中,如果要将 JSON 数据转化为 Java 实体类对象,需要自己显式指定一个 Gson Converter。
定义接口
在这一步,需要将我们的 API 接口地址转化成一个 Java 接口。
我们的 API 接口地址为:
转化写成 Java 接口为:
public interface APIInterface {
@GET("/users/{user}")
Call<TestModel> repo(@Path("user") String user);
在后文构造 Retrofit 对象时会添加一个 baseUrl(https://api.github.com)。
在此处 GET 的意思是 发送一个 GET请求,请求的地址为:baseUrl + "/users/{user}"。
{user} 类似于占位符的作用,具体类型由 repo(@Path("user") String user) 指定,这里表示 {user} 将是一段字符串。
Call 是一个请求对象,表示返回结果是一个 TestModel 类型的实例。
定义 Model
请求会将 Json 数据转化为 Java 实体类,所以我们需要自定义一个 Model:
public class TestModel {
private String login;
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
}
进行连接通信
现在我们有了『要连接的 Http 接口』和 『要返回的数据结构』,就可以开始执行请求啦。
首先,构造一个 Retrofit 对象:
Retrofit retrofit= new Retrofit.Builder()
.baseUrl("https://api.github.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
注意这里添加的 baseUrl 和 GsonConverter,前者表示要访问的网站,后者是添加了一个转换器。
接着,创建我们的 API 接口对象,这里 APIInterface 是我们创建的接口:
APIInterface service = retrofit.create(APIInterface.class);
使用 APIInterface 创建一个『请求对象』:
Call<TestModel> model = service.repo("Guolei1130");
注意这里的 .repo("Guolei1130") 取代了前面的 {user}。到这里,我们要访问的地址就成了:
可以看出这样的方式有利于我们使用不同参数访问同一个 Web API 接口,比如你可以随便改成 .repo("ligoudan")
最后,就可以发送请求了!
model.enqueue(new Callback<TestModel>() {
@Override
public void onResponse(Call<TestModel> call, Response<TestModel> response) {
// Log.e("Test", response.body().getLogin());
System.out.print(response.body().getLogin());
}
@Override
public void onFailure(Call<TestModel> call, Throwable t) {
System.out.print(t.getMessage());
}
});
至此,我们就利用 Retrofit 完成了一次网络请求。
Retrofit 的注解
Retrofit 中有许多用到注解的地方,本次文章先了解他们的用法和作用,之后再深入了解其源码特点。
Retrofit 中,有许多的注解:
其中,包含了与请求方法相关的 @GET、@POST、@HEAD、@PUT、@DELETA、@PATCH,和参数相关的@Path、@Field、@Multipart等。
在之前转化接口时,我们是这样写的:
public interface APIInterface {
@GET("/users/{user}")
Call<TestModel> repo(@Path("user") String user);
可以看到 @GET 很明显就是请求相关的;而 @Path 我们用它来充当一个占位符的功能,它是参数相关的。
Header 设置
当我们要设置网络请求的 Header 参数时,Retrofit 提供两种方式进行配置。
第一种是静态配置,直接在接口中指定 Header 参数:
@Headers({
"User-Agent: Retrofit-Sample-App"
})
第二种是动态配置:
@GET("/user")
Call<TestModel> getUser(@Header("Authorization") String authorization)
在接口中注解但不指定,后面实例化请求体时可通过 .getUser 指定 Header。
GET 请求参数设置
在我们发送 GET 请求时,如果需要设置 GET 时的参数,Retrofit 注解提供两种方式来进行配置。分别是 @Query(一个键值对)和 @QueryMap(多对键值对)。
Call<TestModel> one(@Query("username") String username);
Call<TestModel> many(@QueryMap Map<String, String> params);
POST 请求参数设置
POST 的请求与 GET 请求不同,POST 请求的参数是放在请求体内的。
所以当我们要为 POST 请求配置一个参数时,需要用到 @Body 注解:
Call<TestModel> post(@Body User user);
这里的 User 类型是需要我们去自定义的:
public class User {
public String username;
public String password;
public User(String username,String password){
this.username = username;
this.password = password;
}
最后在获取请求对象时:
User user = new User("lgd","123456");
Call model = service.post(user);
就能完成 POST 请求参数的发送,注意该请求参数 user 也会转化成 Json 格式的对象发送到服务器。
总结
以上便是对 Retrofit 的初步介绍和使用,可以看到如果 Web 服务器的 API 接口做的足够规范,各个实体类的配置正确,使用 Retrofit 相比其他网络加载库,可以说是十分简洁明了。
另外在搜索资料时,发现对于 Retrofit 的讲解相对不多,Retrofit 2.0 与其之前的版本也有诸多不同,感谢各位博主提供的细致解读与分享。
参考资料
Unable to create converter for my class in Android Retrofit library
[旧][Android] Retrofit 初步使用的更多相关文章
- [旧][Android] Retrofit 源码分析之执行流程
备注 原发表于2016.04.23,资料已过时,仅作备份,谨慎参考 前言 由于是第一次自己翻看源代码进行学习,加上基础不好,在看源代码的过程中简直痛苦不堪,但同时也暴露出了自己的许多问题.我觉得学习源 ...
- [旧][Android] Retrofit 源码分析之 Retrofit 对象
备注 原发表于2016.04.27,资料已过时,仅作备份,谨慎参考 前言 在上一周学习了一下 Retrofit 的执行流程.接下来的文章要更为深入地学习 Retrofit 的各个类,这次我们先学习一下 ...
- [旧][Android] Retrofit 源码分析之 ServiceMethod 对象
备注 原发表于2016.05.03,资料已过时,仅作备份,谨慎参考 前言 大家好,我又来学习 Retrofit 了,可能这是最后一篇关于 Retrofit 框架的文章了.我发现源码分析这回事,当时看明 ...
- Android Retrofit 2.0 使用-补充篇
推荐阅读,猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava 4.RxBus 5.Android MVP+Retrofit+RxJava实践小 ...
- Android Retrofit 2.0文件上传
Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传 使用Retrofit进行文件上传,肯定离不开Part & PartMap. public interface ...
- Android Retrofit实现原理分析
retrofit有几个关键的地方. 1.用户自定义的接口和接口方法.(由动态代理创建对象.) 2.converter转换器.(把response转换为一个具体的对象) 3.注解的使用. 让我们跟随Ap ...
- android -------- Retrofit + RxJava2.0 + Kotlin + MVP 开发的 WanAndroid 项目
简介 wanandroid项目基于 Retrofit + RxJava2.0 + Kotlin + MVP 用到的依赖 implementation 'io.reactivex.rxjava2:rxj ...
- Android Retrofit 2.0使用
实例带你了解Retrofit 2.0的使用,分享目前开发Retrofit遇到的坑和心得. 添加依赖 app/build.gradle 1 compile 'com.squareup.retrofit2 ...
- 123、 android Retrofit 介绍和使用(转载)
简单使用:http://blog.csdn.net/bitian123/article/details/51899716 http://blog.csdn.net/duanyy1990/article ...
随机推荐
- elasticsearch源码分析及插件开发
ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...
- golang中字符串的底层实现原理和常见功能
1. 字符串的底层实现原理 package main import ( "fmt" "strconv" "unicode/utf8" ) f ...
- Servlet-整个Servlet类的继承体系
- Ldap主从复制搭建
LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写, LDAP协议的特点 读取速度远高于写入速度. 对查询做了优化,读取速度优于普通关系数据 ...
- URL Rewrite(四种重定向策略)
目录 一:Rewrite基本概述 1.Rewrite简介 2.Rewrite基本概述 3.Rewrite作用 4.什么是URL? 二:rewrite语法 三:Rewrite标记Flag 1.last和 ...
- 同态加密与 Paillier/RSA
本文作者: wdxtub 本文链接: http://wdxtub.com/flt/flt-03/2020/12/02/ 白话同态加密 虽然同态加密即使现在听起来也很陌生,但是其实这个概念来自 1978 ...
- Idea内存设置idea.vmoptions无效的解决办法
原因:貌似是因为maven的问题 解决办法 结果
- Spring源码-IOC部分-容器简介【1】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- 计算机开放电子书 2021 RC2
下载方式 pip install CDNDrive # 或 # pip install git+https://github.com/apachecn/CDNDrive cdrive download ...
- AT2650 [ARC077C] guruguru
可以发现,如果我们枚举每个理想亮度 \(X\) 然后再求在这个理想亮度情况下的答案是非常难维护的. 不妨反过来,考虑每个位置 \(i, i + 1\) 之间对每个理想亮度 \(X\) 减少次数的贡献. ...