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); + } +}