当前位置: 首页 > news >正文

Android retrofit

目录

一.简介

二.基本使用

三.注解

四.转换器

五.适配器

六.文件上传与下载


一.简介
A type-safe HTTP client for Android and Java。封装了OkHttp,也是由Square公司贡献的一个处理网络请求的开源项目。
square/retrofit: A type-safe HTTP client for Android and the JVM (github.com)
在bulid.gradle中添加依赖
implementation 'com.squareup.retrofit2:retrofit:2.11.0'
二.基本使用

服务器域名: https:/ /www.httpbin.org/

接口:post
参数:username,password
接口:get 
参数:usernamespassword

1.根据Http接口创建Java接口
public interface HttpbinService {@POST("post")@FormUrlEncodedCall<ResponseBody> post(@Field("username") String userName,@Field("password") String pwd);@GET("get")Call<ResponseBody> get(@Query("username") String userName,@Query("password") String pwd);
}

2.创建Retrofit对象,并生成接口实现类对象

Retrofit retrofit = new Retrofit.Builder().baseUrl("https://httpbin.org/").build();
HttpbinService httpbinService = retrofit.create(HttpbinService.class);

3.接口实现类对象调用对应方法获得响应

retrofit2.Call<ResponseBody> call = httpbinService.post("xx", "123");call.enqueue(new retrofit2.Callback<ResponseBody>() {@Overridepublic void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {try {Log.i("TAG",response.body().string());} catch (IOException e) {e.printStackTrace();}}@Overridepublic void onFailure(retrofit2.Call<ResponseBody> call, Throwable throwable) {}});
三.注解
方法注解:@GET,@POST,@PUT,@DELETE,@PATH,@HEAD,@OPTIONS,@HTTP
标记注解:@FormUrlEncoded,@Multipart,@Streaming
参数注解:@Query,@QueryMap,@Body,@Field,@FieldMap,@Part,@PartMap
其他注解:@Path,@Header, @Headers,@Url
详细使用请参考 GET (retrofit API) (square.github.io)
public interface HttpbinService {@POST("post")@FormUrlEncodedCall<ResponseBody> post(@Field("username") String userName,@Field("password") String pwd);@GET("get")Call<ResponseBody> get(@Query("username") String userName,@Query("password") String pwd);@HTTP(method = "POST",path = "post",hasBody = true)Call<ResponseBody> http(@Field("username") String userName,@Field("password") String pwd);@POST("post")Call<ResponseBody> postBody(@Body RequestBody body);@POST("{id}") //("/xxx/{pageNum}")@FormUrlEncodedCall<ResponseBody> postInPath(@Path("id") String path,@Header("os") String os1,@Field("username") String userName,@Field("password") String pwd);//@Path("pageNum")@Headers({"os:android","version:1.0"})@POST("post")Call<ResponseBody> postWithHeader();@POST()Call<ResponseBody> postUrl(@Url String url);
}

四.转换器
在我们接到服务器的响应后,目前无论是OkHttp还是Retrofit都只能接收到String字符串类型的数据,在实际开发中,经常需要对字符串进行解析将其转变为一个Java Bean对象。比如服务器响应数据为JSON格式字符串,那么可以自己利用GSON库完成反序列化的操作。而Retrofit提供了多个转换器使得响应能够完成自动的数据转换。以json解析为例:
添加依赖
implementation 'com.squareup.retrofit2:converter-gson:2.11.0'

手动转换

