概念:
Retrofit一開始看起来使用比較麻烦是由于它和其它网络请求框架不同的是它是通过注解和interface来进行网络请求,而且须要对返回数据进行特殊处理才干使用。

1. 简单使用,请求返回String数据
1) 定义接口,在Retrofit2.0和Retrofit1.*是不用的,这里仅仅说明Retrofit2.0的使用
public interface ApiService {

    @GET("/")

    Call<String> getData();
}
简单的看。这仅仅是一个简单的interface。
解释:
注意getData()方法上的注解是一个@GET(String), 表示请求网络的是get方法,而当中的參数是baseUrl后面的数据,比如http://www.baidu.com/ + / =http://www.baidu.com/
而其返回值也是一个Call的泛型对象。当中String是我们最后须要的东西。
2) 构造Retrofit对象,构造Retrofit对象的目的是为了获取Retrofit为网络请求而实现上面我们自己定义的interface对象。
final Retrofit retrofit = new Retrofit.Builder()

        .client(new OkHttpClient())

        .baseUrl("http://www.baidu.com/")

        .addConverterFactory(new Converter.Factory() {

            @Override

           
public Converter<ResponseBody, ?

> fromResponseBody(Type type, Annotation[] annotations) {

                return new Converter<ResponseBody, String>() {

                    @Override

                   
public String convert(ResponseBody value) throws IOException {

                        return value.string();

                    }

                };

            }

        })

        .build();



final ApiService service = retrofit.create(ApiService.class);


一步步解释上面的代码。从第一行開始,构造Retrofit对象是通过Retrofit.Builder来构造的。能够指定OkHttpClient为网络请求框架,baseUrl就是表示网络请求的baseUrl, 然后须要一个将网络请求返回的数据转换成我们须要的数据的对象,最后通过Response#body得到的就是该类型。
然后通过构造的Retrofit对象生成一个我们定义的网络请求接口。

这样前期的准备工作都做完了。
3) 网络请求,网络请求分为同步和异步请求。
同步:
最后我们能够通过Retrofit为我们生成的interface对象调用当中的方法就生成一个Call<T>对象,然后通过Call#execute就能够进行同步的网络请求,得到一个Response<T>对象。然后通过Response#body就能够得到我们最后须要的T对象。

try {

    retrofit.Response<String> response = call.execute();

    String str = response.body();

    Log.e(TAG, str);

} catch (IOException e) {

    e.printStackTrace();

}

这样同步网络请求就完毕了。Response<T>对象是包裹了网络请求返回的全部消息,能够对其进行处理。

异步:
一般的异步都是使用一个回调对象对其进行处理。在Retrofit中,通过调用Call#enqueue方法将一个Callback<T>对象传入当中,然后异步网络请求就開始了。

然后在Response<T>#onResponse和onFailure方法中进行处理结果。

call.enqueue(new Callback<String>() {

    @Override

    public void onResponse(Response<String> response, Retrofit retrofit) {

        Log.e(TAG, response.body());

        Log.e(TAG, Thread.currentThread().getName());

    }



    @Override

    public void onFailure(Throwable t) {

        Log.e(TAG, t.getMessage(), t);

        Log.e(TAG, Thread.currentThread().getName());

    }

});

经过測试,和OkHttpClient不同的是。这里的回调是在main线程中,故能够直接在当中进行UI操作。
这样简单的网络请求就操作完毕了。


2. 參数的使用
在Retrofit中为url加入參数和动态改变url提供注解来更改。@Path, @Query, @Body
@Path 动态改变请求的url
在定义interface的时候动态改变url
@GET("/users/{username}")

Call<String> getUser(@Path("username") String username);

注意上面的@GET注解,当中能够看成须要一个username来动态构造url,而在getUser方法中我们就须要传递这个參数,通过@Path就能够指定其username。这样就能够将url进行动态的改变了。

@Query 加入參数
在定义interface的时候加入參数
@GET("/user")

Call<String> getUser(@Query("id")long userId);

注意@Query能够为url加入參数,当中id为key,传入的userId就为value,这样就加入了參数。


@Body
使用post提交数据的时候。将我们须要提交的对象转换成网络请求的方式。
@POST("/user/register")

Call<String> registerUser(@Body String user);

