有没有正确的方法来构建URL?

在我使用的大部分代码中都有可怕的东西,比如:

String url = "../Somewhere/SomeServlet?method=AMethod&id="+object.getSomething()+ "&aParam="+object.getSomethingElse()); 

或者 – 更糟糕的是:

 String url = "Somewhere/Here/Something.jsp?path="+aFile.toString().replace("\\","/")+ "&aParam="+object.getSomethingElse()); 

有没有正确的方法:

  1. 创建一个新URL(或者它是一个URI)。
  2. 向其添加正确的转义参数。
  3. 在这些参数中添加格式良好的文件路径。
  4. 将其解析为String。

从本质上讲 – 构建字符串要比正确地完成它太容易了。 有没有办法正确地做到这一点就像建立字符串一样简单?

添加

为了清楚起见 – 经过一番思考 – 我想我正在寻找类似的东西:

 String s = new MyThing() .setPlace("Somewhere/Something.jsp") .addParameter(aName,aValue) .addParameter(aName,aFile) .toString(); 

因此,它将处理转义的所有不愉快,并添加“?”/“&”并将“\”更改为“/”而不是使用“\”作为文件等。

如果我必须自己编写一个(即如果Apache不是一个选项),那么有真正的Java技术可以正确地转义各个部分。 我的意思是在参数中将“”转换为“”。 而在其他地方逃避“%20”。

我已经写完了,您可以在需要额外function的地方进行更改。 它不使用任何外部资源,如果我查看过某些内容,请告诉我!

它基本上是URI类的包装器,允许您更轻松地将子目录和参数添加到URI。 如果您对某些内容不感兴趣,可以设置默认值。

编辑:我添加了一个使用相对URI的选项(根据您的问题)。

 public class Test { public static void main(String[] args) throws URISyntaxException, MalformedURLException { URLBuilder urlb = new URLBuilder("www.example.com"); urlb.setConnectionType("http"); urlb.addSubfolder("somesub"); urlb.addSubfolder("anothersub"); urlb.addParameter("param lol", "unknown"); urlb.addParameter("paramY", "known"); String url = urlb.getURL(); System.out.println(url); urlb = new URLBuilder(); urlb.addSubfolder("servlet"); urlb.addSubfolder("jsp"); urlb.addSubfolder("somesub"); urlb.addSubfolder("anothersub"); urlb.addParameter("param lol", "unknown"); urlb.addParameter("paramY", "known"); String relUrl = urlb.getRelativeURL(); System.out.println(relUrl); } } class URLBuilder { private StringBuilder folders, params; private String connType, host; void setConnectionType(String conn) { connType = conn; } URLBuilder(){ folders = new StringBuilder(); params = new StringBuilder(); } URLBuilder(String host) { this(); this.host = host; } void addSubfolder(String folder) { folders.append("/"); folders.append(folder); } void addParameter(String parameter, String value) { if(params.toString().length() > 0){params.append("&");} params.append(parameter); params.append("="); params.append(value); } String getURL() throws URISyntaxException, MalformedURLException { URI uri = new URI(connType, host, folders.toString(), params.toString(), null); return uri.toURL().toString(); } String getRelativeURL() throws URISyntaxException, MalformedURLException{ URI uri = new URI(null, null, folders.toString(), params.toString(), null); return uri.toString(); } } 

输出:

绝对

http://www.example.com/somesub/anothersub?param%20lol=unknown&paramY=known

相对的

/ servlet的/ JSP / somesub / anothersub?PARAM%20lol =未知&paramY =已知

您可以使用Apache URIBuilder

示例代码: 完整的Apache示例

 URIBuilder builder = new URIBuilder() .setScheme("http") .setHost("apache.org") .setPath("/shindig") .addParameter("hello world", "foo&bar") .setFragment("foo"); builder.toString(); 

输出: http : //apache.org/shindig?hello + world = foo%26bar#foo

您也可以使用spring UriComponentsBuilder

 UriComponentsBuilder .fromUriString(baseUrl) .queryParam("name", name) .queryParam("surname", surname) .build().toUriString(); 

我喜欢@Jeroen的建议,但它并不是我想要的所有,使用他的想法收集部分,然后使用URI来增长最终结果我把这个解决方案放在一起似乎做我想要的:

 public class URLBuilder { // The scheme - http private String scheme = null; // The user - user private String user = null; // The host - example.com private String host = null; // The port - 8080 private int port = -1; // The paths - /Path/To/Somewhere/index.jsp private final ArrayList paths = new ArrayList(); // The parameters - ?a=b&c=d private final ArrayList> queries = new ArrayList>(); // The fragment - #n private String fragment = null; public URLBuilder addQuery(String name, String value) { queries.add(new Pair(name, value)); return this; } public URLBuilder addQuery(String name, long value) { addQuery(name, String.valueOf(value)); return this; } public URLBuilder addQuery(String name, File file) { addQuery(name, file.toURI().getPath()); return this; } public URLBuilder addPath(String path) { paths.add(path); return this; } @Override public String toString() { // Build the path. StringBuilder path = new StringBuilder(); for (String p : paths) { path.append("/").append(p); } // Build the query. StringBuilder query = new StringBuilder(); String sep = ""; for (Pair p : queries) { query.append(sep).append(pp).append("=").append(pq); sep = "&"; } String url = null; try { URI uri = new URI( scheme, user, host, port, path.length() > 0 ? path.toString() : null, query.length() > 0 ? query.toString() : null, fragment); url = uri.toString(); } catch (URISyntaxException ex) { Logger.getLogger(URLBuilder.class.getName()).log(Level.SEVERE, null, ex); } return url; } /** * @param host the host to set * @return this */ public URLBuilder setHost(String host) { this.host = host; return this; } /** * @param scheme the scheme to set * @return this */ public URLBuilder setScheme(String scheme) { this.scheme = scheme; return this; } /** * @param user the user to set * @return this */ public URLBuilder setUser(String user) { this.user = user; return this; } /** * @param port the port to set * @return this */ public URLBuilder setPort(int port) { this.port = port; return this; } /** * @param fragment the fragment to set * @return this */ public URLBuilder setFragment(String fragment) { this.fragment = fragment; return this; } public static void main(String args[]) { try { URLBuilder url = new URLBuilder(); System.out.println(url.toString()); url.setFragment("fragment"); System.out.println(url.toString()); url.setHost("host.com"); System.out.println(url.toString()); url.addPath("APath"); System.out.println(url.toString()); url.addPath("AnotherPath"); System.out.println(url.toString()); url.addQuery("query1", "param1"); System.out.println(url.toString()); url.addQuery("query 2", "param 2"); System.out.println(url.toString()); url.addQuery("file", new File("Hello World.txt")); System.out.println(url.toString()); } catch (Throwable t) { t.printStackTrace(System.err); } } } 

Recomendations

 private final String BASE_URL = Properties.getProperty("base-url"); private Map propertiesMap; // = new HashMap(); 

并在代码中构建URL。

 public String buildURL(){ StringBuilder builder = new StringBuilder(); builder.append(BASE_URL); //for each property, append it return builder.toString(); }