📋 目录
- 一、工具类功能
- 二、所需环境
- 三、方法与调用示例(按需调用)
- 四、工具类源码(可直接复制)
一、工具类功能
基于 JDK 内置HttpClient发 GET/POST 请求,拿回来的直接是业务对象——单个对象、List/Map这类泛型结构,也可以就是响应原文,非 2xx 把状态码与完整错误体一并交回。
二、所需环境
JDK 17或以上 + Spring Boot 3.x或以上
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency>三、方法与调用示例(按需调用)
🔢方法序号:1
🎯方法用途:发一个 GET 请求,把响应直接读成指定类型的对象,对接 REST 接口取单个对象不用再手写解析
🧩方法定义:public static <R> R get(String url, Class<R> responseType)
🗣️入参解释:public static <R> R get(请求地址, 目标类型)
📤返回值解释:R,与目标类型同一个类型
💡边界口径:
- 目标类型传
String.class拿响应体原文,传Void.class表示不关心返回体 - 响应体在内存里读,上限 8 MiB(
MAX_RESPONSE_BYTES),超限立即断开,不用于下载大文件 - 非 2xx 抛
HttpStatusException,带状态码、最终地址、响应头与完整错误体,可用bodyAs(Class)一步解成对象 - 只放行
http/https且必须有主机名,其余协议抛IllegalArgumentException - 重定向按
NORMAL跟随,自定义请求头会被带到跳转后的地址,跳转目标不可控时别在头里放凭据
🧪方法示例:
get(textUrl, String.class)原生返回 拿到这段不是 JSONget(userUrl, User.class)返回对象 拿到User[name=张三, age=18]
🔢方法序号:2
🎯方法用途:发 GET 请求并把响应读成List/Map这类泛型结构,接口返回数组时直接拿到对象列表
🧩方法定义:public static <R> R get(String url, TypeReference<R> responseType)
🗣️入参解释:public static <R> R get(请求地址, 泛型类型)
📤返回值解释:R,由泛型类型引用决定,如List<User>
💡边界口径:
- 泛型入参写
new TypeReference<>() {},目标类型由接收变量推断 - 响应体在内存里读,上限 8 MiB(
MAX_RESPONSE_BYTES),超限立即断开,不用于下载大文件 - 非 2xx 抛
HttpStatusException,带状态码、最终地址、响应头与完整错误体,可用bodyAs(Class)一步解成对象 - 只放行
http/https且必须有主机名,其余协议抛IllegalArgumentException - 重定向按
NORMAL跟随,自定义请求头会被带到跳转后的地址,跳转目标不可控时别在头里放凭据
🧪方法示例:
get(usersUrl, new TypeReference<>() {})返回集合列表 拿到[User[name=张三, age=18], User[name=李四, age=20]]
🔢方法序号:3
🎯方法用途:GET 的全参版,要带查询参数、自定义请求头或单独设超时时用,不用为了这几个选项自己拼 URL
🧩方法定义:public static <R> R get(String url, Map<String, String> queryParams, Map<String, String> headers, Duration requestTimeout, Class<R> responseType)
🗣️入参解释:public static <R> R get(请求地址, 查询参数, 请求头, 本次超时, 目标类型)
📤返回值解释:R,与目标类型同一个类型
💡边界口径:
- 默认只带
Accept: application/json;同名头以传入的headers为准,覆盖它就是发表单请求的做法 - 请求超时按本次调用生效,默认 30 秒(
DEFAULT_REQUEST_TIMEOUT),且约束延伸到响应体每一块,不只是响应头 - 连接超时固定 10 秒,全局共用一个
HttpClient(自带连接池),不要每次请求新建 - 响应体在内存里读,上限 8 MiB(
MAX_RESPONSE_BYTES),超限立即断开,不用于下载大文件 - 非 2xx 抛
HttpStatusException,带状态码、最终地址、响应头与完整错误体,可用bodyAs(Class)一步解成对象 - 只放行
http/https且必须有主机名,其余协议抛IllegalArgumentException - 重定向按
NORMAL跟随,自定义请求头会被带到跳转后的地址,跳转目标不可控时别在头里放凭据
🧪方法示例:
get(url, params, headers, timeout, String.class)原生返回 拿到{"name":"张三","age":18}get(url, params, headers, timeout, User.class)返回对象 拿到User[name=张三, age=18]
🔢方法序号:4
🎯方法用途:GET 全参版的泛型结构入口,既要带参数与自定义头、又要读回List/Map时用
🧩方法定义:public static <R> R get(String url, Map<String, String> queryParams, Map<String, String> headers, Duration requestTimeout, TypeReference<R> responseType)
🗣️入参解释:public static <R> R get(请求地址, 查询参数, 请求头, 本次超时, 泛型类型)
📤返回值解释:R,由泛型类型引用决定
💡边界口径:
- 参数、请求头与超时口径同方法3,返回形态与方法2 一致
- 响应体在内存里读,上限 8 MiB(
MAX_RESPONSE_BYTES),超限立即断开,不用于下载大文件 - 非 2xx 抛
HttpStatusException,带状态码、最终地址、响应头与完整错误体,可用bodyAs(Class)一步解成对象 - 只放行
http/https且必须有主机名,其余协议抛IllegalArgumentException - 重定向按
NORMAL跟随,自定义请求头会被带到跳转后的地址,跳转目标不可控时别在头里放凭据
🧪方法示例:
get(usersUrl, params, headers, timeout, new TypeReference<>() {})返回集合列表 拿到[User[name=张三, age=18], User[name=李四, age=20]]
🔢方法序号:5
🎯方法用途:发一个 JSON POST,把请求体对象直接序列化发出去,响应读回指定类型的对象,创建类接口一步完成
🧩方法定义:public static <R> R post(String url, Object body, Class<R> responseType)
🗣️入参解释:public static <R> R post(请求地址, 请求体, 目标类型)
📤返回值解释:R,与目标类型同一个类型
💡边界口径:
- 请求体是
String就原样发送,其余对象按 JSON 序列化,日期写成 ISO-8601;byte[]会被 Jackson 写成 base64 字符串,本类不用于传原始二进制 - 默认带
Content-Type: application/json; charset=UTF-8,发表单要自己覆盖这个头 - 响应里多出来的字段不会让解析报错
- 响应体在内存里读,上限 8 MiB(
MAX_RESPONSE_BYTES),超限立即断开,不用于下载大文件 - 非 2xx 抛
HttpStatusException,带状态码、最终地址、响应头与完整错误体,可用bodyAs(Class)一步解成对象 - 只放行
http/https且必须有主机名,其余协议抛IllegalArgumentException - 重定向按
NORMAL跟随,自定义请求头会被带到跳转后的地址,跳转目标不可控时别在头里放凭据
🧪方法示例:
post(url, form, String.class)原生返回 拿到{"orderId":"SO20260930001","created":true}post(url, form, CreateResult.class)返回对象 拿到CreateResult[orderId=SO20260930001, created=true]
🔢方法序号:6
🎯方法用途:POST 的泛型结构入口,接口返回一批对象时直接读成List<实体>
🧩方法定义:public static <R> R post(String url, Object body, TypeReference<R> responseType)
🗣️入参解释:public static <R> R post(请求地址, 请求体, 泛型类型)
📤返回值解释:R,由泛型类型引用决定
💡边界口径:
- 请求体与请求头口径同方法5
- 响应体在内存里读,上限 8 MiB(
MAX_RESPONSE_BYTES),超限立即断开,不用于下载大文件 - 非 2xx 抛
HttpStatusException,带状态码、最终地址、响应头与完整错误体,可用bodyAs(Class)一步解成对象 - 只放行
http/https且必须有主机名,其余协议抛IllegalArgumentException - 重定向按
NORMAL跟随,自定义请求头会被带到跳转后的地址,跳转目标不可控时别在头里放凭据
🧪方法示例:
post(listUrl, form, new TypeReference<>() {})返回集合列表 拿到[CreateResult[orderId=SO20260930002, created=true], CreateResult[orderId=SO20260930003, created=true]]
🔢方法序号:7
🎯方法用途:POST 的全参版,要带查询参数、自定义头或单独设超时时用,覆盖Content-Type就能发表单
🧩方法定义:public static <R> R post(String url, Object body, Map<String, String> queryParams, Map<String, String> headers, Duration requestTimeout, Class<R> responseType)
🗣️入参解释:public static <R> R post(请求地址, 请求体, 查询参数, 请求头, 本次超时, 目标类型)
📤返回值解释:R,与目标类型同一个类型
💡边界口径:
- 同名头以传入的
headers为准,把Content-Type换成application/x-www-form-urlencoded即发表单 - 超时与连接复用口径同方法3
- 响应体在内存里读,上限 8 MiB(
MAX_RESPONSE_BYTES),超限立即断开,不用于下载大文件 - 非 2xx 抛
HttpStatusException,带状态码、最终地址、响应头与完整错误体,可用bodyAs(Class)一步解成对象 - 只放行
http/https且必须有主机名,其余协议抛IllegalArgumentException - 重定向按
NORMAL跟随,自定义请求头会被带到跳转后的地址,跳转目标不可控时别在头里放凭据
🧪方法示例:
post(url, form, params, headers, timeout, String.class)原生返回 拿到{"name":"张三"}post(url, form, params, headers, timeout, FormEcho.class)返回对象 拿到FormEcho[name=张三]
🔢方法序号:8
🎯方法用途:POST 全参版的泛型结构入口,带参数与自定义头的同时把响应读成List/Map
🧩方法定义:public static <R> R post(String url, Object body, Map<String, String> queryParams, Map<String, String> headers, Duration requestTimeout, TypeReference<R> responseType)
🗣️入参解释:public static <R> R post(请求地址, 请求体, 查询参数, 请求头, 本次超时, 泛型类型)
📤返回值解释:R,由泛型类型引用决定
💡边界口径:
- 参数、请求头与超时口径同方法7,返回形态与方法6 一致
- 响应体在内存里读,上限 8 MiB(
MAX_RESPONSE_BYTES),超限立即断开,不用于下载大文件 - 非 2xx 抛
HttpStatusException,带状态码、最终地址、响应头与完整错误体,可用bodyAs(Class)一步解成对象 - 只放行
http/https且必须有主机名,其余协议抛IllegalArgumentException - 重定向按
NORMAL跟随,自定义请求头会被带到跳转后的地址,跳转目标不可控时别在头里放凭据
🧪方法示例:
post(listUrl, form, params, headers, timeout, new TypeReference<>() {})返回集合列表 拿到[CreateResult[orderId=SO20260930002, created=true], CreateResult[orderId=SO20260930003, created=true]]
🔢方法序号:9
🎯方法用途:把键值对拼成 URL 查询串,自己管请求或用别的客户端时也能复用同一套编码口径
🧩方法定义:public static String toQueryString(Map<String, String> params)
🗣️入参解释:public static String toQueryString(键值对)
📤返回值解释:String,已按 UTF-8 百分号编码的查询串,不带前导?
💡边界口径:
- 键与值都按 UTF-8 百分号编码,中文与保留字符不会拼坏
- 参数不合法(如
params为null)抛IllegalArgumentException - 它只是编码工具,不参与任何请求发送
🧪方法示例:
toQueryString(Map.of("name", "zhangsan", "addr", "xx街道"))返回编码串 拿到name=zhangsan&addr=xx%E8%A1%97%E9%81%93
四、工具类源码(可直接复制)
📦领取方式: 关注点赞收藏,私信回复「java工具类」可领取100个工具类「Java企业级工具类全家桶(1-100)」的完整源码。
💡 工具类已调试通过,复制粘贴即可使用,省时省力
💡 可保存到自己网盘,永久有效
觉得对您有帮助,麻烦点点关注啦,您的关注是我创作的最大动力~ 🎯