当前位置: 首页 > 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…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...