Java笔记-URL和URI的不同

URI和URL

从URI和URL的定义就可以知道他们之间的区别

统一资源标识符(Uniform Resouce Identifier):一串连续的字符串可以识别所有抽象或真实的资源。

统一资源定位符(Uniform Resouce Locator):URI的子集,用于访问可用的资源。

 

语法

URI都遵守下面的语法:

scheme:[//authority][/path][?query][#fragment]

每一部分的解析如下:

scheme:对于URL这是一个访问资源的协议头,对于URI是一个名称,这个名称是scheme分配的标识。

authority:可选项,代表用户的信息,如一个主机或其端口。

path:确定资源的范围。

query:附加的数据,用于识别资源。对于URL它是查询字符串。

fragment:可选,代表查询资源的一部分。

 

URL的scheme需要从下面这些进行选着:

ftp, http, https, gopher, mailto, news, nntp, telnet, wais, file, propero

如果URL的scheme不是上面这几个,那么就不是URL。

下面的例子中,全部都是URI,前3个是URL。

ftp://ftp.is.co.za/rfc/rfc1808.txt
https://tools.ietf.org/html/rfc3986
mailto:john@doe.com

tel:+1-816-555-1212
urn:oasis:names:docbook:dtd:xml:4.1
urn:isbn:1234567890

URI和URL在Java中的不同

首先来看下URI和URL的构造,这里要注意,只有URI的构造函数可以填写上面语法的所有部分。URL构造函数只能填写一部分。

 @Test
    public void whenCreatingURIs_thenSameInfo() throws Exception{


        URI firstURI = new URI(
                "someScheme://theUser:thePassowrd@someAuthority:80"
                + "/some/path?theQuery#someFragment"
        );

        URI secondURI = new URI(
                "someScheme",
                "theUser:thePassword",
                "someAuthority",
                80,
                "/some/path",
                "theQuery",
                "someFragment"
        );

        logger.info("firstURI.getScheme():" + firstURI.getScheme());
        logger.info("secondURI.getScheme():" + secondURI.getScheme());
        logger.info("firstURI.getPath():" + firstURI.getPath());
        logger.info("secondURI.getPath():" + secondURI.getPath());
    }

    @Test
    public void whenCreatingURLs_thenSameInfo() throws Exception{

        URL firstURL = new URL(
                "http://theUser:thePassword@someHost:80"
                + "/path/to/file?theQuery#someFragment"
        );

        URL secondURL = new URL(
                "http",
                "someHost",
                80,
                "/path/to/file"
        );

        logger.info("firstURL.getHost():" + firstURL.getHost());
        logger.info("secondURL.getHost():" + secondURL.getHost());
        logger.info("firstURL.getPath():" + firstURL.getPath());
        logger.info("secondURL.getPath():" + secondURL.getPath());
    }

URI还提供了一个创造实例的方法,这个方法不会抛出异常:

    @Test
    public void whenCreatingURI_theCorrect(){

        URI uri = URI.create("urn:isbn:1234567890");
        System.out.println("over");
    }

下面是URL中使用其他的scheme,会抛出异常

    @Test
    public void whenCreatingURLs_thenException() throws Exception{

        URL theURL = new URL("otherProtocol://someHost/path/to/file");
        System.out.println("over");
    }

下面是URI和URL之间的转换

代码如下:

    @Test
    public void givenObjects_whenConverting_thenCorrect() throws MalformedURLException, URISyntaxException {

        String aURIString = "http://someHost:80/path?theQuery";
        URI uri = new URI(aURIString);
        URL url = new URL(aURIString);

        URL toURL = uri.toURL();
        URI toURI = url.toURI();

        System.out.println("over");
    }

下面是scheme不是文章一开始描述的那几种,然后转换会抛出异常:

   @Test
    public void givenURI_whenConvertingToURL_thenException() throws MalformedURLException, URISyntaxException{

        URI uri = new URI("someScheme://someAuthority/path?theQuery");
        URL url = uri.toURL();
        System.out.println("over");
    }

URL还可以远程直接拿资源:

@Test
public void givenURL_whenGettingContents_thenCorrect()
  throws MalformedURLException, IOException {
    URL url = new URL("http://courses.baeldung.com");
    
    String contents = IOUtils.toString(url.openStream());

    assertTrue(contents.contains("<!DOCTYPE html>"));
}

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页