Okhttp3最佳使用方式

2023-05-16

Okhttp3最佳使用方式

一,使用前准备

要使用okhttp3,首先我们要引入相关依赖,至于版本的选择,就根据自己项目的需求了。

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

二,初始化client

使用单例模式,因为,我们只需要一个okhttp3的client就行了。在初始化的时候,我们需要配置相应的参数,client的参数比较多,我们可以看自己的需求添加。

import okhttp3.*;
import java.util.concurrent.TimeUnit;
/**
 * okhttp3 单例对象
 */
public class OkHttpClientSingle {

    private OkHttpClientSingle(){
    }

    private static volatile OkHttpClient clientInstance;

    public static OkHttpClient getClientInstance() {
        if (clientInstance == null) {
            synchronized (OkHttpClientSingle.class){
                if (clientInstance == null){
                    clientInstance = new OkHttpClient.Builder()
                            .connectTimeout(5, TimeUnit.SECONDS)
                            .writeTimeout(5, TimeUnit.SECONDS)
                            .readTimeout(15, TimeUnit.SECONDS)
                            .connectionPool(new ConnectionPool(10,5, TimeUnit.MILLISECONDS))
                            .retryOnConnectionFailure(true)
                            .build();
                }
            }
        }
        return clientInstance;
    }
}

三,实现okhttp3的工具类

该工具类,主要实现了,get和post请求,又分别为带header以及不带header。post又分为form表单跟body传参的。

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import java.util.Map;

@Slf4j
public class Okhttp3Utils {

    /**
     * 普通get请求
     * @param url
     * @return
     * @throws Exception
     */
    public static String get(String url) throws Exception{
        return  get(url,null);
    }

    /**
     * 普通get请求  带header
     * @param url
     * @return
     * @throws Exception
     */
    public static String get(String url, Map<String,String> headers) throws Exception{
        OkHttpClient clientInstance = OkHttpClientSingle.getClientInstance();

        Request.Builder builder = new Request.Builder().url(url);
        if(headers != null){
            for (String key : headers.keySet()) {
                builder.addHeader(key,headers.get(key));
            }
        }
        Request request = builder.build();

        Response res = clientInstance.newCall(request).execute();
        if(!res.isSuccessful()){
            log.warn("url:{} header:{} msg:{}",url,JSON.toJSONString(headers),res.message());
            return null;
        }
        return  res.body().string();
    }

    /**
     * post 请求带formdata
     * @param url
     * @param formData
     * @return
     * @throws Exception
     */
    public static String postForm(String url,  Map<String,String> formData) throws Exception{
       return postForm(url,null,formData);
    }

    /**
     * post 请求带formdata  带header
     * @param url
     * @param headers
     * @param formData
     * @return
     * @throws Exception
     */
    public static String postForm(String url, Map<String,String> headers, Map<String,String> formData) throws Exception{
        Response response = postFormRetRes(url, headers, formData);
        if(!response.isSuccessful()){
            log.warn("url:{} header:{} formData:{} msg:{}",url,JSON.toJSONString(headers),JSON.toJSONString(formData),response.message());
            return null;
        }
        return  response.body().string();
    }

    /**
     * post 请求带formdata  带header  返回response
     * @param url
     * @param headers
     * @param formData
     * @return
     * @throws Exception
     */
    private static Response postFormRetRes(String url, Map<String,String> headers, Map<String,String> formData) throws Exception{
        OkHttpClient clientInstance = OkHttpClientSingle.getClientInstance();

        RequestBody requestBody = null;
        FormBody.Builder builder = new FormBody.Builder();
        if(formData != null){
            for (String key : formData.keySet()) {
                builder.add(key,formData.get(key));
            }
            requestBody = builder.build();
        }

        Request.Builder requestBuilder = new Request.Builder().url(url);
        if(requestBody != null){
            requestBuilder.post(requestBody);
        }
        if(headers != null){
            for (String key : headers.keySet()) {
                requestBuilder.addHeader(key,headers.get(key));
            }
        }
        Request request = requestBuilder.build();
        Response res = clientInstance.newCall(request).execute();
        return  res;
    }

    /**
     * post 请求带body json数据  返回string
     * @param url
     * @param data
     * @return
     * @throws Exception
     */
    public static String postBody(String url,   Object data) throws Exception{
        Response response = postBodyRetRes(url, null, data);
        if(!response.isSuccessful()){
            log.warn("url:{}  body:{} msg:{}",url,JSON.toJSONString(data),response.message());
            return null;
        }
        return  response.body().string();
    }

