From 58c193cb48cfa51dc59ce089131ec83c8cbc9b33 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 7 Mar 2025 09:46:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D`HttpUtil.normalizeParams`?= =?UTF-8?q?=E8=A7=84=E5=88=99=E9=97=AE=E9=A2=98=EF=BC=88issue#IBQIYQ@Gitee?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hutool/core/net/url/UrlQueryUtil.java | 14 ++++---- .../dromara/hutool/http/IssueIBQIYQTest.java | 34 +++++++++++++++++++ 2 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 hutool-http/src/test/java/org/dromara/hutool/http/IssueIBQIYQTest.java diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/net/url/UrlQueryUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/net/url/UrlQueryUtil.java index ce6672fb4..37479a8c4 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/net/url/UrlQueryUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/net/url/UrlQueryUtil.java @@ -152,17 +152,17 @@ public class UrlQueryUtil { pos = i + 1; } } else if (c == '&') { // 参数对的分界点 - if (pos != i) { - if (null == name) { - // 对于像&a&这类无参数值的字符串,我们将name为a的值设为"" + if (null == name) { + // 对于像&a&这类无参数值的字符串,我们将name为a的值设为"" + if (pos != i) { name = queryPart.substring(pos, i); builder.append(RFC3986.QUERY_PARAM_NAME.encode(name, charset)).append('='); - } else { - builder.append(RFC3986.QUERY_PARAM_NAME.encode(name, charset)).append('=') - .append(RFC3986.QUERY_PARAM_VALUE.encode(queryPart.substring(pos, i), charset)).append('&'); } - name = null; + } else { + builder.append(RFC3986.QUERY_PARAM_NAME.encode(name, charset)).append('=') + .append(RFC3986.QUERY_PARAM_VALUE.encode(queryPart.substring(pos, i), charset)).append('&'); } + name = null; pos = i + 1; } } diff --git a/hutool-http/src/test/java/org/dromara/hutool/http/IssueIBQIYQTest.java b/hutool-http/src/test/java/org/dromara/hutool/http/IssueIBQIYQTest.java new file mode 100644 index 000000000..c9f32c0cb --- /dev/null +++ b/hutool-http/src/test/java/org/dromara/hutool/http/IssueIBQIYQTest.java @@ -0,0 +1,34 @@ +package org.dromara.hutool.http; + +import org.dromara.hutool.core.net.url.UrlQueryUtil; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.Map; + +public class IssueIBQIYQTest { + @Test + void normalizeQueryTest() { + final Map map = new HashMap<>(); + map.put("id", ""); + map.put("type", "4"); + String url = UrlQueryUtil.toQuery(map); + Assertions.assertEquals("id=&type=4", url); + url = UrlQueryUtil.normalizeQuery(url, null); + Assertions.assertEquals("id=&type=4", url); + } + + @Test + void normalizeQueryTest2() { + final Map map = new HashMap<>(); + map.put("id", ""); + map.put("type", "4"); + map.put("", "3"); + String url = UrlQueryUtil.toQuery(map); + // 根据HTTP协议和URL规范(RFC 3986),name为空是合法的,例如:?value 或 ?=value + Assertions.assertEquals("=3&id=&type=4", url); + url = UrlQueryUtil.normalizeQuery(url, null); + Assertions.assertEquals("=3&id=&type=4", url); + } +}