OkHttp3 法力大无边

简介

在项目开发中,与第三方系统进行HTTP接口对接是常有的事,虽然Spring提供了 RestTemplate 可以使用,但在实际上手之后明显感觉 性能 和 上手难易度 差强人意。所以在这里将 OkHttp3 这个网络请求库 推荐给大家。

OkHttp 是 Square 公司基于 Java 和 Android 程序,封装的一个高性能的、轻量级的 HTTP 网络请求客户端,并且对外开源,被广泛应用于Android、Java和Kotlin语言的应用程序中。相比传统的HttpURLConnection,OkHttp3 更加高效、简单易用、功能丰富。

特点:

  • 能够高效的执行 http,数据加载速度更快,更省流量
  • 支持HTTP/2(有效使用套接字)
  • 连接池(在没有HTTP/2的情况下减少请求延迟)
  • 支持 GZIP 压缩,提升速度,节省流量
  • 缓存响应数据,避免了重复的网络请求
  • 从常见的连接问题中无声恢复
  • 支持现代TLS功能(TLS 1.3,ALPN,证书钉子)
  • 使用简单,支持同步阻塞调用和带回调的异步调用

安装

        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.12.0</version>
        </dependency>

使用

1、Get请求 同步

  • 阻塞性质:
    同步请求会阻塞调用线程,直到请求完成(成功或失败)。这意味着在请求完成之前,调用线程无法执行其他任务。

  • 简单性:
    同步请求的代码实现通常更直观和简单,因为它直接返回响应或抛出异常。

  • 资源消耗:
    由于阻塞性质,同步请求可能会消耗更多的系统资源,特别是在高并发场景下,因为它们会占用更多的线程。

    public static void getSync() {
        String url = "https://httpbin.org/get?name=wtt&age=23";

		// 1、 初始化 客户端
        OkHttpClient client = new OkHttpClient();
        
		// 2、 构建 请求报文
        Request request = new Request.Builder()
                .url(url)
                .get()  //默认为GET请求,可以不写
                .build();

		// 3、 将 请求报文 交给 客户端
        Call call = client.newCall(request);

        // 4、 发送请求
        try (Response response = call.execute()) {
            // 打印 响应状态码
            System.out.println(response.code());
            // 打印 响应头
            System.out.println(response.headers());
            // 打印 响应体
            System.out.println(response.body().string());


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2、Get请求 异步

  • 非阻塞性质:
    异步请求不会阻塞调用线程。当请求被发起后,调用线程可以继续执行其他任务,而不需要等待请求完成。当请求完成时,结果会通过回调方法(Callback)或其他方式通知给调用者。

  • 高并发
    由于异步请求的非阻塞性质,它们更适合用于高并发场景,因为它们不会消耗大量的线程资源。

  • 复杂性:
    异步请求的代码实现通常比同步请求更复杂,因为需要处理回调和可能的并发问题。

    public static void getAsync() {
        String url = "https://httpbin.org/get?name=wtt&age=23";
        
		// 1、 初始化 客户端
        OkHttpClient client = new OkHttpClient();
        
		// 2、 构建 请求报文
        Request request = new Request.Builder()
                .url(url)
                .header("name", "whero")
                .get()  //默认为GET请求,可以不写
                .build();

		// 3、 将 请求报文 交给 客户端
        Call call = client.newCall(request);

        // 4、 发送请求
        call.enqueue(new Callback() {
			// 失败回调
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                System.out.println("请求失败");
            }

			// 成功回调
            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                System.out.println("请求成功的 回调");
                // 打印 响应状态码
                System.out.println(response.code());
                // 打印 响应头
                System.out.println(response.headers());
                // 打印 响应体
                System.out.println(response.body().string());
            }
        });
    }

