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

HttpUtils 详解

一、详解

1.1 介绍

现如今的 Web 项目,由服务端向外发起网络请求的场景,基本上随处可见!
传统情况下,在服务端代码里访问 http 服务时,一般会使用 JDK 的 HttpURLConnection 或者 Apache 的 HttpClient,不过这种方法使用起来太过繁琐,而且 api 使用起来非常的复杂,还得操心资源回收。

1.2 什么是 HttpUtils?
  • HttpUtils 是 Solon 提供的进行远程调用客户端
  • HttpUtils 提供了很多远程调用的方法,能够大大提高客户端的编写效率。 HttpUtils 接口实现了 HttpURLConnection 的适配(默认),以及 OkHttp 的适配。
  • 官网地址: solon-net-httputils
1.3 引入依赖
<dependency><groupId>org.noear</groupId><artifactId>solon-net-httputils</artifactId>
</dependency>

HttpUtils 不需要初始化,即可直接使用。而且,可以直接使用负载均衡的能力(需要引入 solon-cloud 的插件,提供底层支持)。像这样:

HttpUtils.http("user-service", "/user/get?id=1").get();

二、接口使用

HttpUtils 最大的特色就是对各种网络请求方式做了包装,能极大的简化开发人员的工作量,下面我们以 GET、POST、PUT、DELETE、文件上传与下载为例,分别介绍各个API的使用方式。

2.1 GET 请求

通过 HttpUtils 发送 HTTP GET 协议请求,经常使用到的方法有两个:

  • get() -> String
  • getAs(Type type) -> T (支持泛型)

在 Solon 环境下写一个单元测试用例,首先创建一个 Api 接口,然后编写单元测试进行服务测试。

不带参的get请求
@Controller
public class TestController {@Get@Mapping("testGet")public Result testGet(){Result result = new Result();result.setCode("200");result.setMsg("demo...");return result;}
}@Data
public class Result {private String code;private String msg;
}

单元测试(不带参的get请求)

