【Android】Retrofit入门详解-程序员宅基地

技术标签: Android  

简介:大三学生党一枚!主攻Android开发,对于Web和后端均有了解。
个人语录取乎其上,得乎其中,取乎其中,得乎其下,以顶级态度写好一篇的博客。

一.Retrofit介绍

Retrofit是一款针对Android网络请求的框架,它的底层是基于Okhttp实现的,它的特点是使用运行时的注解提供功能。

使用前需要导入依赖

 //retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.1.0'
    //Gson converter
    implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
    //RxJava2 Adapter
    implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
    //okhttp
    implementation 'com.squareup.okhttp3:okhttp:3.4.1'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'

Retrofit的重点还在于它的注解。

二.Retrofit注解

Retrofit注解种类多,只要把注解掌握,那么Retrofit的使用就易如反掌。

2.1 请求方法注解

2.1.1 GET请求

get请求的请求参数是拼接在url中的,请看以下代码

public interface LoginService {
    
   
    @GET("userAccount=1001")
    Call<Result> findUserPwd();//GET方法根据userAccount查询密码的接口方法
   
}

其中Result是我们自定义的实体类,它包含了我们期望服务器返回的一些字段,在服务端,对于登录请求,我定义返回了三个字段。

package com.ibuyi.android.rxjava;

public class Result {
    
    private String res;//登录结果
    private String msg;//附加信息
    private int type;//用户类别

    public String getRes() {
    
        return res;
    }

    public void setRes(String res) {
    
        this.res = res;
    }

    public String getMsg() {
    
        return msg;
    }

    public void setMsg(String msg) {
    
        this.msg = msg;
    }

    public int getType() {
    
        return type;
    }

    public void setType(int type) {
    
        this.type = type;
    }
}

解释一下上面LoginService中的findUserPwd方法,这是一个GET请求,并且指明了userAccount=1001,它的返回值是一个Call对象,我们通过Call对象执行操作。

看一下我们如何在代码中调用这个接口!

public void findUserPwd(){
    
        String baseUrl = "http://xxxxx:8080/user/";
        //注意,baseUrl必须以“/”结尾
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)//绑定基础的ip信息等
                //最后我们访问的完整的url是
                //baseUrl+GET请求中的键值对
                //addconvertFactory添加对JSON返回值的支持
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
                //通过retrofit.create方法创建我们的接口
        LoginService login = retrofit.create(LoginService.class);
        //调用我们的findUserPwd方法返回一个Call请求,并且进行异步执行
        Call<Result> call = login.findUserPwd();
        call.enqueue(new Callback<Result>() {
    
            @Override
            public void onResponse(Call<Result> call, Response<Result> response) {
    
                
            }

            @Override
            public void onFailure(Call<Result> call, Throwable t) {
    
               
            }
        });
    }
2.1.2 POST请求

POST请求一般用来提交表单,修改数据库中的表内容。它的字段是包含在请求体中的。

public interface LoginService {
    
    //FormUrlEncoded表明这是一个表单请求
    @FormUrlEncoded
    @POST("login")//"login是我们要访问的服务,完整的url是baseUrl+login"
    Observable<Result> userLogin(@Field("userAccount") String userAccount,    @Field("userPwd") String userPwd);
    //@Field注解是我们要携带键值对的键的名称,在服务端,我们可以通过该键取出传入的值
   //Observable是使用了RxJava,如果不熟悉RxJava可以改为Call,或者查看我写的RxJava小白的入门教程,非常简单。但RxJava非常非常非常强大!
 
}

调用登录请求的过程和findUserPwd几乎一样.不同的是我们需要传入用户名和密码。
小白可以模仿GET请求,自己动手创建一个POST登录请求。

2.2 标记类注解

2.2.1 FormUrlEncoded

用于修饰Field注解和FieldMap注解
使用该注解,表示请求正文将使用表单网址编码。字段应该声明为参数,并用@Field注释或FieldMap注释。一言以蔽之,使用POST请求时,一般都会加上@FormUrlEncoded,特别是有参数时。

2.2.2 Multipart

Multipart注解表示允许多个@Part注解,其中@Part注解是用来上传文件的,如图片,视频等。下面是用Retrofit上传图片的代码。

public interface UpPhoto {
    
    @Multipart
    @POST("photo")//photo表示路径
    Call<Result> upPhoto(@Part MultipartBody.Part photo, @Part("description")RequestBody description);
    //@Part注解和@Field注解非常类似,只不过Field是用来传输一些基本数据类型,@Part可以用来传入文件
    //大体上就是声明类型不同,实质作用都是注解传入的参数
}

