URL查询工具-UrlQueryUtil
UrlQueryUtil是Hutool中用于处理URL查询字符串的工具类,提供了将Map转换为URL参数、编码查询字符串、标准化查询字符串以及解析查询字符串为Map等功能。
# 主要功能
- 将Map形式的表单数据转换为URL参数形式
- 编码URL查询字符串
- 标准化查询字符串
- 解析URL查询字符串为Map
- 解析URL查询字符串为List形式的Map(支持重复键)
# 主要方法
# toQuery(paramMap)
将Map形式的表单数据转换为Url参数形式,自动使用UTF-8编码键和值。
# toQuery(paramMap, charset)
将Map形式的表单数据转换为Url参数形式,可指定编码。
- paramMap中如果key为空(null和"")会被忽略,如果value为null,会被做为空白符("")
- 会自动url编码键和值
- 此方法用于拼接URL中的Query部分,并不适用于POST请求中的表单
# toQuery(paramMap, charset, encodeMode)
将Map形式的表单数据转换为Url参数形式,可指定编码和编码模式。
# encodeQuery(urlWithParams, charset)
对URL参数做编码,只编码键和值。
- 提供的值可以是url附带参数,但是不能只是url
- 注意,此方法只能标准化整个URL,并不适合于单独编码参数值
# normalizeQuery(queryPart, charset)
标准化参数字符串,即URL中?后的部分。
- 注意,此方法只能标准化整个URL,并不适合于单独编码参数值
# decodeQuery(paramsStr, charset)
将URL参数解析为Map(也可以解析Post中的键值对参数)。
# decodeQueryList(paramsStr, charset)
将URL参数解析为Map,支持重复键,每个键对应一个值列表。
# 示例代码
# 将Map转换为URL查询字符串
// 创建参数Map
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("key1", "value1");
paramMap.put("key2", null); // 会被转换为空字符串
paramMap.put("key3", "value3");
// 转换为URL查询字符串,默认UTF-8编码
String query = UrlQueryUtil.toQuery(paramMap);
// 输出:key1=value1&key2=&key3=value3
// 指定编码
String queryGBK = UrlQueryUtil.toQuery(paramMap, CharsetUtil.GBK);
# 编码URL查询字符串
// 编码带参数的URL
String url = "http://www.example.com/search?keyword=测试&page=1";
String encodedUrl = UrlQueryUtil.encodeQuery(url, CharsetUtil.UTF_8);
// 输出:http://www.example.com/search?keyword=%E6%B5%8B%E8%AF%95&page=1
// 仅编码查询字符串部分
String params = "keyword=测试&page=1";
String encodedParams = UrlQueryUtil.encodeQuery(params, CharsetUtil.UTF_8);
// 输出:keyword=%E6%B5%8B%E8%AF%95&page=1
# 标准化查询字符串
String params = "key1=value1&key2=&key3=value3";
String normalized = UrlQueryUtil.normalizeQuery(params, CharsetUtil.UTF_8);
// 输出:key1=value1&key2=&key3=value3
// 处理不规范的查询字符串
String messyParams = " key1 = value 1 & key2= & &key3=value3&";
String normalizedMessy = UrlQueryUtil.normalizeQuery(messyParams, CharsetUtil.UTF_8);
// 输出:key1=value+1&key2=&key3=value3
# 解析URL查询字符串为Map
// 解析查询字符串
String params = "key1=value1&key2=&key3=value3";
Map<String, String> paramMap = UrlQueryUtil.decodeQuery(params, CharsetUtil.UTF_8);
// 输出:{key1=value1, key2=, key3=value3}
// 解析带URL的查询字符串
String url = "http://www.example.com/search?keyword=测试&page=1";
Map<String, String> urlParamMap = UrlQueryUtil.decodeQuery(url, CharsetUtil.UTF_8);
// 输出:{keyword=测试, page=1}
# 解析URL查询字符串为带List的Map(支持重复键)
// 解析包含重复键的查询字符串
String params = "key1=value1&key1=value2&key2=value3";
Map<String, List<String>> paramMap = UrlQueryUtil.decodeQueryList(params, CharsetUtil.UTF_8);
// 输出:{key1=[value1, value2], key2=[value3]}
// 获取重复键的值列表
List<String> key1Values = paramMap.get("key1");
// 输出:[value1, value2]
# 处理特殊字符
// 处理包含特殊字符的参数
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("keyword", "特殊字符:!@#$%^&*()_+");
paramMap.put("url", "http://www.example.com");
String query = UrlQueryUtil.toQuery(paramMap);
// 输出:keyword=%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%EF%BC%9A%21%40%23%24%25%5E%26%2A%28%29_%2B&url=http%3A%2F%2Fwww.example.com
// 解析包含特殊字符的查询字符串
Map<String, String> decodedMap = UrlQueryUtil.decodeQuery(query, CharsetUtil.UTF_8);
// 输出:{keyword=特殊字符:!@#$%^&*()_+, url=http://www.example.com}