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

Android OkHttp

目录

1.build.gradle

2.基本使用

3.POST请求

4.Builder构建者

1.build.gradle
implementation("com.squareup.okhttp3:okhttp:4.12.0")
2.基本使用

GET同步请求

public void getSync(View view) {new Thread(){@Overridepublic void run() {Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();//准备好请求的call对象Call call = okHttpClient.newCall(request);try {Response response = call.execute();Log.i("TAG", "getSync: "+response.body().string());} catch (IOException e) {e.printStackTrace();}}}.start();}

GET异步请求

public void getAsync(View view) {Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();//准备好请求的call对象Call call = okHttpClient.newCall(request);//异步请求call.enqueue(new Callback() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {Log.i("TAG", "getAsync onFailure",e);}@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {if (response.isSuccessful()){Log.i("TAG", "getAsync onResponse: "+response.body().string());}}});}

POST同步请求

public void postSync(View view) {new Thread(){@Overridepublic void run() {FormBody formBody = new FormBody.Builder().add("a","404").build();Request request = new Request.Builder().url("https://httpbin.org/post").post(formBody).build();   //Request.Builder对象默认get请求//准备好请求的call对象Call call = okHttpClient.newCall(request);try {Response response = call.execute();Log.i("TAG", "postSync: "+response.body().string());} catch (IOException e) {e.printStackTrace();}}}.start();}

POST异步请求

public void postAsync(View view) {FormBody formBody = new FormBody.Builder().add("a","404").build();Request request = new Request.Builder().url("https://httpbin.org/post").post(formBody).build();//准备好请求的call对象Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {Log.i("TAG", "postAsync onFailure",e);}@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {Log.i("TAG", "postAsync: "+response.body().string());}});
}
3.POST请求
协议规定 POST 提交的数据必须放在请求体中,但协议并没有规定数据必须使用什么编码方式 。常用的数据编码方式有: https://www.runoob.com/http/http-content-type.html
Content-Type:application/x-www-form-urlencoded
数据被编码为名称/值对,默认类型;
Content-Type:multipart/form-data
数据被编码为一条消息,一般用于文件上传;
Content-Type:application/octet-stream
提交二进制数据,如果用于文件上传,只能上传一个文件;
Content-Type:application/json
提交json数据
提交多个文件
@Test
public void uploadFileTest() throws IOException {OkHttpClient okHttpClient = new OkHttpClient();File file1 = new File("H:\\Users\\ASUS\\Desktop\\f1.txt");File file2 = new File("H:\\Users\\ASUS\\Desktop\\f2.txt");MultipartBody multipartBody = new MultipartBody.Builder().addFormDataPart("f1", file1.getName(), RequestBody.create(file1, MediaType.parse("text/plain"))).addFormDataPart("f2", file2.getName(), RequestBody.create(file2, MediaType.parse("text/plain"))).build();Request request = new Request.Builder().url("https://httpbin.org/post").post(multipartBody).build();Call call = okHttpClient.newCall(request);Response response = call.execute();System.out.println(response.body().string());}

提交json数据

@Test
public void jsonTest() throws IOException {OkHttpClient okHttpClient = new OkHttpClient();RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), "{\"a\":1,\"b\":2}");Request request = new Request.Builder().url("https://httpbin.org/post").post(requestBody).build();Call call = okHttpClient.newCall(request);Response response = call.execute();System.out.println(response.body().string());}
4.Builder构建者
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
拦截器
OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor( new XXX ).build();
OkHttpClient okHttpClient = new OkHttpClient.Builder().addNetworkInterceptor( new XXX ).build();
@Testpublic void interceptorTest() {OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {@NonNull@Overridepublic Response intercept(@NonNull Chain chain) throws IOException {//请求前置处理Request request = chain.request().newBuilder().addHeader("os", "android").addHeader("version", "1.0").build();Response response = chain.proceed(request);//请求后置处理return response;}}).addNetworkInterceptor(new Interceptor() {    //一定先执行addInterceptor后执行addNetworkInterceptor  添加顺序不影响执行@NonNull@Overridepublic Response intercept(@NonNull Chain chain) throws IOException {System.out.println("version" + chain.request().header("version"));return chain.proceed(chain.request());}}).build();Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();//准备好请求的call对象Call call = okHttpClient.newCall(request);try {Response response = call.execute();System.out.println(response.body().string());} catch (IOException e) {e.printStackTrace();}}
缓存与 Cookie
OkHttp按照Http协议规则实现了缓存的处理,缓存是比如:当我们发起第一次请求之后,如果后续还需要进行同样的请求,此时如果符合缓存规则,则可以减少与服务器的网络通信,直接从本地文件缓存中读取响应返回给请求者。但是默认情况下,OkHttp的缓存是关闭状态,需要我们开启。
OkHttpClient okHttpClient = new OkHttpClient.Builder().cache(new Cache(new File("/path/cache"),100))
Cookie是某些网站为了辨别用户身份,进行会话跟踪(比如确定登陆状态)而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息
Map<String, List<Cookie>> cookie = new HashMap<>();@Testpublic void cookieTest() {OkHttpClient okHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() {@Overridepublic void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List<Cookie> list) {cookie.put(httpUrl.host(), list);            //保存cookie}@NonNull@Overridepublic List<Cookie> loadForRequest(@NonNull HttpUrl httpUrl) {List<Cookie> cookies = cookie.get(httpUrl.host());  return cookies == null ? new ArrayList<>() : cookies;    //加载并返回cookie}}).build();FormBody formBody = new FormBody.Builder().add("username", "xx").add("password", "xxxxxx").build();Request request = new Request.Builder().url("https://www.xxx.com/user/login").post(formBody).build();Call call = okHttpClient.newCall(request);try {Response response = call.execute();System.out.println(response.body().string());} catch (IOException e) {e.printStackTrace();}}

相关文章:

Android OkHttp

目录 1.build.gradle 2.基本使用 3.POST请求 4.Builder构建者 1.build.gradle implementation("com.squareup.okhttp3:okhttp:4.12.0") 2.基本使用 GET同步请求 public void getSync(View view) {new Thread(){Overridepublic void run() {Request request …...

Java常用API_正则表达式_字符串的替换和截取方法——小练习

我将通过一个练习题来展示这两个方法 练习题&#xff1a; 有一段字符串&#xff1a;小张qwertyuiop123小李asdfghjkl456小王 要求1&#xff1a;把字符串中三个姓名之间的字母替换成vs 要求2&#xff1a;把字符串中的三个姓名切割出来 编写代码&#xff1a; public class Tes…...

从头开发一个RISC-V的操作系统(四)嵌入式开发介绍

文章目录 前提嵌入式开发交叉编译GDB调试&#xff0c;QEMU&#xff0c;MAKEFILE练习 目标&#xff1a;通过这一个系列课程的学习&#xff0c;开发出一个简易的在RISC-V指令集架构上运行的操作系统。 前提 这个系列的大部分文章和知识来自于&#xff1a;[完结] 循序渐进&#x…...

Web漏洞-文件上传常见验证

后缀名&#xff1a;类型&#xff0c;文件头等 后缀名&#xff1a;黑白名单 文件类型&#xff1a;MIME信息 文件头&#xff1a;内容头信息 常见黑名单&#xff08;明确不允许上传的格式后缀&#xff09;&#xff1a;asp、php、jsp、aspx、cgi、war &#xff08;如果没有完整…...

如何在 Node.js 中使用 bcrypt 对密码进行哈希处理

在网页开发领域中&#xff0c;安全性至关重要&#xff0c;特别是涉及到用户凭据如密码时。在网页开发中至关重要的一个安全程序是密码哈希处理。 密码哈希处理确保明文密码在数据库受到攻击时也难以被攻击者找到。但并非所有的哈希方法都是一样的&#xff0c;这就是 bcrypt 突…...

嵌入式学习49-单片机2

指令周期 1M 机器周期 12M &#xff08;晶体震荡器产生&#xff09; 中断两种方式 …...

汽车EDI:如何与奔驰建立EDI连接?

梅赛德斯-奔驰是世界闻名的豪华汽车品牌&#xff0c;无论是技术实力还是历史底蕴都在全球汽车主机厂中居于领先位置。奔驰拥有多种车型&#xff0c;多元化的产品布局不仅满足了不同用户画像的需求&#xff0c;也对其供应链体系有着极大的考验。 本文将为大家介绍梅赛德斯-奔驰乘…...

性能分析--内存知识

内存相关知识 计算机中与CPU进行数据交换的桥梁。内存的速度&#xff0c;比CPU的速度要慢很多。比磁盘速度要快很多。内存中存放数据&#xff0c;一旦断电就会消失。linux系统的 /proc路径下的文件&#xff0c;都是内存文件。内存大小&#xff0c;一般 是GB为单位。 现在都操作…...

目标检测标签分配策略,难样本挖掘策略

在目标检测任务中&#xff0c;样本的划分对于模型的性能具有至关重要的影响。其中&#xff0c;正样本指的是包含目标物体的图像或区域&#xff0c;而负样本则是不包含目标物体的图像或区域。然而&#xff0c;在负样本中&#xff0c;有一部分样本由于其与正样本在特征上的相似性…...

Java | Leetcode Java题解之第16题最接近的三数之和

题目&#xff1a; 题解&#xff1a; class Solution {public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int n nums.length;int best 10000000;// 枚举 afor (int i 0; i < n; i) {// 保证和上一次枚举的元素不相等if (i > 0 && nums…...

FIN和RST的区别,几种TCP连接出现RST的情况

一、RST跟FIN的区别&#xff1a; 正常关闭连接的时候发的包是FIN&#xff0c;但是如果是异常关闭连接&#xff0c;则发送RST包 两者的区别在于&#xff1a; 1.RST不必等缓冲区的包都发出去&#xff0c;直接就丢弃缓存区的包发送RST包。而FIN需要先处理完缓存区的包才能发送F…...

2024/4/1—力扣—删除字符使频率相同

代码实现&#xff1a; 思路&#xff1a; 步骤一&#xff1a;统计各字母出现频率 步骤二&#xff1a;频率从高到低排序&#xff0c;形成频率数组 步骤三&#xff1a;频率数组只有如下组合符合要求&#xff1a; 1, 0...0n 1, n...n (, 0)n...n, 1(, 0) bool equalFrequency(char…...

Spring源码解析-容器基本实现

spring源码解析 整体架构 defaultListableBeanFactory xmlBeanDefinitionReader 创建XmlBeanFactory 对资源文件进行加载–Resource 利用LoadBeandefinitions(resource)方法加载配置中的bean loadBeandefinitions加载步骤 doLoadBeanDefinition xml配置模式 validationMode 获…...

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之四 简单视频倒放效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之四 简单视频倒放效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之四 简单视频倒放效果 一、简单介绍 二、简单视频倒放效果实现原理 三、简单视频倒放效果案例实现…...

蓝牙学习十(扫描)

一、简介 从之前的文章中我们知道&#xff0c;蓝牙GAP层定义了四种角色&#xff0c;广播者&#xff08;Broadcaster&#xff09;、观察者&#xff08;Observer&#xff09;、外围设备&#xff08;Peripheral&#xff09;、中央设备&#xff08;Central&#xff09;。 之前的学习…...

(26)4.7 字符函数和字符串函数

#include<stdio.h> #include<string.h> #include<assert.h> //int my_strcmp(const char* str1, const char* str2) //{ // assert(str1 && str2);//指针有效性&#xff0c;不能为空指针 // while (*str1 *str2) // { // if (*str1…...

交换机与队列的简介

1.流程 首先先介绍一个简单的一个消息推送到接收的流程&#xff0c;提供一个简单的图 黄色的圈圈就是我们的消息推送服务&#xff0c;将消息推送到 中间方框里面也就是 rabbitMq的服务器&#xff0c;然后经过服务器里面的交换机、队列等各种关系&#xff08;后面会详细讲&…...

1.docker

Docker 是一种容器化平台&#xff0c;可以在不同的操作系统中轻松运行和管理应用程序。它使用容器技术来打包应用程序及其所有依赖关系&#xff0c;使其可以在任何环境中运行。 Docker 的基本概念包括以下几个部分&#xff1a; 镜像&#xff08;Image&#xff09;&#xff1a;…...

ThinkPHP审计(2) Thinkphp反序列化链5.1.X原理分析从0编写POC

ThinkPHP审计(2) Thinkphp反序列化链子5.1.X原理分析&从0编写POC 文章目录 ThinkPHP审计(2) Thinkphp反序列化链子5.1.X原理分析&从0编写POC动态调试环境配置Thinkphp反序列化链5.1.X原理分析一.实现任意文件删除二.实现任意命令执行真正的难点 Thinkphp反序列化链5.1.…...

KingbsaeES数据库分区表的详细用法

数据库版本&#xff1a;KingbaseES V008R006C008B0014 简介 分区表是一种将大型数据库表拆分为更小、更可管理的部分的技术。它通过将表数据分散存储到多个物理存储单元中&#xff0c;可以提高查询和数据维护的性能&#xff0c;并优化对大型数据集的处理。本篇文章以kingbase为…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...