public void upPic() throws URISyntaxException {
    
        String baseUrl = "http://10.138.51.142:8080/user/";
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        URI uri = new URI("/sdcard/Pictures/pic/photo.png");
        File file = new File(uri);
        RequestBody photoRequestBody = RequestBody.create(MediaType.parse("image/png"),file);
        //photiRequestBody是用来描述与上传图片相关信息的载体,如类型,文件等,用来创建MultipartBody.Part
        MultipartBody.Part photo = MultipartBody.Part.createFormData("photos", "photo.png", photoRequestBody);
        UpPhoto up = retrofit.create(UpPhoto.class);
        RequestBody description = RequestBody.create(null, "hello,the pic is uping!");
        //desciption用来携带描述信息
        Call<Result> call = up.upPhoto(photo, description);
        call.enqueue(new Callback<Result>() {
    
            @Override
            public void onResponse(Call<Result> call, Response<Result> response) {
    
                
            }

            @Override
            public void onFailure(Call<Result> call, Throwable t) {
    

            }
        });
    }
2.2.3 Streaming

Streming代表相应的数据以流的形式返回,如果不使用他,则默认会把全部数据加载到内存,所以在下载大文件时需要加上折耳根注解。

2.3 参数类注解

2.3.1 Header和Headers

http请求中为了防止攻击或者过滤掉不安全的访问,或者添加特殊加密的访问等,以便减轻服务器的压力保证请求安全,通常都会在消息报头中携带一些特殊的消息头处理。
使用@Header添加消息报头,有静态方式和动态方式。
静态方式:直接写死

public interface UpPhoto {
    
    @Multipart
    @POST("photo")//photo表示路径
    @Headers("Accept-Encoding:application/json")//静态方式写死
    Call<Result> upPhoto(@Part MultipartBody.Part photo, @Part("description")RequestBody description);
 
}

动态方式:作为参数,从调用者传入

public interface UpPhoto {
    
    @Multipart
    @POST("photo")//photo表示路径
    Call<Result> upPhoto(@Part MultipartBody.Part photo, 
    //作为参数传入
    @Part("description")RequestBody description,@Header("Location") String location);

}

2.3.2 Body

传输数据类型JSON字符串,请看示例

    @POST("login")
    Call<Result> userLogin(@Body User user);

@Body这个注解会自动把User转换成json字符串。

2.3.3 Path

动态配置URL地址

  @POST("{path}")
    Call<Result> userLogin(@Path("path") String path);

这样我们就可在调用的地方传入Url了。

2.3.4 Field和FieldMap

Field已经介绍过了,就是传输键值对,有时候我们可能会需要传入多个键值对,此时使用FieldMap较好。

 @POST("/")
    @FormUrlEncoded
    Call<WeatherBeans> requestWeatherBeans(@FieldMap Map<String, String> fields);

关于注解,有一篇博客写的比较详细,建议阅读
Retrofit注解详解

三.总结

Retrofit是基于Okhttp的,但是又有自己的风格,一个很不错的网络请求框架!此外,我们使用Retrofit+RxJava进行开发也是事半功倍。

先别走,我有一个资源学习群要推荐给你,它是白嫖党的乐园,小白的天堂!
在这里插入图片描述
别再犹豫,一起来学习!
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43927892/article/details/106327310

智能推荐

OSPF特殊区域NSSA配置实验(思科)_ospf naas区域实验-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏4次。OSPF特殊区域NSSA配置实验一、实验目的二、实验内容三、实验流程四、查看和验证**OSPF特殊区域NSSA和Total NSSA配置实验总结:**一、实验目的1.掌握OSPF协议的工作原理及其LSA的类型划分;2.掌握OSPF特殊区域的概念、分类和特点;3.掌握路由器中OSPF特殊区域NSSA区域的基本配置方法和结果验证;二、实验内容完成思科路由器OSPF特殊区域NSSA区域的基本配置和结果验证;三、实验流程(一)配置任务说明如下图所示:区域0是骨干域,将区域1设置为nssa区域,完成_ospf naas区域实验

一条全表扫描sql语句的分析-程序员宅基地

文章浏览阅读128次。今天在对生产系统做监控的时候,发现一个process的cpu消耗很高,抓取了对应的session和执行的sql语句。发现是一个简单的update语句,这样一条如果CPU消耗较大,很可能是由于全表扫描的。UPDATECOMM_ACTIVITY SET COMM_ACTIVITY.EXTRACT_STATUS = N..._sql全表扫描语句

hadoop: hdfs:删除文件、文件夹等常用命令_hadoop删除文件命令-程序员宅基地

文章浏览阅读5w次,点赞7次,收藏28次。配置了环境变量直接执行:要从HDFS中删除文件,可以使用以下命令:hadoop fs -rm -r -skipTrash /path_to_file/file_name要从HDFS中删除文件夹,可以使用以下命令:hadoop fs -rm -r -skipTrash /folder_name..._hadoop删除文件命令

