• Android框架式编程之Retrofit


    一、Retrofit 简介

    Retrofit 官网地址: https://github.com/square/retrofit

    Retrofit(即Retrofit,目前最新版本为2.6.0版本),是目前非常流行的网络请求框架,底层是基于okHttp实现的。准确来说Retrofit是对okHttp的进一步封装,它功能强大,支持同步和异步,支持多种数据的解析方式(默认为Gson),支持RxJava。

    Retrofit 最大的优势就是简洁易用,它通过注解配置网络请求的参数,采用大量的设计模式来简化我们的使用。而且它的拓展性也做的相当的好,Retrofit 的功能模块高度封装,高内聚低耦合,我们可以自定义自己想要的组件,比如说我们可以自己选择解析工具而不用默认的Gson。除此之外,Retrofit 还有诸如性能好,处理速度快,代码简化等优势。

    二、Retrofit 注解

     使用 Retrofit 前我们不得不提一下注解,正是这些注解极大的方便了我们的代码编写及逻辑流程的控制。

    1. 请求方法注解

    • @GET:GET请求
    • @POST:POST请求
    • @DELETE:DELETE请求
    • @HEAD:HEAD请求
    • @OPTIONS:OPTIONS请求
    • @PATCH:PATCH请求

    2. 请求参数

    • @Headers:添加请求头
    • @Path:替换路径
    • @Query:替代参数值,通常是结合get请求的
    • @FormUrlEncoded:用表单数据提交
    • @Field:替换参数值,是结合post请求的

    二、Retrofit 使用

    Retrofit代码实现步骤如下:

    1)创建Retrofit 实例。

    2)定义接口,使用注解的形式封装请求地址和请求参数

    3)通过Retrofit实例,获取一个接口服务对象

    4)通过接口服务对象调用接口中的方法,获取call对象

    5)Call对象执行请求(异步请求、同步请求)

    0. 准备工作

    由于Retrofit是基于OkHttp,所以还需要添加OkHttp库依赖,需要在build.grale添加如下依赖:

    dependencies {
        // Okhttp库
        compile 'com.squareup.okhttp3:okhttp:3.10.0'
        // Retrofit库
        compile 'com.squareup.retrofit2:retrofit:2.6.0'
    }

    添加网络权限

    <uses-permission android:name="android.permission.INTERNET"/>

    创建接收服务器返回数据的类:

    public class Blog {
        // 根据返回数据的格式和数据解析方式(Json、XML等)定义
        ...
    }

    1. 创建Retrofit实例

    创建Retrofit实例时需要通过 Retrofit.Builder,并调用baseUrl方法设置URL。

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://localhost:4567/")
            .build();

    注意:Retrofit 的 baseUlr 必须以 /(斜线) 结束,不然会抛出一个IllegalArgumentException。

    2. 定义接口

    定义请求接口的方式示例如下:

    public interface BlogService {
        @GET("blog/{id}")
        Call<ResponseBody> getBlog(@Path("id") int id);
    }

    注意这里的 interface不是class,所以我们是无法直接调用该方法,我们需要用Retrofit创建一个BlogService的代理对象。

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

    拿到代理对象之后,就可以调用了。

    3. 接口调用

    调用方式的示例如下:

    Call<ResponseBody> call = service.getBlog(2);
    // 通过call对象执行网络请求(同步请求execute,异步请求enqueue)
    call.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            try {
                System.out.println(response.body().string());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            t.printStackTrace();
        }
    });

    至此,使用Retrofit 就能够进行基本的网络请求了,如果需要更深层的使用,可以参考一下资料进行使用,后续我们在对这些高级的使用方法进行一一整理。

    三、Retrofit 添加header参数

    添加Header有以下几种方式:

    1. 使用注解的方式

    添加一个Header参数

    public interface UserService { 
        @Headers("Cache-Control: max-age=640000")
        @GET("/tasks")
        Call<List<Task>> getTasks();
    }

    添加多个Header参数

    public interface UserService { 
      @Headers({
        "Accept: application/vnd.yourapi.v1.full+json",
        "User-Agent: Your-App-Name"
      })
      @GET("/tasks/{task_id}")
      Call<Task> getTask(@Path("task_id") long taskId);
    }

    2. 使用代码的方式,则需要使用拦截器:

    OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 
    httpClient.addInterceptor(new Interceptor() { 
      @Override
      public Response intercept(Interceptor.Chain chain) throws IOException {
      Request original = chain.request();
      Request request = original.newBuilder().header("User-Agent", "Your-App-Name")
           .header("Accept", "application/vnd.yourapi.v1.full+json")
           .method(original.method(), original.body()).build();
      return chain.proceed(request);
      }
    }
    
    OkHttpClient client = httpClient.build(); 
    Retrofit retrofit = new Retrofit.Builder().baseUrl(API_BASE_URL)
    .addConverterFactory(GsonConverterFactory.create()).client(client).build();

    3. 使用注解的方式,但是Header参数每次提交的都不同,也就是动态的Header:

    public interface UserService { 
    @GET("/tasks")
    Call<List<Task>> getTasks(@Header("Content-Range") String contentRange);
    }

    4. 使用注解Map方式,也就是将多个Header参数进行封装:

    @GET("/search")
    Call<ResponseBody> list(@HeaderMap Map<String, String> headers);

    四、Retrofit 提交数据方式

    1. Retrofit实现Form提交

     Form表单提交,后台服务器是以 键值对 的形式来接受参数的,所以Retrofit也很聪明,把接口参数通过Map的形式来提交。使用@FieldMap,@POST注解。

        /**
         * 登录
         * post
         * 表单提交
         *
         * @param map
         * @return
         */
        @FormUrlEncoded
        @POST("login")
        Flowable<BaseDto<LoginDto>> login(@FieldMap Map<String, String> map);

    2. Retrofit实现Json提交

    Json提交就是可以把对象直接转换成Json字符串,提交到后台服务器。所以我们直接传递整个对象即可。Retrofit会帮我们把对象转换成Json,然后传递给后台服务器。使用@Body ,@POST注解。

        /**
         * 签到详情
         *
         * @param vo
         * @return
         */
        @POST("sign/getDate")
        Flowable<BaseDto<SignDetailDto>> signGetDate(@Body SignDetailVo vo);

    参考资料:

    1. 博文:https://www.jianshu.com/p/308f3c54abdd  

    2. 实例代码:https://github.com/ikidou/Retrofit2Demo/tree/master/client/src/main/java/com/github/ikidou

  • 相关阅读:
    PAT乙级真题1004. 成绩排名 (20)(解题)
    PAT乙级真题1003. 我要通过!(20)(解题)
    PAT乙级真题1002. 写出这个数 (20)(解题)
    PAT乙级真题1001. 害死人不偿命的(3n+1)猜想 (15)(解题)
    2015-03-06——ajax基础
    2015-03-06——正则表达式基础
    2015-02-09——js笔记
    2015-02-08——js笔记
    2015-02-07——js笔记
    2014-10-28——iframe多层嵌套时获取元素总结
  • 原文地址:https://www.cnblogs.com/renhui/p/11158333.html
Copyright © 2020-2023  润新知