用于在查询之前从String解析带有片段的URI的库

时间:2019-01-18 15:58:32

标签: java uri

是否存在一个可以将片段和查询从String解析为URI的库,即使字符串中的片段和查询顺序不正确?

import java.net.URI;

public class UriTest {

    public static void main(String[] args){

        String validUriString = "http://localhost:4200/?name=value#/fragment";
        String invalidUriString = "http://localhost:4200/#/fragment?name=value";

        URI validUri = URI.create(validUriString);
        URI invalidUri = URI.create(invalidUriString);

        System.out.println("OK:     "+validUri.getFragment());
        System.out.println("OK:     "+validUri.getQuery()+"\n");
        System.out.println("NOT OK: "+invalidUri.getFragment());
        System.out.println("NOT OK: "+invalidUri.getQuery());
    }
}

输出:

OK:     /fragment
OK:     name=value

NOT OK: /fragment?name=value
NOT OK: null

在两种情况下都能获得相同的结果将是很好的事情。

1 个答案:

答案 0 :(得分:0)

不能保证这对于所有URL都适用,但是您可以尝试检查URL是否损坏并按如下所示进行修复:

...

public static String fixUrl(String url) {

    int fragmentIndex = url.indexOf("#");
    int queryIndex = url.indexOf("?");

    if(fragmentIndex < queryIndex && fragmentIndex > -1) 
        return url.substring(0,fragmentIndex) + url.substring(queryIndex) + url.substring(fragmentIndex, queryIndex);
    else 
        return url;

}

public static void main (String[] args) {

    String validUriString = "http://localhost:4200/?name=value#/fragment";
    String invalidUriString = "http://localhost:4200/#/fragment?name=value";


    URI validUri = URI.create(fixUrl(validUriString));
    URI invalidUri = URI.create(fixUrl(invalidUriString));

    System.out.println("OK:     "+validUri.getFragment());
    System.out.println("OK:     "+validUri.getQuery()+"\n");
    System.out.println("OK: "+invalidUri.getFragment());
    System.out.println("OK: "+invalidUri.getQuery());

}