3、Post Json 异步

    public static void postJson() {
        String url = "https://httpbin.org/post";
        
        // 1、 初始化 客户端
        OkHttpClient client = new OkHttpClient();
        
        // 2、构建 请求体
        MediaType mediaType = MediaType.parse("application/json; charset=utf-8");// 标明 请求体 类型
        RequestBody body = RequestBody.create("{\"name\":\"wtt\",\"age\":23}", mediaType);
		
		// 3、构建 请求报文
        Request request = new Request.Builder()
                .url(url)
                .header("name", "whero")
                .post(body)  //默认为POST请求,可以不写
                .build();

		// 4、 将 请求报文 交给 客户端
        Call call = client.newCall(request);

		// 5、 发送请求
        call.enqueue(new Callback() {
        
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                System.out.println("请求失败");
            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                System.out.println("请求成功的 回调");
                // 打印 响应状态码
                System.out.println(response.code());
                // 打印 响应头
                System.out.println(response.headers());
                // 打印 响应体
                System.out.println(response.body().string());
            }
            
        });
    }

4、Post Form-Data 异步

    public static void postForm() {
        String url = "https://httpbin.org/post";
        
        // 1、 初始化 客户端
        OkHttpClient client = new OkHttpClient();
        
        // 2、构建 请求体
        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8");
        RequestBody body = RequestBody.create("name=wtt&age=23", mediaType);

		// 3、构建 请求报文
        Request request = new Request.Builder()
                .url(url)
                .header("name", "whero")
                .post(body)  //默认为POST请求,可以不写
                .build();

		// 4、 将 请求报文 交给 客户端   
        Call call = client.newCall(request);

		// 5、 发送请求
        call.enqueue(new Callback() {
        
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                System.out.println("请求失败");
            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                System.out.println("请求成功的 回调");
                // 打印 响应状态码
                System.out.println(response.code());
                // 打印 响应头
                System.out.println(response.headers());
                // 打印 响应体
                System.out.println(response.body().string());
            }
            
        });
    }

5、Post File Upload 异步

    public static void postFile() {
        String url = "http://localhost:8080/aaa";
        
		// 1、 初始化 客户端  
        OkHttpClient client = new OkHttpClient();

        // 2、构建 请求体:文件
        MediaType mediaType = MediaType.parse("application/octet-stream");
        File file = new File("/Users/wtt/Desktop/aaa.png"); 
        RequestBody fileBody = RequestBody.create(file, mediaType);
        MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", file.getName(), fileBody);

        // 构建 请求体: 键值对
        MultipartBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addPart(filePart)
                .addFormDataPart("name", "wtt")
                .addFormDataPart("age", "23")
                .build();

		// 3、构建 请求报文   
        Request request = new Request.Builder()
                .url(url)
                .header("Content-Type", "multipart/form-data") // 通常不需要手动设置这个header,因为OkHttp会自动处理
                .post(requestBody)
                .build();

		// 4、 将 请求报文 交给 客户端 + 发送请求  
        client.newCall(request).enqueue(new Callback() {
        
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                System.out.println("请求失败: " + e.getMessage());
            }

            @Override
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                System.out.println("请求成功的 回调");
                // 打印 响应状态码
                System.out.println(response.code());
                // 打印 响应头
                System.out.println(response.headers());
                // 打印 响应体
                System.out.println(response.body().string());
            }
            
        });
    }

6、Post File Download 同步

文件下载,通常是get方式请求,只需要在响应端使用字节流接受数据即可

