Android开发学习之Retrofit框架

Posted 哈喽喔德

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发学习之Retrofit框架相关的知识,希望对你有一定的参考价值。

Retrofit是一款类型安全的网络框架,基于HTTP协议,服务于android和java语言,在使用时其实就充当了一个适配器的角色,主要是将一个 Java 接口翻译成一个 HTTP 请求对象,然后用内部封装的 OkHttp 去发送这个请求。
github地址:https://github.com/square/retrofit
引入依赖:

implementation 'com.squareup.retrofit2:retrofit:2.9.0'

一、使用方法

  1. 根据网络Http接口创建Java的接口,以下以username,password为例
  2. 在Java接口中定义post和get方法,返回值应该为Call
  3. 为方法和参数加上对应注解,post方法加上@POST(“post”),定义数据提交方式如@FormUrlEncoded,post方法参数加上@Field(“key”);get方法加上@GET(“get”),参数加上@Query(“key”):如下
  4. 在onCreate()方法中创建Retrofit对象,并利用Retrofit对象的create方法生成接口实现类对象
  5. 以post为例:调用接口对象的post方法传入参数得到Call对象
  6. Call对象调用enqueue方法,重写两个回调方法
public interface HttpbinService 
    @POST("post")
    @FormUrlEncoded
    Call<ResponseBody> post(@Field("username") String username, @Field("password") String password);

    @GET("get")
    Call<ResponseBody> get(@Query("username") String username, @Query("password") String password);

retrofit2.Call<ResponseBody> call = httpbinService.post("username","123456");
call.enqueue(new retrofit2.Callback<ResponseBody>() 
    @Override
    public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) 
        try 
            Log.d("TAG",response.body().string());
        
        catch (IOException e)
            e.printStackTrace();
        
    

    @Override
    public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) 

    
);

二、Retrofit转换器

无论是OkHttp还是Retrofit得到的服务器响应都是字符串类型,在实际开发中,我们经常需要对字符串进行解析将其转变成为一个Java Bean对象。如服务器响应数据为json格式字符串,那么需要利用GSON完成反序列化。而Retrofit提供了多个转换器使得响应能够完成自动数据转换。

  1. 引入转换器依赖:implementation ‘com.squareup.retrofit2:converter-gson:2.9.0’
  2. 根据json格式创建Java Bean类
  3. Retrofit接口中的方法返回类型中Call泛型改为Java Bean类
  4. 申明Retrofit对象时,调用addConverterFactory(GsonConverterFactory.create())添加转换器。
  5. 获得Response对象后,调用body()方法得到Java Bean类对象

三、Retrofit的嵌套请求和适配器

在实际开发中,可能存在需要先请求A接口再请求B 接口的情况。此时的请求就有了先后顺序,需要嵌套实现请求。这时就可以利用RxJava中的Observable替换Retrofit返回的Call类型。即使用适配器转换其他类型。
github地址:https://github.com/ReactiveX/RxJava
引入依赖:

implementation "io.reactivex.rxjava3:rxjava:3.1.1"

声明Retrofit对象时,调用addCallAdapterFactory(RxJava3CallAdapterFactory.create())添加适配器。

四、文件的上传和下载

上传文件:

  1. 定义接口,其中定义一个上传方法,注解指定成@Multipart,给方法参数类型指定为@Part MultipartBody.Part file
  2. 在上传方法中声明Retrofit对象和接口对象
  3. 声明文件对象
  4. 声明MultipartBody.Part对象,并使用MultipartBody.Part.createFormData()方法分配对象实例。三个参数分别为关键字,文件名,RequestBody.create方法。
  5. 调用接口对象的上传方法得到Call对象
    6,调用call.excute()方法得到请求内容
    如果要上传多个文件,可以在接口方法中定义多个参数;如果数量很多,参数注解改为@PartMap。

下载文件:

  1. 在接口中定义一个下载方法,使用@GET注解,参数是使用@Url注解的字符串。
  2. 在上传方法中声明Retrofit对象和接口对象
  3. 使用接口对象调用下载方法,传入下载链接。调用execute()方法得到Response对象
  4. 使用Response对象调用.body().byteStream()方法得到InputStream对象
  5. 使用文件输出流FileOutStream将数据写入文件

以上是关于Android开发学习之Retrofit框架的主要内容,如果未能解决你的问题,请参考以下文章

Android开发学习之Retrofit框架

Android开发学习之OkHttp框架

Android开发学习之OkHttp框架

Android开发学习之OkHttp框架

Android学习之系统框架

Java学习之反射机制及应用场景