URI创建工具类

SpringMVC作为一个Web层框架避免不了要处理各种URI,因此提供了一个很方便的UriComponents用于处理URI拼接、替换、编码等操作。UriComponents的用法非常直观,这里我们直接通过几个例子进行演示。

构造URI

下面例子我们通过UriComponents工具类构造了一个HTTPS协议的URI。

package com.gacfox.demo;

import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;

public class Main {
    public static void main(String[] args) {
        // 构造UriComponents对象
        UriComponents uriComponents =
                UriComponentsBuilder.newInstance()
                        .scheme("https")
                        .host("google.com")
                        .port(443)
                        .path("/search")
                        .queryParam("q", "美女")
                        .build();
        // 输出为字符串
        String uri = uriComponents.encode().toString();
        System.out.println(uri);
    }
}

输出结果:

https://google.com:443/search?q=%E7%BE%8E%E5%A5%B3

上面代码中,我们通过UriComponentsBuilder构造了一个URI并在URL编码后将其输出为字符串。通常来说URI的Schema和Host是必须指定的(虽然UriComponentsBuilder并不要求你这样做),此外上面代码Port实际我们也可以不指定,因为HTTPS默认端口就是443。

解析URI

如果说构造URI我们还能用字符串拼接的方式勉强实现,那用正则表达式解析URI可就比较麻烦了。SpringMVC的UriComponents对象直接提供了URI解析功能,使用起来非常方便,我们直接看一个例子。

package com.gacfox.demo;

import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

public class Main {
    public static void main(String[] args) throws UnsupportedEncodingException {
        // 解码URI
        String uri = "https://google.com/search?q=%E7%BE%8E%E5%A5%B3";
        uri = URLDecoder.decode(uri, "UTF-8");
        // 从字符串构造UriComponents对象
        UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl(uri).build();
        // 解析各种信息
        System.out.println(uriComponents.getScheme());
        System.out.println(uriComponents.getHost());
        System.out.println(uriComponents.getPort());
        System.out.println(uriComponents.getPath());
        System.out.println(uriComponents.getQueryParams());
    }
}

输出结果:

https
google.com
-1
/search
{q=[美女]}

上面代码中我们首先将URI从编码状态还原,然后使用fromHttpUrl()方法来构造UriComponents对象,最后调用其中的各种get方法获取我们需要的信息。注意这里由于原URI字符串中我们没有明确写端口,因此getPort()方法返回的是-1

注意:这里我们使用的fromHttpUrl()方法仅支持HTTP或HTTPS协议,如果URI字符串的Schema为其它协议如FTP等会抛出异常。如果需要支持其他协议,可以更换为fromUriString()方法,这个方法能解析任何符合URI格式的字符串,不再限制协议为HTTP或HTTPS。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap