Retrofit

适用于Android和Java的类型安全的HTTP客户端

声明API

接口方法及参数的注解用于控制一个请求.

请求方法

每一个方法必须带有一个HTTP注解, 用于提供相应的请求方法和URL. 目前有5种内置的注解: GET , POST , PUT , DELETE和 HEAD . 注解中指定了相应的URL.

@GET("users/list")

您还可以指定URL中的查询参数.

@GET("users/list?sort=desc")

操作URL

请求URL可以使用方法中的替换块和参数进行动态替换. 替换块是指由 { 和 } 包裹的字符串. 其对应的参数必须使用相同的字符串,并使用 @Path 进行注解.

@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>

请求体

可以使用 @Body 注解来指定一个对象作为HTTP请求体.

@POST("users/new")

Call<User> createUser(@Body User user);

该对象同时也会被 Retrofit 实例所指定的转化器所转化. 如果没有添加转化器,则只有 RequestBody 可以被使用.

编码表单和分段数据

方法也可以被声明为发送编码表单和分段数据.

当使用 @FormUrlEncoded 注解方法时, 则为发送编码表单数据.每个键值对使用 @Field 注解, 并在其中带有名称和提供值的对象.

@FormUrlEncoded

@POST("user/edit")

Call<User> updateUser(@Field("first_name") String first, @Field("last_name")当使用 @Multipart 注解方法时, 则为分段请求.每段数据使用 @Part 注解来声明.

@Multipart

@PUT("user/photo")

Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description")分段数据需要使用 Retrofit 中的某个转化器,或者通过实现 RequestBody 来处理分段数据的序列化.

操作请求头

您可以使用 @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);

注意, 请求头不会相互覆盖. 所有同名的请求头都会包含在请求中.

可以使用 @Header 注解来动态更新请求头.并且必须向 @Header 提供相应的参数. 如果参数值为空, 则该请求头将会被忽略. 如果参数值不为空,则会调用该值的 toString 并使用其结果.

@GET("user")

Call<User> getUser(@Header("Authorization") String authorization)

对于所有请求都需要添加的请求头, 可以使用OkHttp interceptor来指定.

同步和异步

Call 实例既可以同步执行, 也可以异步执行. 每个实例只能被使用一次, 但通过调用 clone() 可以创建一个新的实例.

在Android中, 回调将会在主线程中执行. 在JVM中, 回调将发生在执行HTTP请求的线程中.

配置Retrofit

Retrofit 是一个将API接口转化为可调用对象的类. 默认情况下, Retrofit提供了默认的配置, 但他也允许进行自定义.

转化器

默认情况下, Retrofit只能将HTTP请求体反序列化为OkHttp的 ResponseBody 类型,

并且在 @Body中只能接受 RequestBody 类型.

可以添加转化器以便支持其他类型. 为了您的使用便捷, 已经有6种模块适配了流行的序列化库.

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:converterscalars

以下是使用 GsonConverterFactory 类生成一个使用Gson进行反序列化

的 GitHubService 接口实现类的示例.

Retrofit retrofit = new Retrofit.Builder()

.baseUrl("https://api.github.com")

.addConverterFactory(GsonConverterFactory.create())

.build();

GitHubService service = retrofit.create(GitHubService.class);

自定义转化器

如果您需要使用Retrofit不支持的内容格式(如YAML, txt, 自定义格式)与API进行通信, 或者您希望使用不同的库实现已有的格式, 您可以简单地创建自定义转化器.创建一个类继承 Converter.Factory 类, 并在创建适配器时传入一个实例即可.

下载

Retrofit源码, 示例和网站可在GitHub上获取.

https://github.com/square/retrofit

依赖:

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

混淆

如果您在项目中使用混淆, 请添加以下代码到混淆配置中:

-dontwarn retrofit2.**

-keep class retrofit2.** { *; }

-keepattributes Signature

-keepattributes Exceptions

做了个一个小案例先看一下App展示:

直接看代码:

public interface IService {/**
     * 每个方法必须有一个HTTP请求注释提供请求方法和相对URL。
     * 有五个内置注释:GET、POST、PUT、DELETE、HEAD。
     * 注解中指定资源的相对URL
     * (说白了,就是除了Url根目录外的子目录,
     * 比如:https://www.baidu.com/?tn=22073068_oem_dg
     * 中,https://www.baidu.com为根目录,
     * 后面的这一串:/?tn=22073068_oem_dg就是子目录,也就是需要在注解中写入的相对URL)。
     */
    @GET("/test/test.json")/**
     *  FruitData 为javabean对象
     *  getList(),该方法名字随便起
     *  @Query("title") String title  就是通过Query注解来查询title字段
     */
    Call<FruitData> getList(@Query("title") String title);
}
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyHolder> {private Context                          mContext;private ArrayList<FruitData.FruitName>  mDatas;public MyAdapter(Context context, ArrayList<FruitData.FruitName> data) {this.mContext = context;this.mDatas = data;}@Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {LayoutInflater inflater = LayoutInflater.from(mContext);View view = inflater.inflate(R.layout.layout_recyclerview, parent, false);MyHolder holder = new MyHolder(view);return holder;}@Override
    public void onBindViewHolder(MyHolder holder, int position) {holder.tvTitle.setText(mDatas.get(position).title);}@Override
    public int getItemCount() {return mDatas.size();}class MyHolder extends RecyclerView.ViewHolder {TextView tvTitle;public MyHolder(View itemView) {super(itemView);tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);}}
}
public class MainActivity extends AppCompatActivity {private Button       btnRetrofit;private RecyclerView recyclerView;@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {btnRetrofit = (Button) findViewById(R.id.btn_retrofit);recyclerView = (RecyclerView) findViewById(R.id.recyclerview);recyclerView.setLayoutManager(new LinearLayoutManager(this));btnRetrofit.setOnClickListener(new View.OnClickListener() {@Override
            public void onClick(View v) {useRetroift();}});}private void useRetroift() {//获取Retrofit实例对象
        Retrofit retrofit = new Retrofit.Builder()//Url根目录
                .baseUrl("http://192.168.1.101:8080")//增减转换工厂(创建Gson转换工厂)
                .addConverterFactory(GsonConverterFactory.create()).build();//获取接口对象
        IService iService = retrofit.create(IService.class);//获取Call对象
        Call<FruitData> call = iService.getList("title");//调用Call的异步网络请求方法
        call.enqueue(new Callback<FruitData>() {@Override
            //请求成功,并获取到json解析后的数据
            public void onResponse(Call<FruitData> call, Response<FruitData> response) {ArrayList<FruitData.FruitName> data = response.body().data;recyclerView.setAdapter(new MyAdapter(MainActivity.this, data));}@Override
            public void onFailure(Call<FruitData> call, Throwable t) {}});}}
public class FruitData {public ArrayList<FruitName> data;public class FruitName {public String title;}
}

Retrofit的讲解和使用相关推荐

  1. android retrofit入门,Android开发 retrofit入门讲解

    前言 retrofit基于okhttp封装的网络请求框架,网络请求的工作本质上是 OkHttp 完成,而 retrofit 仅负责网络请求接口的封装.如果你不了解OKhttp建议你还是先了解它在来学习 ...

  2. 开源框架相关面试问题-retrofit网络框架面试问题讲解

    retrofit使用简介: 在retrofit中通过一个接口作为Http请求的api接口. 注意:@GET("url")中的url只是一个路径,不包含主机号的. 创建一个retro ...

  3. android 多个绑定事件,Android RxJava 实际应用讲解:联合判断多个事件

    前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. Github截图 RxJava如此受欢迎的原因,在于其提供了丰富 & ...

  4. Android Retrofit @Streaming 注解失效(二)

    本博文由我的关注者友情赞助,我终于有愿意和我互动的粉丝啦 = =! 感觉有挺长一段时间没有写一些东西了呢,这次就稍微写一些干货,主要是之前写了一篇Retrofit@Stream注解失效的博文,然后留了 ...

  5. java 轮询请求接口_Android RxJava 实际应用讲解:(无条件)网络请求轮询

    前言 Rxjava,由于其基于事件流的链式调用.逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎. Github截图 RxJava如此受欢迎的原因,在于其提供了丰富 & ...

  6. Android:手把手带你深入剖析 Retrofit 2.0 源码

    前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将手把手带你深入剖析Retrofit v2.0的源码,希望你们会喜 ...

  7. 别人家SDK的设计模式——Android Retrofit库源码解读

    作者:网易合作产品部·李若昆 我们在日常编写代码中免不了会用到各种各样第三方库,网络请求.图片加载.数据库等等.有些lib接入可能方便到几行代码搞定,有些lib可能从demo.文档到测试都是坑(比如l ...

  8. RxJava+Retrofit+MVP+Dagger2

    传说中的谷歌四件套,按顺序来哈~ 2017.2.20更新:对于用了一段时间的谷歌四件套的开发者们来说,基础应该都已经掌握的差不多了,但是四件套确实很博大精深,要想完全掌握,一是要学习使用技巧,二是要在 ...

  9. 认证android retrofit,Retrofit之项目介绍

    项目介绍 官网对retrofit介绍是这是一个"类型安全(type-safe)"的Android/Java http客户端. 目前retrofit的最新正式版本为1.9.0. 2. ...

最新文章

  1. 为什么要使用Go语言?Go语言的优势在哪里?
  2. 【c++内存分布系列】单独一个类
  3. 049_汉字Unicode编码范围
  4. acf滞后数必须为正整数。_【知识点】“勾股定理”的必考点,必须掌握!
  5. 八张图彻底了解JDK8 GC调优秘籍-附PDF下载
  6. centos7 安装redis_Redis6安装(上) - 单机单实例
  7. 【转】EL表达式 (详解) .
  8. 使用腾讯云函数签到天翼云盘
  9. Semaphore1.8源码
  10. 比特币价格会达到10万美元?有人用蒙特卡罗方法预测了一下
  11. java 通用查询_java 通用查询
  12. 【SimMechanics】使用Matlab/SimMechanics仿真机械臂
  13. ANDROID模拟器不能启动
  14. RedisTemplate常用使用说明-opsForHash(3)
  15. 角度传感器原理和应用
  16. Matlab画图常用命令
  17. c语言运算程序示例,C语言算术运算示例程序
  18. 网传互联网公司大裁员
  19. Android 视频裁剪 (含裁剪 View)
  20. FPGA时序约束01——基本概念

热门文章

  1. NOR Flash的原理与操作
  2. 微信扫一扫直接打开手机外部浏览器
  3. [转载]onclientclick和onclick区别
  4. 微信公众平台二次开发 API开发 服务账号开发 订阅号开发
  5. Python使用MongoDB简记
  6. 关于web页面打开空白的情况
  7. CS 客户端不引用AE
  8. wordpress插件列表
  9. Xcode的编译/运行结果保存的路径
  10. 《Ray Tracing in One Weekend》——Chapter 2: The vec3 class