像上面。这样就定义了一个接口方法,调用该接口方法须要传递參数进去,这个时候就须要将參数转换成网络请求的样式。这个操作也是通过Converter对象来进行的。
final Retrofit retrofit = new Retrofit.Builder()

        .client(new OkHttpClient())

        .baseUrl("http://www.baidu.com/")

        .addConverterFactory(new Converter.Factory() {

            @Override

           
public Converter<ResponseBody, String> fromResponseBody(Type type, Annotation[] annotations) {

                return new Converter<ResponseBody, String>() {

                    @Override

                   
public String convert(ResponseBody value) throws IOException {

                        return value.string();

                    }

                };

            }



            @Override

           
public Converter<String, RequestBody> toRequestBody(Type type, Annotation[] annotations) {

                return new Converter<String, RequestBody>() {

                    @Override

                   
public RequestBody convert(String value) throws IOException {

                        return RequestBody.create(MediaType.parse("application/json;charset=utf-8"), value);

                    }

                };

            }

        })

        .build();

改动了构造Retrofit对象代码,从当中能够看到,在addConverterFactory(Converter.Factory)方法中有两个方法。当中一个是fromResponseBody就是将网络请求的结果转换成我们须要的数据类型,而另外一个toRequestBody就是将我们传入的类型转换成网络请求的类型。
同一时候注意。这里的ResponseBody和RequestBody对象都是OkHttp中的类,使用方式參考OkHttp的使用就可以。
而在调用Call#execute或Call#enqueue进行网络请求的时候相关的Response对象是Retrofit包中定义的类,通过Response#body得到的结果是在Converter泛型对象定义的类型。

3. Retrofit2.0 中baseUrl和完整url构建的关系(没有证实)
baseUrl是作为API的地址,我们也可能更改它的值。

而在定义接口的时候我们须要为当中的方法加入@GET或@POST来标记其请求的方式。同一时候完整url的其它部分。
如果 baseUrl = "http://api.douban.com/base/movie/"
通过一些网络文档描写叙述,假设我们在@GET/@POST中加入參数为"/list"以"/"开头则表示完整的url为"http://api.douban.com/list"。注意后面的/base/movie都没有了,而假设在@GET/@POST中加入參数为"list"没有以"/"开头则表示完整的url为“http://api.douban.com/base/movie/list。

同一时候,假设在@GET/@POST中的參数本身就是一个完整的url。那么就会抛弃baseUrl而使用其參数上的url。

4. 混淆
-dontwarn retrofit.**

-keep class retrofit.** { *; }

-keepattributes Signature

-keepattributes Exceptions

5. 文件上传
通过给interface中的方法加入@Multipart,然后在方法中的參数加入@Part,參数类型为RequestBody,这样就能够将文件由RequestBody包裹,然后再通过Retrofit进行处理就可以。RequestBody是OkHttp的API。
关于文件上传,以前遇到的一个问题:支持多文件上传的情况下,有可能不上传文件,那么这个问题怎么解决呢。File file = null; 第三方jar包不支持怎么办。
关于多文件上传。由于Retrofit底层使用的是OkHttp,故应该关注RequestBody携带多个文件的情况。
Get OkHttp 2.1, and use MultipartBuilder.addFormDataPart() which takes the filename as a parameter.

其它操作參考其它Retrofit文档和官方文档:http://square.github.io/retrofit/

注:
在写这篇总结的时候,Retrofit的版本号仍然是2.0.0-Beta1, 如今的版本号是2.0.0-Beta3, 尽管看版本号号变化不大。可是两者的包名已全然不一样,2.0.0-Beta3使用的也是okhttp3。所以两个版本号一定要差别开,当然,在使用上并没有多大差别。