    /**
     * post 请求带body json数据  带header  返回string
     * @param url
     * @param headers
     * @param data
     * @return
     * @throws Exception
     */
    public static String postBody(String url, Map<String,String> headers,  Object data) throws Exception{
        Response response = postBodyRetRes(url, headers, data);
        if(!response.isSuccessful()){
            log.warn("url:{} header:{} body:{} msg:{}",url,JSON.toJSONString(headers),JSON.toJSONString(data),response.message());
            return null;
        }
        return  response.body().string();
    }

    /**
     * post 请求带body json数据  带header  返回response
     * @param url
     * @param headers
     * @param data
     * @return
     * @throws Exception
     */
    public static Response postBodyRetRes(String url, Map<String,String> headers,  Object data) throws Exception{
        OkHttpClient clientInstance = OkHttpClientSingle.getClientInstance();

        MediaType mediaType = MediaType.parse("application/json; charset=UTF-8");

        RequestBody requestBody = FormBody.create(mediaType , JSON.toJSONString(data));

        Request.Builder requestBuilder = new Request.Builder().url(url);
        if(requestBody != null){
            requestBuilder.post(requestBody);
        }
        if(headers != null){
            for (String key : headers.keySet()) {
                requestBuilder.addHeader(key,headers.get(key));
            }
        }
        Request request = requestBuilder.build();
        Response res = clientInstance.newCall(request).execute();
        return  res;
    }
}

四,总结

okhttp3是个非常好用的http的库。要比httpclient好用多了。如果想更多的了解使用okhttp3,我还是推荐大家去官网去看看。链接: 官网

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Okhttp3最佳使用方式 的相关文章

  • TabError: inconsistent use of tabs and spaces in indentation

    错误原因是tab制表符和空格混用了 从其他地方复制源码容易出现此错误 解决办法 xff1a 把处于同级缩进的所有缩进修改统一 比较流行的几个编辑器都能标识tab和空格 xff0c 比如我用的vscode 用鼠标框选 不知道是tab还是空格的
  • 关于深度学习的问题笔记

    感谢沐神教我深度学习 x1f64f 损失为什么要平均 xff1f 平均即除以batch size xff0c 若不除 xff0c 则批越大梯度越大 xff0c 梯度下降的步长就越大 除以batch size可使梯度与批大小无关 也可以不在损
  • 简单(炫酷)的单链表快速排序写法

    昨天在复习快排的时候 在B站看到一个小哥哥说某大厂的面试让写一个单链表的快速排序 我们见的最多的快排写法都是从两端向中间扫描 这种写法在单链表上不能实现 哥们分析道 快排的核心思想是每次扫描后 所有pivot左侧的元素都比pivot小 右侧
  • char* char[]

    C 43 43 判断char 的指向 char a 61 34 Peter 34 char b 61 34 Peter 34 char c 61 new char 6 strcpy s c 6 34 Peter 34 这里a指向常量区 b指
  • HTTP 基本认证 HttpBasic

    HTTP 的认证机制 基本认证 摘要认证 一 基本认证 用BASE64 算法加密后的字符串放在HTTP Request中的Header Authorization中发送给服务端 xff0c 这种方式叫HTTP基本认证 Basic Authe
  • libcurl异步调用

    span class token keyword int span span class token function main span span class token punctuation span span class token
  • 标准c++库、stl库,boost库,qt库

    C 43 43 标准库 C C xff0b xff0b 标准库主要包含3部分 xff1a STL IO流及本地化 C的函数库 标准库不是STL STL是标准模板库 是标准库的一个子集 它是一个可复用的组件库 xff0c 其中包含了很多实用的
  • 生成2023年节假日/工作日维表

    项目中有一张维表 xff0c 维护的是历史节假日工作日的信息 xff0c 估计在很多场合都有类似的需求 到了新年 xff0c 需要生成新一年的数据 xff0c 下面看看如何在维表中插入新一年的数据 1 查询节假日 根据国务院发布的休假信息
  • C++智能指针

    参考 xff1a 头文件auto ptr使用示例 unique ptr类模板声明示例 shared ptr模板声明通过辅助类模拟实现 shared ptrshared ptr使用示例 weaked ptrweak ptr 用法weak pt
  • 使用SiftGPU对两幅图像进行特征点匹配

    前言 继上一篇博客中谈到使用Changchang Wu的SiftGPU xff0c 使用GLSL语言在Windows系统下的编译方法http blog csdn net qq 36007951 article details 7847234
  • CAN通信学习笔记(一)

    1 CAN通信的基本原理 1 1 基本概念 CAN 是 Controller Area Network 的缩写 xff08 以下称为 CAN xff09 xff0c 是 ISO 国际标准化的串行通信协议 在北美和西欧 xff0c CAN 总
  • DSP28335 SCI FIFO深度设置

    SCI工作在FIFO模式下一般是因为所传输的信息并不是以一个字节为单位 xff0c 而是以多个字节组成的一个包为单位的 如果一包数据包括10个字节 xff0c 可以设置FIFO接收中断为10个字节时产生中断 设置以后 xff0c 每接收到1
  • Serial Studio简单使用说明

    Serial Studio简介 Serial Studio是一个跨平台的软件 xff0c 支持将串口 xff0c TCP UDP xff0c MQTT等协议传输数据 xff0c 并将数据可视化显示 xff0c 方便嵌入式开发人员实现数据的可
  • YOLOV1个人理解总结

    YOLO是著名的端到端目标检测框架 xff0c 最大的特点是检测快 xff0c 亲自试验YOLOv3 v5 v5在jeston Xavier NX上可以达到15FPS左右 xff0c 检测精度也相当可观 xff0c 可以达到实时检测 xff
  • STM32HAL库-USART-调试串口(大小端测试)

    概述 本篇文章介绍如何使用STM32HAL库 xff0c USART 调试串口 xff08 大小端测试 xff09 示例 硬件 xff1a STM32F103CBT6最小系统板 软件 xff1a Keil 5 29 43 STM32Cube
  • Windows下实现C语言Socket通讯TCP传送结构体信息

    版权声明 xff1a 本文为博主原创文章 xff0c 未经博主允许不得转载 Windows下实现C语言Socket通讯 lt TCP传送结构体信息 gt 首先socket通信的步骤 xff1a 三次握手协议 三次握手协议 代码 服务器端 i
  • #STC8A8K# #STC8F1K# #STC8G1K# #STC8H1K# ——STC8系列单片机整体评价

    成就更好的自己 声明 xff1a 这不是广告 xff0c 只是发表看法和吐槽 xff0c 不吹不擂 xff1b 本文以STC8A8K64S4A12 为例 xff0c 简要分析一下STC8系列 xff1b STC 宏晶科技 公司作为国内的一家

