:::tips 推荐使用 Spring 中的 URI Links 系列工具 :::
URL 参数追加工具类 - 手动实现
完全是为了能在给定的任意不规范的 url 中追加 get 参数而写;
此方式完全使用 字符串相关查找等 API 实现
public class UrlParamsUtil {public static final String QMARK = "?";public static final String PARAMS_DELIMITER = "&";public static String appendParamsToUrl(String url, String params) {boolean urlFlag = url.lastIndexOf(QMARK) != -1;boolean paramsFlag = params.indexOf(QMARK) != -1;// 都有问号if (urlFlag && paramsFlag) {String subParams = params.substring(1);if (!url.endsWith(QMARK)) {if (subParams.startsWith(PARAMS_DELIMITER)) {return url + subParams;} else {return url + PARAMS_DELIMITER + subParams;}}return url + subParams;}// 都没有问号if (!urlFlag && !paramsFlag) {if (params.startsWith(PARAMS_DELIMITER)) {params = params.substring(1);}return url + QMARK + params;}// 其中一方有问号if (urlFlag && !url.endsWith(QMARK)) {if (!params.startsWith(PARAMS_DELIMITER)) {return url + PARAMS_DELIMITER + params;}}return url + params;}public static void main(String[] args) {System.out.println(appendParamsToUrl("http://www.baidu.com", "?ruleType=1"));System.out.println(appendParamsToUrl("http://www.baidu.com", "&ruleType=1"));System.out.println(appendParamsToUrl("http://www.baidu.com", "ruleType=1"));System.out.println(appendParamsToUrl("http://www.baidu.com?", "?ruleType=1"));System.out.println(appendParamsToUrl("http://www.baidu.com?", "&ruleType=1"));System.out.println(appendParamsToUrl("http://www.baidu.com?", "ruleType=1"));System.out.println(appendParamsToUrl("http://www.baidu.com?ss=1", "?ruleType=1"));System.out.println(appendParamsToUrl("http://www.baidu.com?ss=1", "&ruleType=1"));System.out.println(appendParamsToUrl("http://www.baidu.com?ss=1", "ruleType=1"));}}
测试结果如下
http://www.baidu.com?ruleType=1http://www.baidu.com?ruleType=1http://www.baidu.com?ruleType=1http://www.baidu.com?ruleType=1http://www.baidu.com?&ruleType=1http://www.baidu.com?ruleType=1http://www.baidu.com?ss=1&ruleType=1http://www.baidu.com?ss=1&ruleType=1http://www.baidu.com?ss=1&ruleType=1
hutool 的 UrlBuilder 类
官方文档:此类确实感觉比较强大
import cn.hutool.core.net.url.UrlBuilder;import cn.hutool.core.net.url.UrlQuery;import cn.hutool.core.util.CharsetUtil;public class Demo {public static void main(String[] args) {UrlBuilder builder = UrlBuilder.ofHttp("www.hutool.cn/aaa/bbb/?", CharsetUtil.CHARSET_UTF_8);builder.addQuery("a", "b");builder.addQuery("c", "c");System.out.println(builder.build());final UrlQuery query = builder.getQuery();System.out.println(query.get("a"));}}
测试信息
http://www.hutool.cn/aaa/bbb/?a=b&c=cb
比如下面这样用
private String buildProductUrl(String mainDomain, String handle) {// 构建 url path,以 /product 先构建一个基础的 pathfinal UrlPath urlPath = UrlPath.of("/product", CharsetUtil.CHARSET_UTF_8);urlPath.add(handle); // 在 /product 的基础上增加一个路径,比如 /xxx 或则 bbbb, 工具会自动处理边界的 / 符号return UrlBuilder.create().setHost("https").setHost(mainDomain) // 设置域名,如 mrcode.cn.setPath(urlPath).build();}