package com.wtt;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class Main {
    public static void main(String[] args) {
        //目标存储文件
        String targetFile = "./2.png";
        
        //需要下载的原始文件
        String url = "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png";

        OkHttpClient client = new OkHttpClient();
        
        // 配置GET请求
        Request request = new Request.Builder()
                .url(url)
                .build();

        // 发起同步请求
        try (Response response = client.newCall(request).execute()) {
            // 获取文件字节流
            byte[] stream = response.body().bytes();
            // 写入目标文件
            Path path = Paths.get(targetFile);
            Files.write(path, stream, StandardOpenOption.CREATE);

        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println(targetFile + "下载完成!");
    }
}

7、自定义添加 请求头

......

OkHttpClient client = new OkHttpClient();

// 配置 header 头部请求参数
Headers headers = new Headers.Builder()
        .add("token", "1111")
        .build();
        
Request request = new Request.Builder()
        .url(url)
        .headers(headers) // 自定义添加 请求头
        .post(body)
        .build();
        
......

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java数据结构集合复习之包装类和泛型

前言: 这是我最一年学习java的一部分的回顾总结 1.包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了一个包装类型。 1.1基本数据类型和对应的包装类 ----—基本数据类型包装类…

14. Revit API: Selection(选择器)

前言 这篇写选择器&#xff0c;经过前面好些篇的讲解&#xff0c;总算把前置内容都写完了。 我们来回忆下都在哪里提到过… 算了&#xff0c;直接进入正文。 一、Selection 命名空间 选择器位于Autodesk.Revit.UI.Selection命名空间下&#xff0c;关系到交互嘛&#xff0c;所…

Dns被莫名篡改的逆向分析定位(笔记)

引言&#xff1a;最近发现用户的多台机器上出现了Dns被莫名修改的问题&#xff0c;从系统事件上看并未能正常确定到是那个具体软件所为&#xff0c;现在的需求就是确定和定位哪个软件具体所为。 解决思路&#xff1a; 首先到IPv4设置页面对Dns进行设置&#xff1a;通过ProcExp…

【Axure高保真原型】中继器表格——移入显示详情卡片案例

今天和大家分享中继器表格——移入显示详情卡片的原型模板&#xff0c;鼠标移入员工号或姓名会弹出员工卡片&#xff0c;可以查看更详细的信息。这个表格是用中继器制作的&#xff0c;所以使用也很方便&#xff0c;只需要维护中继器表格里的信息&#xff0c;即可自动生成交互效…

实操Nginx+Tomcat多实例部署,实现负载均衡和动静分离

192.168.10.10 192.168.10.20 192.168.10.30 location ~ \.jsp$ {proxy_pass http://192.168.10.50:8080;} location ~ \.(jsp|html)$ {root /usr/share/nginx/html;}192.168.10.40和192.168.10.50用脚本完成搭建此处安装附上脚本&#xff1a; #!/bin/bash# 定义变量 JDK_PACKA…

生态系统NPP及碳源、碳汇模拟技术教程

原文链接&#xff1a;生态系统NPP及碳源、碳汇模拟技术教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608293&idx3&sn2604c5c4e061b4f15bb8aa81cf6dadd1&chksmfa826602cdf5ef145c4d170bed2e803cd71266626d6a6818c167e8af0da93557c1288da21a71&a…

nginx 搭理禅道

1.安装nginx。 2.安装禅道。 3.nginx 配置文件 location /zentao/ { proxy_pass http://192.168.100.66/zentao/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-F…

边界无限陈佩文:红蓝对抗安全演练常态化的各方分析

虽然常态化演练尚未正式开始&#xff0c;但我们仍然希望对各方的表现进行一些分析和预测&#xff0c;以辅助我们对市场的判断和决策。同时&#xff0c;也希望通过这些初步的见解&#xff0c;抛砖引玉&#xff0c;引发更多有价值的讨论和观点。 “船停在码头是最安全的&#xf…

【数据库】E-R图、E-R模型到关系模式的转换、关系代数表达式、范式

一、E-R图 1、基本概念 2、实体集之间的联系 3、E-R图要点 &#xff08;1&#xff09;实体&#xff08;型&#xff09;的表示 &#xff08;2&#xff09;E-R图属性的表示 &#xff08;3&#xff09;联系的表示 4、E-R模型的例题 二、E-R模型到关系模式的转换 1、实体型的转换…

pytorch-时间序列

目录 1. 时间序列2. word embedding2.1 one hot2.2 word2vec2.3 GloVe 1. 时间序列 具有时间相关性的序列叫做时间序列&#xff0c;比如&#xff1a;语音、文本句子 2. word embedding 2.1 one hot 针对句子来说&#xff0c;可以用[seq_len, vector_len] 有多少个单词vecto…

因为文件共享不安全,所以你不能连接到文件共享。此共享需要过时的SMB1协议,而此协议是不安全的 解决方法

目录 1. 问题所示2. 解决方法3. 解决方法1. 问题所示 输入共享文件地址的时候,出现如下信息: 因为文件共享不安全,所以你不能连接到文件共享。此共享需要过时的SMB1协议,而此协议是不安全的,可能会是你的系统遭受攻击。你的系统需要SMB2或更高版本截图如下所示: 2. 解决…

竞赛 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…

【Linux】Linux常用指令合集精讲,一篇让你彻底掌握(万字真言)

文章目录 一、文件与目录操作1.1 ls - 列出目录内容1.2 cd - 切换目录1.3 pwd - 显示当前目录1.4 mkdir - 创建目录1.5 rmdir - 删除空目录1.6 rm - 删除文件或目录1.7 cp - 复制文件或目录1.8 mv - 移动或重命名文件或目录1.9 touch - 创建空文件或更新文件时间戳 二、文件内容…

朗新天霁eHR GetFunc_code.asmx SQL注入致RCE漏洞复现

0x01 产品简介 朗新天霁人力资源管理系统(LongShine eHR)是一款由北京朗新天霁软件技术有限公司研发的人力资源管理系统,该产品融合了国外先进的人力资源管理理念和国内大量人力资源管理实践经验,是国内功能较为全面、性价比较高的人力资源管理系统之一,系统凭借其集成化…

@amap/amap-jsapi-loader实现高德地图嵌入React项目中,并且做到点击地图任意一处,获得它的经纬度

1.第一步要加入项目package.json中或者直接yarn install它都可以 想必大家应该都会 "amap/amap-jsapi-loader": "0.0.7"2.加入项目中 关于接口获取key的接口 大家改成自己对应的项目请求方法 import React, { PureComponent } from react; import { Input…

厂家技术 最新钨蚀刻液的制作方法

网盘 https://pan.baidu.com/s/15ZAiUicstYEiFPvNKK72VA?pwd6u4x VCSEL芯片金薄膜蚀刻液及其蚀刻方法.pdf 废铝蚀刻液回收磷酸的方法.pdf 抑制二氧化硅蚀刻的无C蚀刻液.pdf 氮化硅和钨的选择性蚀刻液.pdf 用于在穿孔中选择性沉积钨的系统和方法.pdf 蚀刻液和使用了所述蚀刻液…

香橙派AIpro开发板评测:部署yolov5模型实现图像和视频中物体的识别

OrangePi AIpro 作为业界首款基于昇腾深度研发的AI开发板&#xff0c;自发布以来就引起了我的极大关注。其配备的8/20TOPS澎湃算力&#xff0c;堪称目前开发板市场中的顶尖性能&#xff0c;实在令人垂涎三尺。如此强大的板子&#xff0c;当然要亲自体验一番。今天非常荣幸地拿到…

【C++】BMP图片结构深度解析及其在C++中的操作与应用

引言 BMP&#xff08;Bitmap Image File&#xff09;是一种与设备无关的图像文件格式&#xff0c;它采用了一种非常直接的方式来存储图像数据&#xff0c;即按照图像的行和列顺序&#xff0c;逐像素地存储颜色值。由于其简单性和可移植性&#xff0c;BMP文件在图像处理、图像分…

看看这组B端规范,你就会感叹:钱真是万能的。

B端设计规范的作用和价值主要体现在以下几个方面&#xff1a; 统一视觉风格和用户体验&#xff1a;B端设计规范可以规定统一的视觉风格和用户界面&#xff0c;使得不同的产品和服务在外观和交互上保持一致&#xff0c;提升用户的使用体验和满意度。 提高产品开发效率&#xf…

Android Studio下载Gradle特别慢,甚至超时,失败。。。解决方法

使用Android studio下载或更新gradle时超级慢怎么办&#xff1f; 切换服务器&#xff0c;立马解决。打开gradle配置文件 修改服务器路径 distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-7.3.3-bin.zip 最后&#xff0c;同步&#xff0c;下载&#xff0c;速…