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

Old*_*eon 30 java url uri

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

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

或者 - 更糟糕的是:

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

有没有正确的方法:

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

从本质上讲 - 构建字符串要比正确地完成字符串要容易得多.有没有办法正确地做到这一点就像建立字符串一样简单?

添加

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

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

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

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

Bar*_*run 24

您可以使用Apache URIBuilder

示例代码:完整的Apache示例

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

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

  • 它是`URIBuilder`,而不是`UriBuilder`。最后一个 URL 无效,我会删除指向该示例的链接。 (3认同)

Mar*_*zak 12

您也可以使用spring UriComponentsBuilder

UriComponentsBuilder
    .fromUriString(baseUrl)
    .queryParam("name", name)
    .queryParam("surname", surname)
    .build().toUriString();
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这不会对每个查询参数进行编码,因此您需要手动进行 /sf/answers/1488143541/ (3认同)
  • @SanghyunLee:相反,您可以按照 https://www.baeldung.com/spring-uricomponentsbuilder 并使用 .build().encode().toUriString() 。 (3认同)

Jer*_*vel 9

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

它基本上是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();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

绝对

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

相对的

/ servlet的/ JSP/somesub/anothersub?PARAM%20lol =未知¶mY =已知

  • 这是不正确的,因为它不会转义参数或路径! (6认同)