Retrofit三步理解之中的一个 ------------------ Retrofit的简单使用总结的更多相关文章

  1. 三步理解--门控循环单元(GRU),TensorFlow实现

    1. 什么是GRU 在循环神经⽹络中的梯度计算⽅法中,我们发现,当时间步数较⼤或者时间步较小时,循环神经⽹络的梯度较容易出现衰减或爆炸.虽然裁剪梯度可以应对梯度爆炸,但⽆法解决梯度衰减的问题.通常由于 ...

  2. Emacs安装配置全攻略之中的一个编译安装简单配置

    /*************************************************************************************************** ...

  3. 【美妙的Python之中的一个】Python简单介绍及环境搭建

    美妙的Python之Python简单介绍及安装         简而言之: Python 是能你无限惊喜的语言,与众不同.             1.Python:                  ...

  4. SQL Server2005 表分区三步曲(zz)

    前言 SQL Server 2005开始支持表分区,这种技术允许所有的表分区都保存在同一台服务器上.每一个表分区都和在某个文件 组(filegroup)中的单个文件关联.同样的一个文件/文件组可以容纳 ...

  5. Spring Boot Starter自定义实现三步曲

    实现自定义的spring boot starter,只需要三步: 1.一个Bean 2.一个自动配置类 3.一个META-INF/spring.factories配置文件 下面用代码演示这三步. 项目 ...

  6. 如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域

    一.前言 结合我们本次系列的第一篇博文中提到的上下文映射图(传送门:如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念),得知我们这个电商网站的核心域就是销售子域.因为电子商务是以信息网络 ...

  7. 分享一个MAC下绕开百度网盘限速下载的方法,三步操作永久生效

    相信大家都比较困惑,百度网盘客户端限速后一般只有几十K的下载速度,Windows有百度网盘破解版,但MAC的破解版似乎不存在,要提速的话,一般的做法是开超级会员(27元/月),身为程序员的我们,是不是 ...

  8. Knative 实战:三步走!基于 Knative Serverless 技术实现一个短网址服务

    短网址顾名思义就是使用比较短的网址代替很长的网址.维基百科上面的解释是这样的: 短网址又称网址缩短.缩短网址.URL 缩短等,指的是一种互联网上的技术与服务,此服务可以提供一个非常短小的 URL 以代 ...

  9. Android 中 OkHttp 三步实现生命周期绑定

    简介 OkHttps 是 OkHttp 增强版的超轻量封装包. 和 Retrofit 相比,它更加轻量(只有 59Kb),是 Retrofit (124Kb)的一半,而且更加的开箱即用,API 更加自 ...

随机推荐

  1. Google和Baidu的站内搜索代码

    <!-- SiteSearch Google --> <form method="get" action="http://www.google.com/ ...

  2. 聊聊jdbc statement的fetchSize

    在使用MySQL的JDBC时,如果查询结果集过大,使用一次查询,可能会出现Java.lang.OutOfMemoryError: Java heap space问题,因为DB服务器端一次将查询到的结果 ...

  3. RxJava【创建】操作符 create just from defer timer interval MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. C# 将 Json 解析成 DateTable

    #region 将 Json 解析成 DateTable /// /// 将 Json 解析成 DateTable. /// Json 数据格式如: /// {table:[{column1:1,co ...

  5. JS里关于事件的常被考察的知识点:事件流、事件广播、原生JS实现事件代理

    1.JS里面的事件流 DOM2级事件模型中规定了事件流的三个阶段:捕获阶段.目标阶段.冒泡阶段,低版本IE(IE8及以下版本)不支持捕获阶段 捕获事件流:Netscape提出的事件流,即事件由页面元素 ...

  6. fasttext使用笔记

    http://blog.csdn.net/m0_37306360/article/details/72832606 这里记录使用fastText训练word vector笔记 github地址:htt ...

  7. ubuntu16.04下部署tomcat9和java8启动一次需要七八分钟

    一.环境如下 Ubuntu16.04  +tomcat9+openjdk1.8 二.问题 在tomcat的bin下执行./startup.sh 如下图没有问题 root@bogon:/usr/apac ...

  8. 解决Android Studio无法下载sdk的问题

    因为google被墙了,android sdk无法下载.然后各种百度,都是说让设置代理,给的代理地址一般都是用的下面这个代理服务器: 大连东软信息学院镜像服务器地址: mirrors.neusoft. ...

  9. leverage准确翻译,译法,英文

    这个词的翻译很有问题.很多大词典都只有这么几个译法:影响力,杠杆.作为动词的时候我建议翻译为:借助,凭借,凭仗,依仗,借重某外文原稿(https://www.vmware.com/files/pdf/ ...

  10. c++10进制转换为任意2-16进制数字

    #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; int m ...