随机推荐

  • 拓展模块使用教程和心得(三):ULN2003模块与28BYJ48步进电机(测试平台:STC8A8K,STM32F103)

    成就更好的自己 关于ULN2003模块和对应的28BYJ48步进电机 xff0c 网上现有的资料与教程对于初学者有点不太友好 xff0c 造成的现象是仅仅只能让步进电机转起来 xff0c 但是没有对于控制转速和转角的实践分析 xff0c 本
  • intellij 从2020升级到2023 踩坑实录

    1 下载新版本intellij 工作机器上的intellij版本为2020社区版 xff0c 版本比较老旧 xff0c 需要进行升级 IDE这种提高生产力的工具 xff0c 还是蛮重要的 xff0c 也是值得稍微多花点时间研究一下的 升级之
  • 拓展模块使用教程和心得(五):HC08及HC系列蓝牙模块

    成就更好的自己 今天在做单片机的数据采集并给PC处理 xff0c 根据前期的想法本来是要使用nRF24L01进行的 xff0c 奈何nRF无线模块转USB接口太不给力 xff0c 因此使用到了HC08作为发送和接收数据的模块 目录 简介 内
  • ROS四旋翼无人机快速上手指南(3):工作环境文件框架与各功能包整体讲解

    成就更好的自己 这一章节主要讲解无人机平台的控制文件架构和各个功能包组成和用法 uav ws与shell源码链接 xff1a https gitee com theroadofengineers ros uav 目录 主要项目文件架构概述
  • STM32程序不运行与MicroLIB讲解

    成就更好的自己 目录 引言 什么是MicroLIB 不使用Microlib导致卡死的原理 卡死解决办法 xff1a 优化空间测评 引言 先说问题 xff0c 这几天在使用STM32H750调试程序的过程中出现了一些问题 xff0c 博主使用
  • 拓展模块使用教程和心得(7):3irobotix杉川Delta-1A激光雷达的STM32F407HAL驱动

    成就更好的自己 随着现代智能化设备程度的提高 xff0c 激光雷达已经是在智能控制与检测领域的极其常用的智能化传感器 xff0c 今天就来介绍一下3irobotix公司的Delta 1A激光雷达 Delta 1A激光雷达是一款低成本中等性能
  • RT-Thread&&STM32开发系列(2):FAT头文件包含报错与RTT和CubeMX文件兼容问题

    成就更好的自己 近期的项目需要在RTT下 xff0c 使用SD卡运行FAT文件系统 xff0c 而且还能通过USB将这个SD卡虚拟化成大容量可存储设备 xff0c 在项目初期遇到了一些小问题 xff0c 记录一下 xff0c 防止别的朋友踩
  • [已解决] RTT 串口DMA接受 开头丢失一整包的问题

    起因 项目需求需要设备通过串口的方式发送信息 xff0c STM32F4将串口的信息接收并保存到SD卡中 xff1b 通过XCOM串口助手发送文件的方式进行功能测试 xff0c 测试的时候发现总会丢弃一部分头 项目需要两路串口都保存到SD卡
  • 用实际的激光雷达和里程计运行gmapping历程

    我用的激光雷达是LMS1XX系列的 xff0c 该系列的激光雷达有ROS下的驱动程序可以到网上下载编译 里程计是自己机器人发布的信息 一开始以为自己得到了这两个信息就能运行gmapping了 xff0c 结果发现自己太天真 上网查了一下原因
  • 无数四轴的航模常识

    KV 值 无刷电机KV值定义为 转速 V xff0c 意思为输入电压增加1伏特 xff0c 无刷电机空转转速增加的转速值 例如KV1000的无刷电机 xff0c 代表电压为11V的时候 xff0c 电机的空转转速为11000转 分 KV值越
  • 5G系统的性能指标

    ITU R制定了5G系统的8个性能指标和3种应用场景 流量密度 xff1a 10Tbit s km 2 连接数密度 xff1a 10 6每平方千米 时延 xff1a 空口1ms 能效 xff1a 相对于4G xff0c 100倍提升 用户体
  • find命令用法小结

    0 前言 不管我决心如何组织文件 xff0c 似乎总有无法找到文件的时候 有时是因为我不记得最初的文件名 xff0c 其他时候 xff0c 我知道名字 xff0c 但我不记得在哪里保存它了 甚至有时我需要一个我最初就没有创建的文件 但是 x
  • 在EBAZ4205 zynq7010上运行AXI_DMA中断回环测试

    在EBAZ4205 zynq7010上运行AXI DMA loop interrupt 整体的布局图 这是上面的一张接口图 下面对每个模块附上截图 AXI DMA的输出mm2s introut s2mm introut接到PS系统的中断触发
  • http 方式请求pos请求和get请求,认证方式 用户名密码

    利用apache包请求get和post请求 xff0c 用户名和密码认证 xff0c 用户名密码填则认证 xff0c 不填测不认证 利用maven构建项目 需要导入一个包 lt dependency gt lt groupId gt org
  • jenkins部署jar包到远程服务器

    jenkins部署jar包到远程服务器 1 安装Publish Over SSH插件2 配置ssh以及jenkins的ssh配置3 jenkins任务的配置4 总结 一 xff0c 安装Publish Over SSH插件 xff0c 进入
  • java把文件流转base64,然后前端展示base64图片

    一 xff0c java端 1 xff0c 项目是基于springboot的 读取本地图片 xff0c 转成base64编码字节数组字符串 xff0c 传到前端 2 xff0c 这种传输图片的方式可以用于Java后台代码生成条形码二维码 x
  • 使用nacos配置教程

    1 xff0c 访问nacos网页 默认nacos网页为 uat环境地址 进入网页 默认账号 nacos 密码 nacos 2 xff0c 配置管理 1 xff0c 页面概述 进来页面如下 xff0c 我已经建立了三个命名空间 xff0c
  • redis实现延时队列的两种方式

    背景 项目中的流程监控 xff0c 有几种节点 xff0c 需要监控每一个节点是否超时 按传统的做法 xff0c 肯定是通过定时任务 xff0c 去扫描然后判断 xff0c 但是定时任务有缺点 xff1a 1 xff0c 数据量大会慢 xf
  • go集成gin处理error

    1 gin的使用 gin在go开发web的占比是挺大的 很好用的web框架 xff0c 简单快速高效 但是呢 xff0c 在使用gin的过程中 xff0c 如何去统一去处理error和数据返回给客户端呢 xff1f 原始的做法如下 xff1
  • Okhttp3最佳使用方式

    Okhttp3最佳使用方式 一 xff0c 使用前准备 要使用okhttp3 xff0c 首先我们要引入相关依赖 xff0c 至于版本的选择 xff0c 就根据自己项目的需求了 span class token tag span class