继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Retrofit2.0使用简介

闲筝听雨
关注TA
已关注
手记 14
粉丝 7
获赞 31

Retrofit是什么?

按照惯例,我们首先来看下GitHub上Retrofit的解释。
Type-safe HTTP client for Android and Java by Square, Inc.
翻译下:
Square公司为Android和Java开发的类型安全的Http Client。
Retrofit其实就是对OkHttp的封装,使用面向接口的方式进行网络请求(大大简化了我们的代码,感觉这一点和Spring中Controller的接口编写类似),它使用动态生成的代理类封装了接口,而且使用很多注解提供功能。

如何使用Retrofit?

  1. 在 Gradle加入Retrofit库的依赖
    implementation 'com.squareup.okhttp3:okhttp:3.12.1'
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.0.2'

Retrofit的使用要依赖于OkHttp,所以你还要加入对OkHttp库的依赖
当然,如果是Android开发者,不要忘记请求、添加网络权限。

<uses-permission android:name="android.permission.INTERNET"/>
  1. 定义HTTP API接口
public interface GetRequest_Interface {

    @GET("group/{id}/users")
    Call<Translation> getCall(@Path("id") int groupId);
}

Retrofit会使用动态代理的方式,将我们定义的Java Interface转换为网络请求接口,我们只需要定义和使用,暂时不关注它是如何进行转换的。

  1. 定义Retrofit实例
//创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder().baseUrl("http://fy.iciba.com/")
         .addConverterFactory(GsonConverterFactory.create())
         .build();

从这段代码上看,Retrofit的构造同样使用了设计模式中的[建造者模式],可见该模式的使用之普遍。
在构造Retrofit时我们要注意以下几点:

baseUrl以/结尾。
@GET等接口URL不要以/开头。

  1. 转换接口
//对发送请求进行封装
Call<Translation> translationCall = getRequest_interface.getCall(1);
  1. 调用API接口
        //发送网络请求(同步)
        try {
            Response<Translation> response = translationCall.execute();
            response.body().show();
        } catch (IOException e) {
            e.printStackTrace();
        }

//不管同步还是异步请求,call只能执行一次,否则会抛 IllegalStateException
        translationCall.clone();

        //发送网络请求(异步)
        translationCall.enqueue(new Callback<Translation>() {
            //返回成功回调
            @Override
            public void onResponse(Call<Translation> call, Response<Translation> response) {
                response.body().show();
            }

            //返回失败回调
            @Override
            public void onFailure(Call<Translation> call, Throwable t) {

            }
        });
//终止请求
        translationCall.cancel();

HTTP协议的8种请求类型介绍

HTTP协议中共定义了八种方法或者叫“动作”来表明对Request-URI指定的资源的不同操作方式,具体介绍如下:

  1. OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送’*'的请求来测试服务器的功能性。
  2. HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息.
  3. GET:向特定的资源发出请求。
  4. POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。
  5. PUT:向指定资源位置上传其最新内容。
  6. DELETE:请求服务器删除Request-URI所标识的资源。
  7. TRACE:回显服务器收到的请求,主要用于测试或诊断。
  8. CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

Retrofit请求参数注解字段说明

@Query、@QueryMap
用于Http Get请求传递参数.如:

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

等同于:

@GET("group/users?id=groupId")

即将@Query的key-value添加到url后面组成get方式的参数,@QueryMap同理

@Field
用于Post方式传递参数,需要在请求接口方法上添加@FormUrlEncoded,即以表单的方式传递参数.示例:

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

@Body
用于Post,根据转换方式将实例对象转化为对应字符串传递参数.比如Retrofit添加GsonConverterFactory则是将body转化为gson字符串进行传递.
converter有如下:

  • 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

@Path
用于URL上占位符.如:

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

将groupId变量的值替换到url上的id位置
@Part
配合@Multipart使用,一般用于文件上传,看官方文档示例:

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

@Header
添加http header

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

等同于:

@Headers("Authorization: authorization")<span class="hljs-comment">//这里authorization就是上面方法里传进来变量的值
@GET("widget/list")
Call<User> getUser()

@Headers
跟@Header作用一样,只是使用方式不一样,@Header是作为请求方法的参数传入,@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("widget/list")
Call<List<Widget>> widgetList();
打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP