Retrofit 2.0 案例 小白入门

Retrofit 是个什么?

可以理解为OKHttp这个网络请求框架的加强版,主要的网络请求工作是用OkHttp来实现的,但是如果不了解OkHttp的也没关系。Retrofit仅仅只是负责网络请求接口的封装,说白了就是OkHttp的管家,只是这个管家比较666,使用起来相对OkHttp而言方便很多,看到这里肯定有疑问,既然就是OKHttp的管家,我直接用OKHttp就好了,干嘛多此一举。好吧~~ 我开始也是这么想的,但Retrofit也有他的特点,不然就没有存在的必要了,特点:包含了特别多注解,方便简化你的代码量。并且还支持很多的开源库(著名例子:Retrofit + RxJava)。关于Rxjava此文不做介绍,可以找度娘。

 

 

那就正式开始进行学习吧,我根据例子来进行举例。

使用:

  • 第一步、添加依赖
    由于Retrofit是基于OkHttp,所以还需要添加OkHttp库依赖
    在build.grale添加如下依赖:
dependencies {
    // Okhttp库
    compile 'com.squareup.okhttp3:okhttp:3.1.2'
    // Retrofit库
    compile 'com.squareup.retrofit2:retrofit:2.0.2'
}
  • 第二步、添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>

   第三步、 创建一个实体类:

{ "name" : "Ravi Tamada", "email" : "ravi8x@gmail.com", "phone" : { "home" : "08947 000000", "mobile" : "9999999999" } }

根据这条json数据,创建ResultBean这个实体类,里面还有一个Phone的实体省略了

public class ResultBean {
    String name;
    String email ;
    Phone phone;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Phone getPhone() {
        return phone;
    }

    public void setPhone(Phone phone) {
        this.phone = phone;
    }
}

第四步、创建接口

刚刚说Retrofit 是OKhttp的管家,那么它是通过什么来管理的呢?是通过接口(自己定义),Retrofit将 Http请求 抽象成 Java接口:采用 注解 描述网络请求参数 和配置网络请求参数。比如有这么一个请求https://api.androidhive.info/volley/person_object.json写成接口的方式,我写的接口只有一个getName的请求方法,采用的是get请求:

public interface APi {
    @GET("volley/{fileName}")
    Call<ResultBean> getName(@Path("fileName") String fileName);
}

 

代码解释:

ResultBean:实体类

getName:方法名

@GET是个什么玩意呢?这个Retrofit的注解,表明这个请求方法采用GET请求,(HTTP请求有8种GET/POST/DELETE/HEAD/PUT/OPTION。。我们最常用的就是GET和POST)。

@Path:这个又是什么呢? 他是对请求参数的注解。先撇开这个不谈,我们来谈一下Retrofit 的地址

 

举个例子:https://www.baidu.com/android/android?name=wang&age=3,我们将这个url分为三个部分

BaseUrl : https://www.baidu.com/(记住在Retrofit的BaseUrl后面要以/结尾)

GET:android/android

参数部分:?name=wang&age=3

根据这条地址我们可以把接口写成

@GET("android/android")

Call<实体类> 方法名(@Query("name") String name,@Query("age") int age);

当然还有一个BaseUrl,这个是我们创建Retrofit时设置的,在下面的代码中可以见到。Retrofitde的url=baseurl+get+参数

此时根据我们的代码,就可以生成自动https://www.baidu.com/android/android?name=wang&age=3这条请求啦,这也是为什么我在上面写明Retrofit将 Http请求 抽象成 Java接口:采用 注解 描述网络请求参数 和配置网络请求参数。

可能有些人会有疑问,为什么之前使用的是@path,现在使用的是@Query呢?这是根据参数类型的不同而使用不同的注解。我们来看最先的那条URL:https://api.androidhive.info/volley/person_object.json ,在这条url中我得get部分写的是volley/{filename},之所以这样写是因为这里的filename是可以根据用户的需要而改变,就拿这个例子来说如果我对filename指定值为android.json,那么这条url会变成https://api.androidhive.info/volley/android.json

这两个的用法区别就是?=@path   、{}=@Query,我们知道URL的请求参数有多种,其实这些注解也就是一个配套使用,根据不同的请求参数使用不同的注解,下面我列举了Retrofit的参数注解和请求方法注解

 

 

 

 

 

Retrofit注解

  • 请求方法
注解代码请求格式
@GETGET请求
@POSTPOST请求
@DELETEDELETE请求
@HEADHEAD请求
@OPTIONSOPTIONS请求
@PATCHPATCH请求
  • 请求参数
注解代码说明
@Headers添加请求头
@Path替换路径
@Query替代参数值,通常是结合get请求的
@FormUrlEncoded用表单数据提交
@Field替换参数值,是结合post请求的

第五步:创建Retrofit对象
 

retrofit =  new Retrofit.Builder()
                .baseUrl("https://api.androidhive.info/")
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();

baseurl:不解释

addconverterFactoty:(数据解析器)得到一条json数据以后,解析成我们想要的数据,常用的方法是Gson,Retrofit支持多种解析方法

  • 使用时需要在Gradle添加依赖
数据解析器Gradle依赖
Gsoncom.squareup.retrofit2:converter-gson:2.0.2
Jacksoncom.squareup.retrofit2:converter-jackson:2.0.2
Simple XMLcom.squareup.retrofit2:converter-simplexml:2.0.2
Protobufcom.squareup.retrofit2:converter-protobuf:2.0.2
Moshicom.squareup.retrofit2:converter-moshi:2.0.2
Wirecom.squareup.retrofit2:converter-wire:2.0.2
Scalarscom.squareup.retrofit2:converter-scalars:2.0.2

第六步、创建网络请求接口实例

//创建接口实例(自己定义的那个接口)
APi aPi = retrofit.create(APi.class);
//对请求参数进行分封装
Call<ResultBean> resultBeanCall = aPi.getName("person_object.json");
              

第七步、发送同步异步请求

//异步请求
resultBeanCall.enqueue(new Callback<ResultBean>() {
                    @Override
                    public void onResponse(Call<ResultBean> call, Response<ResultBean> response) {//请求成功回调此方法
                        ResultBean resultBean =response.body();//对数据进行解析
                        Log.e("TAG",resultBean.getName());
                    }

                    @Override
                    public void onFailure(Call<ResultBean> call, Throwable t) {
                        //失败回调此方法
                    }
                });

// 发送网络请求(同步) 和异步相差不大

Response<Reception> response = resultBeanCall.execute();

// 对返回数据进行处理 response.body().show();

 

好了~~,文章讲到这里,至少能够基本使用了,剩下的在补充

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值