【Android】OkHttp发起GET请求 POST请求

在这里插入图片描述
三三要成为安卓糕手

一:OkHttp介绍

OkHttp 是一个开源的、强大且高效的 HTTP 客户端库,主要用于在 Java后端和Android 项目中进行网络请求。

//在gradle中添加依赖
com.squareup.okhttp3:okhttp:4.12.0

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二:GET请求

  /*** 使用OkHttp发起get请求*/private void  sendGetRequest(){String id = etUserId.getText().toString();String urlAddress = "http://titok.fzqq.fun/addons/cms/api.user/userInfo?user_id=" + id + "&type=archives";//创建OkHttpClient实例对象,用于发起请求OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(10,TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).build();//设置请求属性,比如地址,方法属性Request request = new Request.Builder().url(urlAddress).get().build();//发起单个请求Call call = okHttpClient.newCall(request);//接收响应Callback callback = new Callback() {@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {runOnUiThread(new Runnable() {@Overridepublic void run() {if(response.isSuccessful()){//响应成功try {String result = response.body().string();Log.i(TAG, "run: result" + result);//把json字符串转化为对象UserInfoQuery userInfoQuery = new Gson().fromJson(result, UserInfoQuery.class);String msg = "当前的用户名是:" + userInfoQuery.getData().getUser().getNickname();Toast.makeText(OkHttpActivity.this,msg,Toast.LENGTH_SHORT).show();} catch (IOException e) {throw new RuntimeException(e);}}else{Toast.makeText(OkHttpActivity.this,"网络请求失败"+response.code(),Toast.LENGTH_SHORT).show();}}});}@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(OkHttpActivity.this,"网络请求失败",Toast.LENGTH_SHORT).show();}});}};call.enqueue(callback);}

1:大致步骤

  • 使用builder去创建OkHttpClient实例对象,设置一些连接的属性:常见连接超时,数据读取超时
  • 使用builder设置请求属性:常见url,get方法
  • 调用newCall发起单次请求,传入request参数,使用enqueue异步线程
  • new Callback();重写接口中的onResponse方法和onFailure方法
  • 方法中的内部逻辑,对于ui的处理要在主线程中进行,调用runOnUiThread(new Runnable接口,重写run方法)

2:一些细节

  • 我们一般不会直接new一个request,而是选择一个底下的一个builder的东西

(1)内部回调接口

在 OkHttp 中,call.enqueue(callback) 并非 “把响应丢进 call 里”,而是通过回调机制实现异步请求的结果处理

  • Call 对象是对一个 HTTP 请求的封装,调用 enqueue(callback) 时,其实是向Call 注册了一个回调接口
  • OkHttp 会在后台线程执行网络请求,当请求完成(成功或失败)后,会自动调用onResponseonFailure方法,并将响应结果(Response 对象)作为参数传入。

(2)次线程转主线程

接口中重写的onResponse方法和onFailure方法内部的代码,涉及到UI应该要回到主线程中去进行

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

回到主线程去完成ui(弹窗操作)

(3)enqueue方法的说明

“enqueue” 把…… 加入队列

在 Java 中,enqueue 方法的签名是 void enqueue(Callback responseCallback) ,它接收一个 Callback 类型的参数,Callback 是 OkHttp 中定义的一个接口,包含两个抽象方法:

  • onResponse(Call call, Response response):当 HTTP 请求成功完成,且服务器返回了响应时,该方法会被调用,response 参数包含了从服务器获取到的响应信息,比如响应码、响应头、响应体等;call 参数则是当前正在处理结果的这个请求对应的 Call 对象。
  • onFailure(Call call, IOException e):当请求执行过程中发生错误,比如网络连接失败、超时等情况,这个方法会被调用。

(4)response.body().string()

主要作用是将 ResponseBody 的内容以字符串形式读取出来。

它会根据响应体的编码(Content-Type ),把响应体中的字节数据解码为字符串。并非用toString方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(5)toString () 方法

默认的 toString() 方法返回的是 ResponseBody 类的名称以及对象的哈希码等信息,而不是响应体中的实际内容

例如:可能返回类似 okhttp3.ResponseBody@12345678 这样的字符串,其中 okhttp3.ResponseBody 是类名,@12345678 是对象的哈希码表示 。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(6)TimeUnit 时间单位

在设置超时方面,可以用安卓内部定义好的时间的单位常量

3:效果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三:POST请求

/*** POST请求*/private void sendPostRequest(){String loginUrl = "http://titok.fzqq.fun/addons/cms/api.login/login";OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(10,TimeUnit.SECONDS).readTimeout(30,TimeUnit.SECONDS).build();String account = etUserName.getText().toString();String password = etPassword.getText().toString();//用Gson去拼接一个请求体String jsonBody = new Gson().toJson(new ReqLogin(account, password));//请求体的数据格式是Json,编码格式是utf-8MediaType mediaType = MediaType.get("application/json;charset=utf-8");RequestBody requestBody = RequestBody.create(jsonBody, mediaType);//构建请求Request request = new Request.Builder().url(loginUrl).post(requestBody).build();//发起请求Call call = okHttpClient.newCall(request);Callback callback = new Callback() {@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {runOnUiThread(new Runnable() {@Overridepublic void run() {if(response.isSuccessful()){try {String json = response.body().string();Log.i(TAG, "run: " + json);//把json数据转化为对象,获取其中的属性ResLogin resLogin = new Gson().fromJson(json, ResLogin.class);String msg = resLogin.getMsg();int userId = resLogin.getData().getUser_id();Toast.makeText(OkHttpActivity.this,msg + ".欢迎用户" + userId, Toast.LENGTH_SHORT).show();} catch (IOException e) {throw new RuntimeException(e);}}else {Toast.makeText(OkHttpActivity.this,"登录失败",Toast.LENGTH_SHORT).show();}}});}@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(OkHttpActivity.this,"POST登录请求失败",Toast.LENGTH_SHORT).show();}});}};call.enqueue(callback);}

1:流程

  • 设置连接属性
  • ui上获取数据,Gson.toJson拼接字符串请求体
  • 设置请求体数据格式
  • 构建请求
  • 发起请求
  • 处理响应

2:一些细节

(1) 设计body参数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(2)MediaType.get(“application/json;charset=utf-8”);

媒体类型

用于定义请求体或响应体的数据格式和编码方式,是处理 JSON 数据时的常见用法。

3:登录效果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

四:快捷生成JSON对应的对象

商业场景中是会创建一个实体类对象的;而非进行字符串拼接

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

//先用日志获取json体
String json = response.body().string();
Log.i(TAG, "run: " + json);//在依据日志生成java对象,通过对象去获取其中的属性
new Gson().fromJson(json, ResLogin.class)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

package com.xlong.networkbyjavaproject.bean;public class ResLogin {/*** code : 1* msg : 登录成功* time : 1756263107* data : {"token":"6c45ff48-c7ef-4666-918e-26dabb214746","user_id":4}*/private int code;private String msg;private String time;private DataBean data;public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}public DataBean getData() {return data;}public void setData(DataBean data) {this.data = data;}public static class DataBean {/*** token : 6c45ff48-c7ef-4666-918e-26dabb214746* user_id : 4*/private String token;private int user_id;public String getToken() {return token;}public void setToken(String token) {this.token = token;}public int getUser_id() {return user_id;}public void setUser_id(int user_id) {this.user_id = user_id;}}
}

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

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

相关文章

[Mysql数据库] 知识点总结8

1. 请详细描述在复制拓扑中参与复制的线程类型以及各自所承担的功能。答:当从属服务器连接到主服务器时,在主服务器上会创建 Binlog 转储线程,在从属服务器上会默 认创建 I/O 线程和 SQL 线程。- Binlog 转储线程用于从二进制日志读取事件并将…

250829-Gitlab数据备份与恢复

下面给你一份可落地的迁移方案,保证 GitLab 的数据和配置完整迁移到服务器 B。你当前用的是 GitLab Omnibus(docker 版),数据都在你映射的 3 个目录里(/etc/gitlab, /var/log/gitlab, /var/opt/gitlab)&…

吴恩达机器学习作业十一:异常检测

数据集在作业一异常检测异常检测就是发现与大部分对象不同的对象,其实就是发现离群点。异常检测有时也称偏差检测。异常对象是相对罕见的。用数据集建立概率模型p ( x ),如果新的测试数据在这个模型上小于某个阈值,则说它极大可能为异常点算法…

2000w 的数据量,mysql要进行几次IO操作,为什么

在 MySQL 中,2000 万数据量的表在进行查询时所需的 ​​IO 操作次数​​主要取决于 ​​索引结构(B树层级)​​、​​查询类型​​和 ​​数据分布特征​​。以下是具体分析:一、B树层级与 IO 次数的关系InnoDB 引擎通过 B树索引管…

【代码随想录day 22】 力扣 39. 组合总和

视频讲解:https://www.bilibili.com/video/BV1KT4y1M7HJ/?vd_sourcea935eaede74a204ec74fd041b917810c 文档讲解:https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html#%E6%80%9D%E8%B7%AF 力扣题目:https://leetcod…

DrissionPage 实战:动态 IP 代理与百度翻译 API 数据抓取

本文将详细介绍如何使用 DrissionPage 实现动态 IP 代理访问,并结合百度翻译 API 进行数据抓取与处理。一、技术选型与架构设计1.1 为什么选择 DrissionPage?DrissionPage 作为新一代网络自动化工具,相比传统 Selenium Requests 方案具有显著…

策略模式:灵活应对算法动态切换

引言 在软件开发中,我们常常会遇到需要在运行时动态选择和切换算法或行为的场景。例如,电商系统中的多种支付方式、游戏中的不同难度设置,或是计算器中的各种运算符。传统的方法可能会使用复杂的条件判断语句(如if-else或switch-c…

【C++ 】string类:深拷贝与浅拷贝解析

【C 】string类操作全解析-CSDN博客 1.stirng类的模拟实现 1.1 经典的string类问题 上面已经对string类进行了简单的介绍,大家只要能够正常使用即可。在面试中,面试官总喜欢要求自己来模拟实现string类,最主要是实现string类的构造、拷贝…

Decoder 解码器

Decoder 解码器&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>#include <libavformat/avformat.h> #include <libavcodec/avcodec.h> #include <libswscale/swscale.h>#define WORD uint16_t #define DWORD ui…

globals() 小技巧

scheduler_class globals()[scheduler_class_name] Python 中一种 动态获取类对象 的常用技巧&#xff0c;属于 反射&#xff08;reflection&#xff09; 编程的范畴globals()Python 内置函数&#xff0c;返回一个 字典&#xff08;dict&#xff09;&#xff0c;包含当前模块&…

Android Studio 9.png制作

一、新建 二、把要做的图png导入进去 png图片建议 根据内容预留1像素可拉伸区域 eg:纯色或可渐变底色 三、右边创建.9.png 四、双击打开 1、绘制黑边 参考视频 2、缩放到800% ,移至右下 3、在下面和右边绘制整根黑线 4、根据png 位置左侧和上侧黑线 4.1 分析 红色方框为…

【百度】C++开发(25届提前批 一面)面经

文章目录1. 代码实现&#xff1a;说说LRU&#xff0c;并代码实现LRU为什么使用哈希表&#xff1f;&#xff08;有两个原因&#xff09;1. 仅用双向链表的缺陷2. 引入哈希表的作用1. 快速查找&#xff1a;2. 快速插入与删除&#xff1a;双向链表 哈希表的协作过程举例说明代码实…

Word文档怎么打印?Word打印技巧?【图文详解】单面/双面/指定页面/逆序等Word打印选项

一、问题背景 在日常办公、学习场景中&#xff0c;Word文档作为常用的文字处理载体&#xff0c;经常需要将电子内容转化为纸质版本&#xff0c;比如提交报告、打印学习资料、整理文档存档等。 但不少用户在尝试打印Word文档时&#xff0c;常会遇到各种阻碍&#xff1a;有的不清…

漫谈《数字图像处理》之基函数与基图像

在数字图像处理领域&#xff0c;基函数与基图像是贯穿理论分析与实际应用的核心概念 —— 它们如同 “乐高积木”&#xff0c;将复杂的图像信号拆解为可解释、可操作的基本单元&#xff0c;支撑起压缩、去噪、特征提取等一系列关键任务。从传统的傅里叶变换到前沿的因子场理论&…

打开多个Excel文件后快速关闭所有的文档,并且退出Excel应用

打开多个Excel文件后如果要快速关闭所有的文档&#xff0c;并且退出Excel应用&#xff0c;可以按住Shift键右上角的号&#xff08;关闭按钮&#xff09;。Word和PowerPoint也是一样的操作。如果有文档修改后没有保存&#xff0c;会提示是否保存。作为补充&#xff0c;先来看看两…

基于 PyTorch 构建 Dataset 与 DataLoader:从 TXT 文件读取到新增类别全流程指南

基于 PyTorch 构建 Dataset 与 DataLoader&#xff1a;从 TXT 文件读取到新增类别全流程指南在深度学习计算机视觉任务中&#xff0c;数据加载与预处理是模型训练的基础环节&#xff0c;直接影响模型的训练效率与最终性能。PyTorch 作为主流深度学习框架&#xff0c;提供了Data…

hive on tez如果是2个大表union会写几次临时文件到hdfs目录,数据量如何计算

如果是2个大表union会写几次临时文件到hdfs目录&#xff0c;数据量如何计算 在Hive on Tez中&#xff0c;两个大表执行UNION操作时&#xff0c;临时文件的写入次数和数据量&#xff0c;取决于UNION的类型&#xff08;UNION ALL还是UNION去重&#xff09;以及执行计划的Stage划分…

Web+js转uni-app+ts

一、入手uni-app 官方文档&#xff1a;uni-app官网 1.创建uni-app项目 1.1通过HBuilderX进行创建 官方地址&#xff1a;HBuilderX-高效极客技巧 1.2通过命令行创建 // js 版本的 npx degit dcloudio/uni-preset-vue#vite 项目名 npx degit dcloudio/uni-preset-vue#vite-…

IO_hw_8.29

1.使用fgets和fputs完成两个文件的拷贝&#xff0c;要求文件名使用外部传承2.注册登录代码3.思维导图4.牛客网刷题记录

数据结构(04)—— 栈和队列

Hi&#xff01;探索者们&#x1f609;&#xff0c;欢迎踏入 408 数据结构的奇妙秘境&#x1f33f;&#xff01;​ 我是 ankleless&#x1f4da;&#xff0c;和你并肩的寻宝人&#xff5e; 这是我的探险手札&#x1f5fa;️&#xff0c;里面记着链表森林的岔路陷阱&#x1f578;…