Spring(五)Spring整合Hibernate-程序员宅基地

文章浏览阅读275次。Spring整合Hibernate_spring整合hibernate

Eclipse 常用快捷键及使用技巧-程序员宅基地

文章浏览阅读78次。做 java 开发的,经常会用 Eclipse 或者 MyEclise 集成开发环境,一些实用的 Eclipse 快捷键和使用技巧,可以在平常开发中节约出很多时间提高工作效率,下面我就结合自己开发中的使用和大家分享一下 Eclipse 中常用到的快捷键和技巧。15 个 Eclipse 常用开发快捷键使用技巧1、alt+?或alt+/:自动补全代码或者提示代码这个是我最得意的快捷键组..._eclipese 使用技巧大全

42 SAP报错:作业类型 ACT001 没有为成本中心 1088 1200990001 设置(Activity type ATC001 not set up for cost center XXX)_作业类型 lab 没有为成本中心 ql99 1001 设置-程序员宅基地

文章浏览阅读567次,点赞6次,收藏11次。解决方案:CO模块使用前台事务码KP26维护活动类型价格,即可。业务操作:PP模块前台事务码CR02维护活动类型时,报错如上。报错原因:CO模块没有为活动类型进行价格维护。CO模块KP26维护作业类型价格完毕。2024年1月26日 写于上海。事务码KP26进入,_作业类型 lab 没有为成本中心 ql99 1001 设置

随便推点

Barcode Reader在45毫秒内实现条码识别-程序员宅基地

文章浏览阅读479次。应我的客户要求,需要找到一款可以在极短时间识别二维条码的软件以应对他们现在极其迅速的货品入库需求。正好听说过一款Dynamsoft Barcode Reader的开发包,根据其官网介绍最新版对条码检测速度比以前的版本快2倍以上。根据对Dynamsoft Barcode Reader8.8SDK包拆解,其中含了JavaScript Package /.NET Package /C/C++ Package /Python Package /Java Package /iOS Package /A..._barcode reader

mediasoup-demo在 Windows上的正确编译安装注意事项_npm安装那个版本最好-程序员宅基地

文章浏览阅读1.2k次。前人栽树,后人乘凉,文章参考https://blog.csdn.net/TsingSee/article/details/108618054,我要感谢此博客主,mediasoup-demo很多文章都是关于在linux系统下的,很多在windows都有问题,而唯独此博客主的文章正确。我学习此博客的文章对比才知道主要问题在于三点:1.node,npm版本最好是要高版本的。2.python版本问题,这个是最关键的,一定不能是python3版本,我这里用的是TSING博客主建议的python-v2.7.17_npm安装那个版本最好

关于Spacy_pip install spacy python -m spacy download en_vect-程序员宅基地

文章浏览阅读1.0k次。关于Spacy安装遇到的错误_pip install spacy python -m spacy download en_vectors_web_lg

人体姿态估计 HRNet C++版_hrnet的速度-程序员宅基地

文章浏览阅读3.7k次,点赞8次,收藏44次。最近由于项目原因,需要用到HRNet网络,加上前面的目标检测部分,使用python版本的代码运行太慢,于是想到了用c++来重写HRNet,将pytorch的模型文件转换为onnx,采用onnx的c++的推理库。然后目标检测网络采用轻量级的nanodet,同时也采用onnx进行推理。最后,在我的笔记本电脑上(GTX960M)进行单人的姿态估计也跑到了20帧左右。其中nanodet是0.01s左右,hrnet是0.04s左右,hrnet是w32_256*192的模型转换而来的。多人的话时间就是成倍增长。_hrnet的速度

@SuppressLint or @TargetApi_you can suppress the error with @suppresslint-程序员宅基地

文章浏览阅读788次。@TargetApi and @SuppressLint have the same core effect: they suppress the Lint error.The difference is that with @TargetApi, you declare, via the parameter, what API level you have addressed i_you can suppress the error with @suppresslint

关于Error in callback for watcher “data“: “TypeError: data.indexOf is not a function“的错误_error in callback for watcher "data": "typeerror: -程序员宅基地

文章浏览阅读2.8w次,点赞10次,收藏12次。关于Error in callback for watcher “data”: "TypeError: data.indexOf is not a function"的错误说明原因:表格显示需要数组包含对象的形式,每个对象是一行数据,拿到的数据格式不对。错误例子:从后台获取数据res.data,显示在表格中。只有一条数据,六个内容,应该是一行六列,但是出现了六行六列,且都为空。报三个..._error in callback for watcher "data": "typeerror: data.indexof is not a func

推荐文章

热门文章

相关标签