Android Retrofit使用详情

一、 Retrofit是什么

Retrofit是Android用来接口请求的网络框架,内部是基于OkHttp实现的,retrofit负责接口请求的封装,retrofit可以直接将接口数据解析为Bean类、List集合等,直接简化了中间繁琐的数据解析过程

二、 Retrofit的简单使用

  • Retrofit在github的地址 :https://github.com/square/retrofit
  • Retrofit官方使用介绍 :https://square.github.io/retrofit/

2.1 在项目中引入retrofit

    implementation 'com.squareup.retrofit2:retrofit:2.9.0'implementation 'com.squareup.retrofit2:converter-gson:2.9.0'//解析json字符所用

2.2 清单文件AndroidManifest.xml中添加网络权限

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

Google在Android p为了安全起见,已经明确规定禁止http协议额,接口都是https请忽略,如果接口有http请在清单文件AndroidManifest.xml中application先添加networkSecurityConfig配置

	<applicationandroid:name=".App"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:networkSecurityConfig="@xml/network_security_config"android:requestLegacyExternalStorage="true"android:supportsRtl="true"android:theme="@style/AppTheme"tools:ignore="UnusedAttribute">

res文件夹下新建xml文件夹,xml文件夹中新建network_security_config文件,文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config><base-config cleartextTrafficPermitted="true" />
</network-security-config>

2.3 创建Retrofit

Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").addConverterFactory(GsonConverterFactory.create())//设置数据解析器.build();

2.4 创建RetrofitApi

//定义 网络API 地址
public interface RetrofitApi{@GET("users/{user}/repos")Call<List<User>> getData(@Path("user") String user);
}

2.5 请求接口

//获取API 
GitHubService service = retrofit.create(RetrofitApi.class);Call<List<User>> call= service.getData("user");

2.6 发送请求数据

        //异步call.enqueue(new Callback<List<User>>() {@Overridepublic void onResponse(Call<List<User>> call, Response<List<User>> response) {//处理请求数据}@Overridepublic void onFailure(Call<List<User>> call, Throwable throwable) {}});//同步try {Response<List<User>> execute = call.execute();execute.body().toString();} catch (IOException e) {e.printStackTrace();}

三、Retrofit注解参数类型

在这里插入图片描述

3.1 网络请求方法

3.1.1 GET请求

//简单的get请求(没有参数)@GET("user")Call<UserInfo> getItem();
//简单的get请求(URL中带有参数)@GET("News/{userId}")Call<TradesBean> getItem(@Path("userId") String userId);
//参数在url问号之后@GET("trades")Call<TradesBean> getItem(@Query("userId") String userId);
//get请求,多个请求参数@GET("trades")Call<TradesBean> getItem(@QueryMap Map<String, String> map);@GET("trades")Call<TradesBean> getItem(@Query("userId") String userId,@QueryMap Map<String, String> map);
//get请求,不使用baseUrl,直接请求url地址@GETCall<TradesBean> getItem(@Url String url,@QueryMap Map<String, Object> params);

3.1.2 POST请求

http://192.168.43.173/api/trades/{userId}

//需要补全URL,post的数据只有一条reason@FormUrlEncoded@POST("trades/{userId}")Call<TradesBean> postResult(@Path("userId") String userId,@Field("reason") String reason;

http://192.168.43.173/api/trades/{userId}?token={token}

//需要补全URL,问号后需要加token,post的数据只有一条reason@FormUrlEncoded@POST("trades/{userId}")Call<TradesBean> postResult(@Path("userId") String userId,@Query("token") String token,@Field("reason") String reason;//post一个对象@POST("trades/{userId}")Call<TradesBean> postResult(@Path("userId") String userId,@Query("token") String token,@Body TradesBean bean;
//post请求,不使用baseUrl,直接请求url地址@FormUrlEncoded@POSTCall<TradesBean> postResultl(@Url String url,@FieldMap Map<String, Object> params);
3.2 标记类

在这里插入图片描述
3.2.1 @FormUrlEncoded

  • 作用:表示发送form-encoded的数据
  • @FieldMap必须与 @FormUrlEncoded 一起配合使用

3.2.2 @Multipart

  • 作用:表示发送form-encoded的数据(适用于 有文件 上传的场景)
  • 每个键值对需要用@Part来注解键名,随后的对象需要提供值。
    @Multipart@POSTCall<ResponseBody> uploadFiles(@Url String uploadUrl,@Part MultipartBody.Part file);

3.2.3 @Steaming

  • 表示数据以流的形式返回
  • 大文件官方建议用 @Streaming 来进行注解,不然会出现IO异常,小文件可以忽略不注入
    /*** 大文件官方建议用 @Streaming 来进行注解,不然会出现IO异常,小文件可以忽略不注入** @param fileUrl 地址* @return ResponseBody*/@Streaming@GETCall<ResponseBody> downloadFile(@Url String fileUrl);
