zoukankan      html  css  js  c++  java
  • 【Android】Retrofi的基础使用教程

    文章参考学习自 阳光沙滩 ,是我在B站上发现的宝藏Up主,超级棒!

    在前段时间我写了一个java web后台,想做一个安卓端的打卡社区,后来发现请求和解析过于麻烦,就耽搁了。

    趁着空闲,研究了一下大部分项目中都采用的MVP+RxJava+Retrofit模式中的Retrofit,发现异常好用,特此记录一下。

    环境配置

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

    retrofit是基于okhttp的二次封装,在上一次文章中我们介绍了Gson这个强大的工具(点我跳转),这里retrofit也提供了配套的基于Gson的转换器

     implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

    都导入进来吧~

    另外,由于安卓9.0禁止明文传输,需要单独设置一下:

    联网权限

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

    允许明文访问

     android:usesCleartextTraffic="true"

    另外,请在build.gradle(app)中开启java 1.8支持

    compileOptions {
            sourceCompatibility 1.8
            targetCompatibility 1.8
        }

    请求接口设置

    retrofit在请求时候是使用注解来说明请求方式的

    写法同springboot的controller层相似

    都是注解(路径)+方法(传参)

    这里主要介绍几个比较常用的

    后台使用的是 https://gitee.com/sunofbeaches/SOBAndroidMiniWeb

    所有注解都应该写在一个接口类中,这里命名为API.class

    Retrofit初始化

     private static Retrofit retrofit=new Retrofit.Builder()
                .baseUrl("http://10.0.2.2:9102")
                .addConverterFactory(GsonConverterFactory.create())//增加一个转换工厂
                .build();

    值得一提的是,这里的10.0.2.2是安卓虚拟机访问电脑的ip地址

    无参Get请求

    这里@get代表get请求,后面是绝对路径

     @GET("/get/text")
        Call<JsonResult> getJson();

    方法体的返回类型都是Call<T>

    这个也不难理解,在okhttp中返回的是一个ResponseBody

    然后我们需要使用Gson对这个字符串进行解析再转成对象

    而有了Retrofit以后我们可以直接让他自动解析转成相应类型

    有参Get请求

    @GET("/get/param")
        Call<GetWithParamsResult>getWithParams(@Query("keyword")String keyword,
                                               @Query("page")int page,
                                               @Query("order")int order);

    参数的格式为:@Query(‘参数名称’)参数类型 变量名称

    当然如果参数很多,你可以直接使用Map来传值,即

     @GET("/get/param")
        Call<GetWithParamsResult>getWithParams(@QueryMap Map<String,Object> params);

    POST请求

    @POST("/post/string")
        Call<PostWithParamsResult>postWithParams(@Query("string")String content);

    同理,这里只需要把注解改成@POST即可。

    提一下,我们在设置返回类型的时候,可以使用一个工具:GsonFormat,把返回的json丢进去,会自动分析并生成对应的Bean类,非常方便

    如何使用

    在设置好接口后,我们就可以实例化接口对象了。

    public void postWithParams(View view) {
            Retrofit retrofit = RetrofitManager.getRetrofit();//获得一个Retrofit对象
            API api = retrofit.create(API.class);//通过接口创建一个API实体
            Call<PostWithParamsResult> c = api.postWithParams("hello world");//由接口获取相应的请求方法
            c.enqueue(new Callback<PostWithParamsResult>() {
                @Override
                public void onResponse(Call<PostWithParamsResult> call, Response<PostWithParamsResult> response) {
                    //我们可以看到,这里的Call的结果已经自动转变成实体对象了
                    //只需要使用response.body()即可获得
                    //在获取之前我们可以先判断一下状态
                    if(response.code()== HttpURLConnection.HTTP_OK){//判断是否请求成功
                        PostWithParamsResult result=response.body();
                        //TODO
                    }
                    
                }
    
                @Override
                public void onFailure(Call<PostWithParamsResult> call, Throwable t) {
    
                }
            });
        }

    我们可以看出,使用retrofit大大减少了我们配置、解析结果的代码量,非常方便。

    同时将请求方法全部写在接口中,方便修改,简洁明了~

  • 相关阅读:
    dB是乘以10还是乘以20
    FFT快速傅里叶变换的python实现
    f(t) = t的傅里叶系数
    如何从二进制文件中读取int型序列
    python中的bytes和str类型
    python文件读写
    matplotlib浅析
    什么是语法糖
    怎样查看一个可迭代对象的值
    十六进制颜色码及其表示-(6 digit color code)
  • 原文地址:https://www.cnblogs.com/robotpaul/p/12319379.html
Copyright © 2011-2022 走看看