`

URI和URL的区别

阅读更多

这两天在写代码的时候,由于涉及到资源的位置,因此,需要在Java Bean中定义一些字段,用来表示资源的位置,比如:imgUrl,logoUri等等。但是,每次定义的时候,心里都很纠结,是该用imgUrl还是imgUri呢?

同样的,另外一个问题:String HttpServletRequest.getRequestURI();和StringBuffer HttpServletRequest.getRequestURL();返回的内容有何不同?为什么会如此?

带着这些问题到网上去搜了下,没发现让自己看了明白的解释,于是,想到了Java类库里有两个对应的类java.net.URI和java.net.URL,终于,在这两个类里的javadoc里找到了答案。

URIs, URLs, and URNs

首先,URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源。而URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。而 URN,uniform resource name,统一资源命名,是通过名字来标识资源,比如mailto:java-net@java.sun.com。也就是说,URI是以一种抽象的,高层 次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。

在Java的URI中,一个URI实例可以代表绝对的,也可以是相对的,只要它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因此它不能是相对的,schema必须被指定。

ok,现在回答文章开头提出的问题,到底是imgUrl好呢,还是imgUri好?显然,如果说imgUri是肯定没问题的,因为即使它实际上是 url,那它也是uri的一种。那么用imgUrl有没有问题呢?此时则要看它的可能取值,如果是绝对路径,能够定位的,那么用imgUrl是没问题的, 而如果是相对路径,那还是不要用ImgUrl的好。总之,用imgUri是肯定没问题的,而用imgUrl则要视实际情况而定。

第二个,从HttpServletRequest的javadoc中可以看出,getRequestURI返回一个String,“the part of this request’s URL from the protocol name up to the query string in the first line of the HTTP request”,比如“POST /some/path.html?a=b HTTP/1.1”,则返回的值为”/some/path.html”。现在可以明白为什么是getRequestURI而不是 getRequestURL了,因为此处返回的是相对的路径。而getRequestURL返回一个StringBuffer,“The returned URL contains a protocol, server name, port number, and server path, but it does not include query string parameters.”,完整的请求资源路径,不包括querystring。

总结一下:URL是一种具体的URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。URI是一种语义上的抽象概念,可以是绝对的,也可以是 相对的,而URL则必须提供足够的信息来定位,所以,是绝对的,而通常说的relative URL,则是针对另一个absolute URL,本质上还是绝对的。

注:这里的绝对(absolute)是指包含scheme,而相对(relative)则不包含scheme。

URI抽象结构     [scheme:]scheme-specific-part[#fragment]

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

authority为[user-info@]host[:port]

参考资料:

http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URI.html

http://en.wikipedia.org/wiki/Uniform_Resource_Identifier

http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpServletRequest.html

ps:

java.net.URL类不提供对标准RFC2396规定的特殊字符的转义,因此需要调用者自己对URL各组成部分进行encode。而 java.net.URI则会提供转义功能。因此The recommended way  to manage the encoding and decoding of URLs is to use  java.net.URI. 可以使用URI.toURL()和URL.toURI()方法来对两个类型的对象互相转换。对于HTML FORM的url encode/decode可以使用java.net.URLEncoder和java.net.URLDecoder来完成,但是对URL对象不适用。

 

原文链接:

http://www.cnblogs.com/gaojing/archive/2012/02/04/2413626.html

分享到:
评论

相关推荐

    URI和URL区别 .

    在探讨“URI和URL区别”这一主题时,我们首先需要明确这两个概念的基本定义与功能,进而深入理解它们之间的差异以及在互联网技术中的具体应用。URI(Uniform Resource Identifier,统一资源标识符)和URL(Uniform ...

    URI,URL常识

    ### URI与URL的基础概念 #### 一、URI(Uniform ...- **总结**:在日常使用中,人们经常将URL和URI这两个术语互换使用,但在技术上,它们有着明确的区别。理解这些概念对于正确地使用和构建互联网资源至关重要。

    Boost.URL是一个用于操作统一资源标识符(URI)和定位器(URL)的库。.zip

    Boost.URL库是C++编程语言中的一个开源工具,专门设计用于处理和操作统一资源标识符(URI)和统一资源定位器(URL)。这个库提供了一套全面且强大的API,允许开发者高效、安全地进行URL解析、构建、修改以及验证等...

    关于URI和URN,URL和java中对应的类.docx

    URI、URL和URN之间的关系是:URI是顶层概念,包括了URL和URN。URL是URI的一种具体形式,用于提供资源的访问途径,而URN则提供了一个永久性的名字,即使资源的物理位置改变,依然可以通过URN找到资源。 在Java中,...

    关于URI和URN,URL和java中对应的类.pdf

    在Java中,URI和URL被分别封装在`java.net.URI`和`java.net.URL`类中。URI 类是一个抽象的概念,主要用于解析和表示URI,但不涉及网络访问。它支持相对URI,并且更加符合相关规范。而URL类则更偏向于实际的网络操作...

    URI、URL和URN之间的区别与联系

    有两种形式: URL:目前URI的最普遍形式就是无处不在的URL或统一资源定位器。 URN:URL的一种更新形式,统一资源名称(URN, Uniform Resource Name)不依赖于位置,并且有可能减少失效连接的个数。但是其流行还需...

    解析URI与URL之间的区别与联系

    URI(Uniform Resource Identifier)和URL(Uniform Resource Locator)是互联网上资源定位的两种重要概念。它们虽然在功能上有所重叠,但有着明确的区别。 首先,URI,统一资源标志符,是一个抽象的概念,用于唯一...

    URL和URI使用指南

    ### URL和URI使用指南 #### 一、引言 在当今互联网时代,了解如何通过URL(Uniform Resource Locator,统一资源定位符)和URI(Uniform Resource Identifier,统一资源标识符)来获取网络上的数据至关重要。本指南...

    Uri一个URI处理库

    - **创建和解析URI**:Uri库允许通过字符串或数组创建URI实例,并能解析出各个部分,如scheme(协议)、authority(授权部分,包括用户信息、主机和端口)、path(路径)、query(查询字符串)和fragment(片段...

    REST URI(URL是其子类)命名规范.zip_子类构造方法

    URL(统一资源定位符)是URI的一个子类,主要用于定位网络资源。 1. **URI中不应包含动词** 在RESTful设计中,URI应该代表资源,而不是操作。动词通常属于HTTP方法(GET、POST、PUT、DELETE等)。例如,一个错误的...

    01_01_URI和URL.mp4

    java

    uriparser-0.7.7.zip

    `uriparser` 是一个开源的URI(统一资源标识符)解析库,广泛应用于软件开发,尤其是网络爬虫...同时,由于`uriparser`遵循了标准,所以它在处理不同格式和结构的URL时表现得更加可靠,减少了因URL解析问题引发的错误。

    C#利用System.Uri转URL为绝对地址的方法

    System.Uri类也提供了这些功能,如`Uri.EscapeDataString()`和`Uri.UnescapeDataString()`方法用于URL编码和解码,以及`Uri.IsLoopback`、`Uri.HostNameType`等属性用于判断URL的特性。 总的来说,通过System.Uri类...

    对比两个uri是否一致,对比两个url是否一致

    对比两个url是否一致,对比两个URL是否一致,包括端口,方法等,非常好用

    react-native-svg-uri, 在来自URL或者 static 文件的本地响应中,呈现SVG图像.zip

    react-native-svg-uri, 在来自URL或者 static 文件的本地响应中,呈现SVG图像 react-native-svg-uri从URL或者 static 文件中呈现来自React的SVG图像这是用 rn 0.33和 react-native-svg 4.3.1 ( 依赖于此库) react-...

    博客《Uri详解之——Uri结构与代码提取》对应源码

    例如,使用`Uri.withAppendedPath()`添加路径,使用`Uri.encode()`和`Uri.decode()`进行URL编码解码。 7. **文件Uri与安全问题**: 文件Uri通常以`file:`开头,直接访问可能导致安全问题,例如文件权限泄露。因此...

    .net c#URL加密

    4. URL解密:解密过程与加密相反,首先使用Uri.UnescapeDataString解码Base64字符串,然后使用相同的密钥和IV进行解密。 四、安全注意事项 1. 密钥管理:密钥和初始化向量(IV)必须安全存储,避免被泄露。可以...

    PHP获取当前url路径的函数及服务器变量QUERY_STRING、REQUEST_URI

    $temp = urldecode($_SERVER['REQUEST_URI']); if (strexists($temp, ') || strexists($temp, '"')) { $_GET = htmlspecialchars($_GET); // XSS防护 } } ``` 3. **其他相关变量**: - `$_SERVER['DOCUMENT_...

Global site tag (gtag.js) - Google Analytics