3.3 网络请求类

在这里插入图片描述
3.3.1 @Header & @Headers

  • 添加请求头 &添加不固定的请求头
// @Header
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)// @Headers
@Headers("Authorization: authorization")
@GET("user")
Call<User> getUser()// 以上的效果是一致的。
// 区别在于使用场景和使用方式
// 1. 使用场景:@Header用于添加不固定的请求头,@Headers用于添加固定的请求头
// 2. 使用方式:@Header作用于方法的参数;@Headers作用于方法

3.3.2 @Body

  • 以 Post方式 传递 自定义数据类型 给服务器,@Body会将请求参数放到请求体中,所以适用于POST请求
  • Body相当于多个@Field,以对象的方式提交,@Body 提交的提交的Content-Type 为application/json; charset=UTF-8
  • @Body标签不能和@FormUrlEncoded或@Multipart标签同时使用,会报错

3.3.3 @Field & @FieldMap

  • 发送 Post请求 时提交请求的表单字段
  • @FieldMap必须与 @FormUrlEncoded 一起配合使用
  • 提交的Content-Type 为application/x-www-form-urlencoded

3.3.4 @Part & @PartMap

  • 发送 Post请求 时提交请求的表单字段

与@Field的区别:功能相同,但携带的参数类型更加丰富,包括数据流,所以适用于 有文件上传 的场景,与 @Multipart 注解配合使用

3.3.5 @Query和@QueryMap

  • 用于 @GET 方法的查询参数(Query = Url 中 ‘?’ 后面的 key-value)
//参数在url问号之后@GET("trades")Call<TradesBean> getItem(@Query("userId") String userId);

3.3.6 @Path

  • URL地址的缺省值
        @GET("users/{user}/repos")Call<ResponseBody>  getBlog(@Path("user") String user );// 访问的API是:https://api.github.com/users/{user}/repos// 在发起请求时, {user} 会被替换为方法的第一个参数 user(被@Path注解作用)

3.3.7 @Url

  • 直接传入一个请求的 URL变量 用于URL设置
  @GETCall<ResponseBody> testUrlAndQuery(@Url String url, @Query("showAll") boolean showAll);// 当有URL注解时,@GET传入的URL就可以省略// 当GET、POST...HTTP等方法中没有设置Url时,则必须使用 {@link Url}提供

下一篇文章总结一下Retrofit+Rxjava封装成网络请求库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/616848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

必须掌握的100+个Linux命令大全【持续更新中】

别有一番风趣的alias … note:: 寒蝉凄切&#xff0c;对长亭晚&#xff0c;骤雨初歇。 柳永《雨霖铃》 Linux alias命令用于设置指令的别名&#xff0c;可以将比较长的命令进行简化。 默认情况下会输出当前的设置&#xff1a; $ alias lls -lah lals -lAh llls -lh lsls --…

C++学习笔记——多态与静态联编和动态联编

目录 一、多态 二、静态联编&#xff08;Static Binding&#xff09;和动态联编&#xff08;Dynamic Binding&#xff09; 2.1静态联编 2.2动态联编 一、多态 是C中面向对象编程的一个核心概念&#xff0c;它允许派生类对象替代其基类对象&#xff0c;从而实现代码重用和扩…

代码随想录算法训练营第17天 | 110.平衡二叉树 + 257. 二叉树的所有路径 + 404.左叶子之和

今日内容 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 110.平衡二叉树 - Easy 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1…

springboot注解@PropertySource作用

简介 PropertySource 是 Spring 框架中的一个注解&#xff0c;用于指定一个或多个属性文件&#xff08;通常是.properties文件&#xff09;这些文件包含了应用程序需要的配置信息。当你在 Spring 的配置类中使用此注解时&#xff0c;Spring 容器会加载这些属性文件&#xff0c…

01.坦克大战项目-Java绘图坐标体系

01.坦克大战项目- Java绘图 01. Java绘图坐标体系 1. 坐标体系介绍 ​ 下图说明了java坐标系。坐标原点位于左上角&#xff0c;以像素为单位。在Java坐标系中&#xff0c;第一个是x坐标系&#xff0c;表示当前位置为水平方向&#xff0c;距离坐标原点x个像素&#xff1b;第二…

揭露欧拉骗局4.“Σ1/n²=π²/6”里的猫腻

自然数平方倒数求和Σ1/n是一个并不复杂的问题&#xff0c;但它困扰了欧洲大陆整整90年&#xff0c;在欧系数学里它被称为“巴塞尔级数”。 解决巴塞尔级数让欧拉一战成名&#xff0c;然而欧拉采用的方法对数学这门学问是严重的侮辱。数学是工具学科&#xff0c;数学的宗旨是化…

