我有一个为请求创建URL的函数,如下所示:
public String createUrl(String path, String filename) {
return new StringBuilder(path).append("?filename=").append(filename).toString();
}
现在,我想要做的是在URL中添加另一个名为transactionId的参数。一个天真的实现将是:
public String createUrl(String path, String filename,String transactionId) {
return new StringBuilder(path).append("?filename=").append(filename).append("?transactionId=").append(transactionId).toString();
}
或者我可以在某个地方使用静态方法返回transactionID并按如下方式修改代码:
public String createUrl(String path, String filename) {
return new StringBuilder(path).append("?filename=").append(filename).append("?transactionId=").append(TransactionMonitor.getTransactionId()).toString();
}
这两种方法都让我修改了预先存在的代码。有没有一种方法可以用新参数来装饰方法返回的url。此外,如果解决方案是可配置的,那将是很好的。
由于
答案 0 :(得分:4)
您可以创建为您构建网址的UrlBuilder类:
class UrlBuilder {
private String path;
private Map<String, String> parameters = new LinkedHashMap<String, String>();
public UrlBuilder path(String path) {
this.path = path;
return this;
}
public UrlBuilder parameter(String param, String value) {
parameters.add(param, value);
return this;
}
public String build() {
String paramsString = "";
for (Map.Entry<String, String> entry: parameters.entrySet()) {
if (paramsString.isEmpty()) {
paramsString += "?";
}
paramsString += params.getKey() + "=" + params.getValue();
}
return path + paramsString;
}
}
并在您的代码中使用它
new UrlBuilder().path("http://google.com").params("q", "java").build()