:::tips 推荐使用 Spring 中的 URI Links 系列工具 :::

URL 参数追加工具类 - 手动实现

完全是为了能在给定的任意不规范的 url 中追加 get 参数而写;
此方式完全使用 字符串相关查找等 API 实现

  1. public class UrlParamsUtil {
  2. public static final String QMARK = "?";
  3. public static final String PARAMS_DELIMITER = "&";
  4. public static String appendParamsToUrl(String url, String params) {
  5. boolean urlFlag = url.lastIndexOf(QMARK) != -1;
  6. boolean paramsFlag = params.indexOf(QMARK) != -1;
  7. // 都有问号
  8. if (urlFlag && paramsFlag) {
  9. String subParams = params.substring(1);
  10. if (!url.endsWith(QMARK)) {
  11. if (subParams.startsWith(PARAMS_DELIMITER)) {
  12. return url + subParams;
  13. } else {
  14. return url + PARAMS_DELIMITER + subParams;
  15. }
  16. }
  17. return url + subParams;
  18. }
  19. // 都没有问号
  20. if (!urlFlag && !paramsFlag) {
  21. if (params.startsWith(PARAMS_DELIMITER)) {
  22. params = params.substring(1);
  23. }
  24. return url + QMARK + params;
  25. }
  26. // 其中一方有问号
  27. if (urlFlag && !url.endsWith(QMARK)) {
  28. if (!params.startsWith(PARAMS_DELIMITER)) {
  29. return url + PARAMS_DELIMITER + params;
  30. }
  31. }
  32. return url + params;
  33. }
  34. public static void main(String[] args) {
  35. System.out.println(appendParamsToUrl("http://www.baidu.com", "?ruleType=1"));
  36. System.out.println(appendParamsToUrl("http://www.baidu.com", "&ruleType=1"));
  37. System.out.println(appendParamsToUrl("http://www.baidu.com", "ruleType=1"));
  38. System.out.println(appendParamsToUrl("http://www.baidu.com?", "?ruleType=1"));
  39. System.out.println(appendParamsToUrl("http://www.baidu.com?", "&ruleType=1"));
  40. System.out.println(appendParamsToUrl("http://www.baidu.com?", "ruleType=1"));
  41. System.out.println(appendParamsToUrl("http://www.baidu.com?ss=1", "?ruleType=1"));
  42. System.out.println(appendParamsToUrl("http://www.baidu.com?ss=1", "&ruleType=1"));
  43. System.out.println(appendParamsToUrl("http://www.baidu.com?ss=1", "ruleType=1"));
  44. }
  45. }

测试结果如下

  1. http://www.baidu.com?ruleType=1
  2. http://www.baidu.com?ruleType=1
  3. http://www.baidu.com?ruleType=1
  4. http://www.baidu.com?ruleType=1
  5. http://www.baidu.com?&ruleType=1
  6. http://www.baidu.com?ruleType=1
  7. http://www.baidu.com?ss=1&ruleType=1
  8. http://www.baidu.com?ss=1&ruleType=1
  9. http://www.baidu.com?ss=1&ruleType=1

hutool 的 UrlBuilder 类

官方文档:此类确实感觉比较强大

  1. import cn.hutool.core.net.url.UrlBuilder;
  2. import cn.hutool.core.net.url.UrlQuery;
  3. import cn.hutool.core.util.CharsetUtil;
  4. public class Demo {
  5. public static void main(String[] args) {
  6. UrlBuilder builder = UrlBuilder.ofHttp("www.hutool.cn/aaa/bbb/?", CharsetUtil.CHARSET_UTF_8);
  7. builder.addQuery("a", "b");
  8. builder.addQuery("c", "c");
  9. System.out.println(builder.build());
  10. final UrlQuery query = builder.getQuery();
  11. System.out.println(query.get("a"));
  12. }
  13. }

测试信息

  1. http://www.hutool.cn/aaa/bbb/?a=b&c=c
  2. b

比如下面这样用

  1. private String buildProductUrl(String mainDomain, String handle) {
  2. // 构建 url path,以 /product 先构建一个基础的 path
  3. final UrlPath urlPath = UrlPath.of("/product", CharsetUtil.CHARSET_UTF_8);
  4. urlPath.add(handle); // 在 /product 的基础上增加一个路径,比如 /xxx 或则 bbbb, 工具会自动处理边界的 / 符号
  5. return UrlBuilder.create()
  6. .setHost("https")
  7. .setHost(mainDomain) // 设置域名,如 mrcode.cn
  8. .setPath(urlPath)
  9. .build();
  10. }

Spring 的 UriComponents

UriComponents