public interface WanAndroidService {@POST("user/login")@FormUrlEncodedCall<ResponseBody> login(@Field("username") String username,@Field("password") String pwd);
}
Retrofit retrofit = new Retrofit.Builder().baseUrl("https://www.wanandroid.com/").build();WanAndroidService wanAndroidService = retrofit.create(WanAndroidService.class);@Testpublic void loginTest() throws IOException {Call<ResponseBody> call = wanAndroidService.login("xxx","123456");Response<ResponseBody> response  =call.execute();String result  = response.body().string();System.out.println(result);//手动进行数据转换BaseResponse baseResponse  = new Gson().fromJson(result,BaseResponse.class);System.out.println(baseResponse);}

自动转换

修改接口方法:
@POST("post")
@FormUrlEncoded
Call<JavaBean> post(@Field("username") String userName, @Field("password") String pwd);
public interface WanAndroidService2 {@POST("user/login")@FormUrlEncodedCall<BaseResponse> login(@Field("username") String username, @Field("password") String pwd);
}
Retrofit retrofit1 = new Retrofit.Builder().baseUrl("https://www.wanandroid.com/").addConverterFactory(GsonConverterFactory.create())  //添加转换器.build();WanAndroidService2 wanAndroidService2 = retrofit1.create(WanAndroidService2.class);@Testpublic void loginConvertTest() throws IOException {Call<BaseResponse> call = wanAndroidService2.login("xxx","123456");Response<BaseResponse> response = call.execute();BaseResponse baseResponse = response.body();System.out.println(baseResponse);}
五.适配器
在实际开发中,可能会存在:需要先请求A接口,再请求B接口的情况。比如需要请求获取收藏文章列表,但是需要先登录拿到Cookie才能请求收藏文章列表接口。此时请求就有了先后顺序,为了完成这个功能,需要不断回调。Retrofit的接口方法返回类型必须是Call,如果能够将Call改为RxJava中的Observable,对于嵌套的情况,就能得到非常方便优雅的解决。这就是适配器的功能,如果我们想要返回的不是Call,适配器就能够帮助我们转换为其他类型。以RxJava3为例:
添加依赖
implementation 'com.squareup.retrofit2:adapter-rxjava3:2.11.0'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'
修改接口方法:
@POST("post")
@FormUrlEncoded
Observable<JavaBean> post(@Field("username") String userName, @Field("password") String pwd);
@POST("user/login")@FormUrlEncodedFlowable<BaseResponse> login2(@Field("username") String username, @Field("password") String pwd);@GET("lg/collect/list/{pageNum}/json")Flowable<ResponseBody> getArticle(@Path("pageNum") int pageNum);
Map<String, List<Cookie>> cookies = new HashMap<>();Retrofit retrofit2 = new Retrofit.Builder().baseUrl("https://www.wanandroid.com/").callFactory(new OkHttpClient.Builder().cookieJar(new CookieJar() {@Overridepublic void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {cookies.put(httpUrl.host(), list);}@Overridepublic List<Cookie> loadForRequest(HttpUrl url) {List<Cookie> cookies = WanAndroidUnitTest.this.cookies.get(url.host());return cookies == null ? new ArrayList<>() : cookies;}}).build()).addConverterFactory(GsonConverterFactory.create())  //添加转换器.addCallAdapterFactory(RxJava3CallAdapterFactory.create())  //添加适配器.build();WanAndroidService2 wanAndroidService3 = retrofit2.create(WanAndroidService2.class);@Testpublic void rxjavaTest() {wanAndroidService3.login2("xxxx","123456").flatMap(new Function<BaseResponse, Publisher<ResponseBody>>() {@Overridepublic Publisher<ResponseBody> apply(BaseResponse baseResponse) throws Throwable {return wanAndroidService3.getArticle(0);}}).observeOn(Schedulers.io()).subscribeOn(Schedulers.newThread())   //AndroidSchedulers.mainThread().subscribe(new Consumer<ResponseBody>() {@Overridepublic void accept(ResponseBody responseBody) throws Throwable {System.out.println(responseBody.string());}});while (true){}}
六.文件上传与下载
@POST("post")@MultipartCall<ResponseBody> upload(@Part MultipartBody.Part file);@GETCall<ResponseBody> download(@Url String url);
@Testpublic void uploadFileTest() throws IOException {File file = new File("H:\\Users\\ASUS\\Desktop\\f1.txt");MultipartBody.Part part = MultipartBody.Part.createFormData("file1", "f1.txt",RequestBody.create(MediaType.parse("text/plain"), file));Call<ResponseBody> call = uploadService.upload(part);System.out.println(call.execute().body().string());}@Testpublic void downloadFileTest() throws IOException {Response<ResponseBody> response = uploadService.download("https://xxx.apk").execute();InputStream inputStream = response.body().byteStream();FileOutputStream fos = new FileOutputStream("H:\\Users\\ASUS\\Desktop\\1.apk");int len;byte[] buffer = new byte[4096];while ((len = inputStream.read(buffer)) != -1){fos.write(buffer,0,len);}fos.close();inputStream.close();}

相关参考

Retrofit (square.github.io)​​​​​​​

ReactiveX/RxJava: RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM. (github.com)

ReactiveX/RxAndroid: RxJava bindings for Android (github.com)​​​​​​​

相关文章:

Android retrofit

目录 一.简介 二.基本使用 三.注解 四.转换器 五.适配器 六.文件上传与下载 一.简介 A type-safe HTTP client for Android and Java。封装了OkHttp&#xff0c;也是由Square公司贡献的一个处理网络请求的开源项目。 square/retrofit: A type-safe HTTP client for Andr…...

【C++风云录】五款 C++ 库的探索与应用:物联网、嵌入式与数据处理

提升你的C技能&#xff1a;五个关键库的使用与指南 前言 在今天的数字化世界里&#xff0c;C 作为一种强大且快速的编程语言&#xff0c;在各类复杂系统和应用的开发中扮演着重要角色。然而&#xff0c;单凭语言本身的能力&#xff0c;我们往往无法实现所有的功能需求&#x…...

Qt_30道常见面试题及答案

1. 简述 Qt 是什么&#xff1f; 答&#xff1a;Qt 是一个跨平台的应用程序开发框架&#xff0c;它提供了一系列的工具和库&#xff0c;用于开发图形用户界面&#xff08;GUI&#xff09;应用程序。 2. Qt 有哪些主要模块&#xff1f; 答&#xff1a;Qt 的主要模块包括 Qt Co…...

【vue】v-model 双向数据绑定

:value&#xff1a;单向数据绑定v-model&#xff1a;双向数据绑定 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…...

C#创建磁性窗体的方法:创建特殊窗体

目录 一、磁性窗体 二、磁性窗体的实现方法 (1)无标题窗体的移动 (2)Left属性 (3)Top属性 二、设计一个磁性窗体的实例 &#xff08;1&#xff09;资源管理器Resources.Designer.cs设计 &#xff08;2&#xff09;公共类Frm_Play.cs &#xff08;3&#xff09;主窗体 …...

Gateway 基本配置指南:构建高效的网络接入网关

简介&#xff1a; Gateway 是一个常用的网络接入网关&#xff0c;它可以帮助组织实现安全、可靠和高性能的网络连接。本文将介绍 Gateway 的基本配置&#xff0c;帮助读者了解如何正确配置和部署一个高效的 Gateway 网关。 1.网络拓扑规划&#xff1a; 在配置 Gateway 前&#…...

自定义类型: 结构体 (详解)

本文索引 一. 结构体类型的声明1. 结构体的声明和初始化2. 结构体的特殊声明3. 结构体的自引用 二. 结构体内存对齐1. 对齐规则2. 为啥存在对齐?3. 修改默认对齐值 三. 结构体传参四. 结构体实现位段1. 什么是位段?2. 位段的内存分配3. 位段的应用4. 位段的注意事项 ​ 前言:…...

设计模式(23):访问者模式

定义 表示一个作用于某对象结构中的各元素的操作&#xff0c;它使我们可以在不改变元素的类的前提下定义作用与这些元素的新操作。 模式动机 对于存储在一个集合中的对象&#xff0c;他们可能具有不同的类型(即使有一个公共的接口)&#xff0c;对于该集合中的对象&#xff0…...

【C++】类和对象③(类的默认成员函数:拷贝构造函数 | 赋值运算符重载)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 拷贝构造函数 概念 拷贝构造函数的特性及用法 赋值运算符重载 运算符重载 赋值运算符重载 结语 前言 本篇主要内容&#xff1a;类的6个默认成员函数中的拷贝构造函数…...

掀起区块链开发狂潮!Scaffold-eth带你一键打造震撼DApp

文章目录 前言一、Scaffold-eth是什么&#xff1f;二、安装和配置1.准备工作2.安装3.配置开发环境 三、进阶使用1.放入自己的合约2.部署运行 总结 前言 前面的文章传送&#x1f6aa;&#xff1a;hardhat入门 与 hardhat进阶 在之前的文章中&#xff0c;我们已经探讨了使用Har…...

【Qt 学习笔记】Qt常用控件 | 按钮类控件Check Box的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 按钮类控件Check Box的使用及说明 文章编号&#xff1a;…...

android gradle 配置远程仓库

build.gradle buildscript { ext.kotlin_version "1.6.0" // 使用适合你项目的Kotlin版本 repositories { maven { url http://maven.aliyun.com/nexus/content/groups/public/ } maven { url http://maven.aliyun.com/nexus/content/repos…...

第十二章 OpenGL ES 基础-色温、色调、亮度、对比度、饱和度、高光

第十二章 OpenGL ES 基础-色温、色调、亮度、对比度、饱和度、高光 第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标 第二章 OpenGL ES 基础-GLSL语法简单总结 第三章 OpenGL ES 基础-GLSL渲染纹理 第四章 OpenGL ES 基础-位移、缩放、旋转原理 第五章 OpenGL ES 基础-透视投影…...

力扣经典150题解析之二十八:盛最多水的容器

目录 力扣经典150题解析之二十八&#xff1a;盛最多水的容器1. 介绍2. 问题描述3. 示例4. 解题思路5. 算法实现6. 复杂度分析7. 测试与验证测试用例设计测试结果分析 8. 总结9. 参考文献感谢阅读 力扣经典150题解析之二十八&#xff1a;盛最多水的容器 1. 介绍 在这篇文章中&…...

Rockchip Android13 Vold(二):Framework层

目录 前言 1、接收VolumeInfo状态 2、通知VolumeInfo状态变化 3、创建StorageVolume...

Oracle数据库故障类别及日常运维规划策略

一、故障类别 1、语句故障 单个数据库操作失败&#xff08;select、insert、update或delete&#xff09;&#xff0c;如&#xff1a; 在表中输入无效的数据&#xff0c;解决方法&#xff1a;可与用户合作来验证并更正数据&#xff1b;执行操作&#xff0c;但权限不足&#x…...

电商技术揭秘九:搜索引擎中的SEO数据分析与效果评估

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台的个性…...

多线程传参以及线程的优缺点

进程是资源分配的基本单位 线程是调度的基本单位 笼统来说&#xff0c;线程有以下优点&#xff1a; 创建一个新线程的代价要比创建一个新进程小得多 与进程之间的切换相比&#xff0c;线程之间的切换需要操作系统做的工作要少很多 线程占用的资源要比进程少很多 能充分利用多…...

keil创建单片机工程

一、创建工程 打开Keil uVision4&#xff0c;依次选择 Project—>New uVision4 Project&#xff0c;选择工程保存路径及填写工程名称&#xff0c;如下图 然后点“保存”。在Select a CPU Data Base File中选择"STC MCU Database"&#xff0c;点 "OK"&am…...

QT 串口助手 学习制作记录

QT 串口助手qt 学习制作记录 参考教程&#xff1a;​​​​​​QT初体验&#xff1a;手把手带你写一个自己的串口助手_qt设计串口助手的流程图-CSDN博客 Qt之串口编程&#xff08;添加QSerialPort模块&#xff09;_如何安装 qt串口模块教程-CSDN博客 串口调试助手&#xff1…...

Github 2024-04-13 Rust开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-13统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10CUE项目1Go项目1Tauri: 构建小型、快速和安全的桌面应用程序 创建周期:1673 天开发语言:Rust协议类型:Apache License 2.0Star数量…...

大模型日报|今日必读的10篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.谷歌推出新型 Transformer 架构&#xff1a;反馈注意力就是工作记忆 虽然 Transformer 给深度学习带来了革命性的变化&#xff0c;但二次注意复杂性阻碍了其处理无限长输入的能力。 谷歌研究团队提出了一种新型 T…...

深度学习 Lecture 8 决策树

一、决策树模型&#xff08;Decision Tree Model) 椭圆形代表决策节点&#xff08;decison nodes)&#xff0c;矩形节点代表叶节点&#xff08;leaf nodes)&#xff0c;方向上的值代表属性的值&#xff0c; 构建决策树的学习过程&#xff1a; 第一步&#xff1a;决定在根节点…...

打包 docker 容器镜像到另一台电脑

# 提交容器为镜像 <container_id> 容器id my_migration_image 镜像名称 docker commit <container_id> my_migration_image # 保存镜像为tar文件 docker save my_migration_image > my_migration_image.tar 在另一台电脑上导入上面的镜像&#xff0c;请…...

贪心算法--购买股票

给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得的 最大 利润 。 示例 1&a…...

在Mac主机上连接Linux虚拟机

前言 最近醉心于研究Linux&#xff0c;于是在PD上安装了一个Debian Linux虚拟机&#xff0c;用来练练手。但是每次在mac和Linux之间切换很是麻烦&#xff0c;有没有一种方法&#xff0c;可以在mac终端直接连接我的虚拟机&#xff0c;这样在mac终端上就可以直接操控我的Linux虚…...

前端如何单独做虚拟奖金池?

公司业务需求要做一个虚拟奖金池&#xff0c;具体是需求是&#xff0c;不需要后端数据支持&#xff0c;但是又需要不同用户看到的奖金池数据每次变动都是一致的&#xff0c;并且要在给定的最小最大值中变动。 一开始看需求&#xff0c;因为需要所有登录/未登录&#xff0c;不同…...

前端md5校验文件

前端获取文件的md5值&#xff0c;与文件一同传到后端&#xff0c;后端同样对md5值进行校验。如果相同&#xff0c;则文件未被损坏&#xff08;其实这种方式优点类似于tcp、ip的差错校验&#xff0c;好像token也是这种方式&#xff09; 项目准备 前端并不可能手写一个算法来实…...

总结SQL相对常用的几个字符函数

目录 字符的截取 substr() trim()、ltrim()、rtrim() 字符串的拼接 ||、 字符的大小写转换 upper(column_name):大写 lower(column_name):小写 字符替换 replace() 搜索字符 instr(column_name, substring_to_find,start,n_appearence) charindex(substring_to_fi…...

云计算笔记

RAID的组合方式 RAID0&#xff1a;多个硬盘同时工作&#xff0c;可提供性能&#xff0c;无冗余机制 RAID1&#xff1a;数据保存多份&#xff0c;提供冗余机制&#xff0c;性能受到影响 RAID3&#xff1a;存在数据盘和单独校验盘&#xff0c;数据写入 至数据盘后需要运算且将…...

网站可以做哪些内容/搜索引擎营销的概念

在MySQL中&#xff0c;无法在FROM子句中使用select from过程。您可以使用CALL命令&#xff0c;然后可以执行SELECT语句。让我们首先创建一个表&#xff1a;mysql> create table DemoTable2-> (-> CustomerId int NOT NULL AUTO_INCREMENT PRIMARY KEY,-> CustomerN…...

信息化建设 公司网站/青岛网站建设制作推广

作为leetcode已通关的少年&#xff0c;我见识过许多优秀的解法&#xff0c;有效地提高了自己的姿势水平。这些解法&#xff0c;典型特征就是精简&#xff0c;很多到了“减无可减”的地步。即使是没学过cs的同学&#xff0c;或许都能感受到&#xff0c;那种简洁洗练的魅力。个人…...

郑州的建设网站有哪些手续费/人民网 疫情

因为WIN3不支持这个功能&#xff0c;你可以在WIN3上自己打一个ssh服务器...

浙江网站建设抖音seo优化/app开发需要哪些技术

Oracle GoldenGate软件基于数据库日志结构变化&#xff0c;通过解析源端在线日志或归档日志获得数据增量&#xff0c; 再将这些变化传输并应用到目标数据库&#xff0c;从而实现源库和目标库的数据同步 卸载goldengate&#xff0c;需要停止gg相关的所有服务&#xff0c;删除gg所…...

承德做网站优化/网站系统

基于前面文章的基础上。 一、准备 需要的jar 二、配置 1、 spmvc-servlet.xml <?xml version"1.0" encoding"UTF-8" ?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchem…...

建设网站哪些好/seo入门基础教程

【关键字】c关键字 1. alignas (c11) 设置类和struct的字节对齐方式 默认取值是: 2n : 0, 1, 2, 4 , 6, 8..... 2. alignof 区分sizeof(), alignof得到字节对齐的字节数 #include <iostream> using namespace std;//对结构体或类进行表示, 设置对齐方式为8字节 struct …...