@Test
public void testGet(){//请求地址String url = "http://localhost:8080/testGet";//发起请求,直接返回对象Result result = HttpUtils.http(url).getAs(Result.class);System.out.println(result.toString());
带参的get请求(使用占位符号传参)
@Controller
public class TestController {@Get@Mapping("testGetByRestFul/{id}/{name}")public Result testGetByRestFul(@Path("id") String id, @Path("name") String name){Result result = new Result();result.setCode("200");result.setMsg("demo...");return result;}
}

单元测试(带参的get请求),顺带加了个 header 信息。

@Test
public void testGetByRestFul(){//请求地址String url = "http://localhost:8080/testGetByRestFul/001/张三";//发起请求,直接返回对象(restful风格)Result result = HttpUtils.http(url).header("App-Id","1").getAs(Result.class);System.out.println(result.toString());
}
2.2 POST 请求

其实 POST 请求方法和 GET 请求方法上大同小异,HttpUtils 的 POST 请求也包含两个主要方法:

  • post() -> String
  • postAs(Type type) -> T(支持泛型)
模拟表单请求,post方法测试
@Controller
public class TestController {@Post@Mapping("testPostByForm")public Result testPostByForm(String userName, String userPwd){Result result = new Result();result.setCode("200");result.setMsg("Demo...");return result;}
}

x-www-form-urlencoded post

@Test
public void testPostByForm(){//请求地址String url = "http://localhost:8080/testPostByForm";//发起请求Result result = HttpUtils.http(url).data("userName", "唐三藏").data("userPwd", "123456").postAs(Result.class);System.out.println(result.toString());
}

form-data post,顺带加上文件上传

@Test
public void testPostByForm(){//请求地址String url = "http://localhost:8080/testPostByForm";//发起请求Result result = HttpUtils.http(url).data("userName", "唐三藏").data("userPwd", "123456").data("file", "logo.jpg", new File("/data/logo.jpg")) .postAs(Result.class, true); //useMultipart = trueSystem.out.println(result.toString());
}

json-body post

@Test
public void testPostByForm(){//请求地址String url = "http://localhost:8080/testPostByForm";//发起请求Result result = HttpUtils.http(url).bodyOfJson("{\"userName\":\"唐三藏\",\"userPwd\":\"123456\"}").postAs(Result.class); System.out.println(result.toString());
}

bean-body post

@Test
public void testPostByForm(){//请求地址String url = "http://localhost:8080/testPostByForm";UserBean user = new UserBean();user.setUserName("唐三藏");user.setUserPwd("123456")//发起请求Result result = HttpUtils.http(url).bodyOfBean(user).postAs(Result.class); System.out.println(result.toString());
}
2.3 PUT、PATCH、DELETE 请求

用法与 POST 完全相同。

2.4 高级用法

获取响应(用完要关闭)

try(HttpResponse resp = HttpUtils.http("http://localhost:8080/hello").data("name","world").exec("POST")) {int code = resp.code();String head = resp.header("Demo-Header");String body = resp.bodyAsString();
}

配置序列化器。默认为 json,改为 fury;或者自己定义。

FuryBytesSerializer serializer = new FuryBytesSerializer();Result body = HttpUtils.http("http://localhost:8080/book").serializer(serializer).bodyOfBean(book).postAs(Result.class);

相关文章:

HttpUtils 详解

一、详解 1.1 介绍 现如今的 Web 项目&#xff0c;由服务端向外发起网络请求的场景&#xff0c;基本上随处可见&#xff01; 传统情况下&#xff0c;在服务端代码里访问 http 服务时&#xff0c;一般会使用 JDK 的 HttpURLConnection 或者 Apache 的 HttpClient&#xff0c;不…...

云计算第四阶段: cloud二周目 07-08

cloud 07 一、k8s服务管理 创建服务 # 资源清单文件 [rootmaster ~]# kubectl create service clusterip websvc --tcp80:80 --dry-runclient -o yaml [rootmaster ~]# vim websvc.yaml --- kind: Service apiVersion: v1 metadata:name: websvc spec:type: ClusterIPselector…...

智能合约开发工具Remix

不久前&#xff0c;我在B站、视频号和 YouTube 都陆续发布了新的一套免费视频课程《智能合约开发工具Remix》&#xff0c;总共分为了 9 个小节的视频&#xff0c;以下分别是这 9 个小节在 B 站的视频链接&#xff0c;喜欢直接看视频的伙伴可以去 B 站观看&#xff1a; 概况文件…...

YYF桌面 1.2 | 个性化桌面体验,清爽美观。

YYF桌面是一款经过定制的安卓桌面启动器&#xff0c;此版本基于1.2版本进行了一系列个性化修改。主界面快捷图标进行了美化处理&#xff0c;并采用了清爽半透明的图标背景。取消了底部快捷键&#xff0c;并重新制作了“全部应用”按钮&#xff0c;保留了动态效果。修改了右上角…...

【人工智能/计算机工程/大数据】第五届人工智能与计算工程国际学术会议(ICAICE 2024,2024年11月8-10日)

The 5th International Conference on Artificial Intelligence and Computer Engineering 第五届人工智能与计算工程国际学术会议&#xff08;ICAICE 2024&#xff09; 会议官网&#xff1a;www.event-icaice.org The 5th International Conference on Artificial Intellige…...

uni-app录音功能

纯纯干货&#xff0c;cv即用 <template><!-- 录音页面 --><view class"page"><view class"tape_box"><view class"upload_box1"><view class"upload_top"><view class"upload_img_title…...

C语言【调试】(个人笔记版)

调试 前言一、Bug二、调试工具1.DeBug2.Release 三、调试快捷键1、断点 四、调试时查看程序的当前信息1、查看临时变量2、查看内存3、查看调用堆栈、汇编、寄存器 总结 前言 这篇文章大都是我的个人笔记&#xff1a; 调试在日常程序设计中是很重要的。调试说白了就是为了解决代…...

连锁收银系统

商淘云连锁管理系统助力连锁企业实现“人货账”全方位数字化管理&#xff0c;它依托连锁品牌进销存管理实现门店订货、线下收银、线上商城、会员营销等一体化管理。 门店订货补货支持连锁直营、加盟 不同门店不同进货价、不同门店不同商品、不同门店在线或者账期支付、门店PC或…...

5.2024.10.21

2024.10.21 学习和复习 学习QT的流程控制、函数、内联函数复习C语言printf练习 问题及解决方案 C学到函数之后有些吃力代码逻辑能力不大行&#xff0c;需要巩固一下C语言基础再挤多点时间去学习嵌入式写代码前先把大概思路写出来 碎碎念 最近作业比较多&#xff0c;有点静不下…...

前端Socket互动小游戏开发体验分享

随着实时网络通信技术的不断发展&#xff0c;基于WebSocket的前端互动小游戏成为了一种非常流行的选择。WebSocket允许客户端和服务器之间进行双向通信&#xff0c;为游戏互动带来了更快的响应时间和更流畅的体验。本文将通过一个简单的互动小游戏来探讨前端如何利用WebSocket技…...

react项目,通过自定义 separator 属性来修改日期选择器中间的分隔符:

1. 引入必要的依赖 确保你已经引入了 DatePicker 组件和 moment 库。 import React, { Component } from react; import { DatePicker } from antd; import moment from moment; const { RangePicker } DatePicker; const dateFormat "YYYY/MM/DD"; 2. 定义父组…...

双十一有啥好用的家居好物推荐?2024性价比高的超声波清洗机推荐

双十一今天晚上就可以越热开抢了&#xff0c;还不知道购买什么物品的小伙伴们赶紧来看看我这篇文章&#xff0c;在众多家居好物中&#xff0c;超声波清洗机以其高效、便捷的特点&#xff0c;成为了许多家庭的必备神器。2024年&#xff0c;市场上涌现出了不少性价比超高的产品&a…...

比亚迪车机安装第三方应用教程

比亚迪车机安装第三方应用教程 比亚迪车机U盘安装APP&#xff0c; 无论是dlink3.0还是4.0都是安卓系统&#xff0c;因此理论上安卓应用是都可以安装的&#xff0c;主要就是横屏和竖屏的区别。在比亚迪上安装软件我主要推荐两种方法。 第一种&#xff0c;直接从电脑端下载安装布…...

移动零---双指针法

目录 一&#xff1a;题目 二:算法原理讲解 三&#xff1a;代码编写 一&#xff1a;题目 题目链接&#xff1a;https://leetcode.cn/problems/move-zeroes/description/ 二:算法原理讲解 三&#xff1a;代码编写 void moveZeroes2(vector<int>& nums) {for (int d…...

MoeCTF 2024 ---Misc方向WP

安全杂项 signin 题目描述&#xff1a; xdsec的小伙伴们和参赛者来上课&#xff0c;碰巧这一天签到系统坏了&#xff0c;作为老师的你&#xff0c;要帮他们 教师代签。 特殊提醒&#xff1a;luo同学今天好像在宿舍打游戏&#xff0c;不想来上课&#xff0c;这是严重的缺勤行为…...

【我的 RT 学习手札】信息收集

相关笔记整理自B站up主泷羽sec全栈渗透测试教学&#xff08;免费&#xff09; 视频链接为泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频 笔记只是方便师傅学习知识&#xff0c;以下网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0…...

CMake变量:CMAKE_FIND_LIBRARY_SUFFIXES

CMAKE_FIND_LIBRARY_SUFFIXES是CMake中的一个变量&#xff0c;用于指定在查找库文件时使用的后缀列表。当CMake需要找到库文件时&#xff0c;它会尝试在这些后缀后添加库名来构建库文件的完整路径。例如&#xff0c;如果库名为mylib&#xff0c;并且CMAKE_FIND_LIBRARY_SUFFIXE…...

在使用 RabbitMQ 作为消息代理时,多个 Celery 实例(或应用)可以共享同一个 RabbitMQ 实例

在使用 RabbitMQ 作为消息代理时&#xff0c;多个 Celery 实例&#xff08;或应用&#xff09;可以共享同一个 RabbitMQ 实例。这样做可以简化基础设施管理&#xff0c;同时允许不同的 Celery 应用之间进行消息传递和协作。下面是如何配置多个 Celery 实例以使用同一个 RabbitM…...

ARM在嵌入式开发中的作用有哪些?

ARM在嵌入式开发中的作用主要体现在以下几个方面&#xff1a; 架构优势&#xff1a; ARM架构基于RISC&#xff08;精简指令集计算机&#xff09;&#xff0c;具有精简而高效的指令集&#xff0c;适合资源受限的环境。低功耗设计使得ARM处理器在移动设备和嵌入式系统中非常受欢…...

-webkit-box-orient属性丢失?

在实际项目场景当中&#xff0c;我们经常会遇到需要对超长文本溢出省略的场景&#xff1a; 我们经常会这样写—— 单行省略&#xff1a; overflow: hidden; //文本溢出隐藏text-overflow: ellipsis; //文本溢出显示省略号white-space: nowrap; //不换行 多行省略&#xff1a…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...