Asp .Net Core 系列: 集成 Consul 实现 服务注册与健康检查

文章目录 什么是 Consul?安装和运行 ConsulAsp .Net Core 如何集成 Consul 实现服务注册和健康检查Consul.AspNetCore 中的 AddConsul 和 AddConsulServiceRegistration 方法 究竟做了什么&#xff1f;AddConsul 方法AddConsulServiceRegistration 方法 配置 Consul 检查服务封…

【椒盐玉兔】GPTs Store 商店的TOP100 自定义GPT使用报告

详细的图文报告有100张图&#xff0c;因为太长就放网盘链接 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;ub2n 解压密码&#xff1a;heehel 更多作品&#xff1a;长期更新国内外&#xff0c;中英文AI人工智能作品 整理获取 通过算法&#xff0c;筛选出了目前访…

每天刷两道题——第十四天

1.1矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用原地算法。 输入&#xff1a;matrix [[0,1,2,0],[3,4,5,2],[1,3,1,5]] 输出&#xff1a;[[0,0,0,0],[0,4,5,0],[0,3,1,0]] 原地算法&#xff08;…

Java面试题(java高级面试题)

线程池的核心线程数设置为多大比较合理&#xff1f; Worker线程在执行的过程中&#xff0c;有一部计算时间需要占用CPU&#xff0c;另一部分等待时间不需要占用CPU&#xff0c;通过量化分析&#xff0c;例如打日志进行统计&#xff0c;可以统计出整个Worker线程执行过程中这两…

书生·浦语大模型--第二节课笔记

书生浦语大模型--第二节课 大模型及InternLM基本介绍实战部分demo部署准备工作模型下载代码准备终端运行web demo 运行 Lagent 智能体工具调用 Demo准备工作Demo 运行 浦语灵笔图文理解创作 Demo环境准备下载模型下载代码运行 大模型及InternLM基本介绍 大模型 定义&#xff…

一阶低通滤波器

一阶低通滤波器 X为输入&#xff0c;Y为滤波后得到的输出值&#xff1b;本次的输出结果主要取决于上次的滤波输出值&#xff0c;其中a是和滤波效果有关的一个参数&#xff0c;称为滤波系数&#xff1b;它决定新采样值在本次滤波结果中所占的权重&#xff1b; 滤波系数a越小&a…

500mA High Voltage Linear Charger with OVP/OCP

一、General Description YHM2810 is a highly integrated, single-cell Li-ion battery charger with system power path management for space-limited portable applications. The full charger function features Trickle-charge, constant current fast charge and const…

Java中的栈和队列操作,相互实现(力扣 232, 225)

栈和队列&#xff08;Java&#xff09; Java中的 栈 & 队列 操作栈的使用队列的使用 LeetCode 232. 用栈实现队列我的代码 LeetCode 225. 用队列实现栈我的代码 Java中的 栈 & 队列 操作 栈的使用 栈的方法功能Stack()构造一个空的栈E push(E e)将e入栈&#xff0c;并…

【开源】基于JAVA语言的民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

Vulnhub-GoldenEye

一、信息收集 nmap探测&#xff1a;nmap -p 1-65535 -T4 -A -v 192.168.1.9 PORT STATE SERVICE VERSION 25/tcp open smtp Postfix smtpd |_smtp-commands: ubuntu, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN |_…

Python基础知识:整理12 JSON数据格式的转换

首先导入python中的内置包json import json 1 准备一个列表&#xff0c;列表内每个元素都是字典&#xff0c;将其转换为JSON 使用json.dumps()方法 data [{"name": "John", "age": 30}, {"name": "Jane", "age":…

HarmonyOS Stage模型 UIAbility生命周期状态

UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态 Create状态&#xff0c;在UIAbility实例创建时触发&#xff0c;对应onCreate回调。可以在onCreate回调中进行相关初始化操作 import UIAbility from ohos.app.ability.UIAbility; import window from…

NAND SCA接口对性能影响有多大?

在多LUN场景下&#xff0c;SCA接口尤其有助于提高随机读取性能。通过合理安排读取命令和等待时间&#xff08;如tR&#xff09;&#xff0c;SCA接口可以在一个LUN完成读取后立即开始另一个LUN的读取操作&#xff0c;而无需等待整个DQ总线空闲&#xff0c;从而减少了延迟和提高了…

基于SpringBoot的洗衣店管理系统

基于SpringBoot的洗衣店管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 可视化展示 用户界面 管理员界面 摘要 洗衣店管理系统基于Spring Boot框…