:::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=1
http://www.baidu.com?ruleType=1
http://www.baidu.com?ruleType=1
http://www.baidu.com?ruleType=1
http://www.baidu.com?&ruleType=1
http://www.baidu.com?ruleType=1
http://www.baidu.com?ss=1&ruleType=1
http://www.baidu.com?ss=1&ruleType=1
http://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=c
b
比如下面这样用
private String buildProductUrl(String mainDomain, String handle) {
// 构建 url path,以 /product 先构建一个基础的 path
final 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();
}