视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
URL和URI的有什么区别
2020-11-27 15:28:34 责编:小采
文档
 初学http协议,就被这两个相似的术语搞蒙了,查了很多资料,总算搞清楚了。(找资料还是英文啊,靠谱。。)。

一直存在很多技术上的争论,其中最为妙的恐怕就是web地址应该叫什么的问题。通常情况就是这样:有人把地址栏的内容叫“URL”,这时候有些人就来劲了:“不!其实那时URI。。”

对于这种纠正的反应呢,通常也有这么几种情况,心眼小的就寻思这人赶紧走吧,淡定点的就耸耸肩表示同意,火气大的就拔刀相向了好不?

那这篇文章呢,就对这个只是提供一个简单的总结,毕竟互黑也要黑到点子上是吧。

URI,URL,URN

从上面的那幅图可以看出来,一共有三个不同的概念URI,URL,URN。这讨论这样的问题时,最好的方法就是回到原点啊,这里我们在RFC 3986: Uniform Resource Identifier (URI): Generic Syntax里面收集了点资料:

“A Uniform Resource Identifier (URI) 是一个紧凑的字符串用来标示抽象或物理资源。”

“A URI 可以进一步被分为定位符、名字或两者都是. 术语“Uniform Resource Locator” (URL) 是URI的子集, 除了确定一个资源,还提供一种定位该资源的主要访问机制(如其网络“位置”)。“

那我们无所不知的维基百科把这段消化的很好,并描述的更加形象了:

“URI可以分为URL,URN或同时具备locators 和names特性的一个东西。URN作用就好像一个人的名字,URL就像一个人的地址。换句话说:URN确定了东西的身份,URL提供了找到它的方式。”

通过这些描述我们可以得到一些结论:

  • 首先,URL是URI的一种(通过那个图就看的出来吧)。所以有人跟你说URL不是URI,他就错了呗。但也不是所有的URI都是URL哦,就好像蝴蝶都会飞,但会飞的可不都是蝴蝶啊,你让苍蝇怎么想!

  • 让URI能成为URL的当然就是那个“访问机制”,“网络位置”。e.g. http:// or ftp://.。

  • URN是唯一标识的一部分,就是一个特殊的名字。

  •   下面就来看看例子吧,当来也是来自权威的RFC:

  • ftp://ftp.is.co.za/rfc/rfc1808.txt (also a URL because of the protocol)

  • http://www.ietf.org/rfc/rfc2396.txt (also a URL because of the protocol)

  • ldap://[2001:db8::7]/c=GB?objectClass?one (also a URL because of the protocol)

  • mailto:John.Doe@example.com (also a URL because of the protocol)

  • news:comp.infosystems.www.servers.unix (also a URL because of the protocol)

  • tel:+1-816-555-1212

  • telnet://192.0.2.16:80/ (also a URL because of the protocol)

  • urn:oasis:names:specification:docbook:dtd:xml:4.1.2

  •   这些全都是URI, 其中有些事URL. 哪些? 就是那些提供了访问机制的.

    总结

    下面到了回答问题的时候了:

    当我们替代web地址的时候,URI和URL那个更准确?

    基于我读的很多的文章,包括RFC,我想说URI更准确。

    别急,我有我的理由:

    我们经常使用的URI不是严格技术意义上的URL。例如:你需要的文件在files.hp.com. 这是URI,但不是URL–系统可能会对很多协议和端口都做出正

    确的反应。

    #######################################3

    Java中获取一个浏览器访问地址信息

    3 request
     * request对象,tomcat根据http协议的请求的内容,将相应的数据封装到request对象中。
     * request和response必须是成对出现,先有的request,再有的response
     * 接口:javax.servlet.http.HttpServletRequest extends javax.servlet.ServletRequest
     * 实现类:tomcat实现,并在请求时,tomcat创建 。
     * 请求行
     * 入口:http://localhost:8080/day05/demo/pathRequestServlet?username=jack&password=1234
     * 请求方式
     request.getMethod();
     * 路径
     // * 请求资源路径
     // 1 获得servlet路径,web.xml配置的url-pattern【★★★】
     String servletPath = request.getServletPath();
     System.out.println(" 1 servletPath -->" + servletPath); //--> /demo/pathRequestServlet
    
     //2 获得发布到tomcat时的项目名称【★★★】
     String contextPath = request.getContextPath();
     System.out.println(" 2 contextPath -->" + contextPath); //--> /day05
    
     //3 获得请求行中的资源路径
     String requestURI = request.getRequestURI();
     System.out.println(" 3 requestURI -->" + requestURI);//-->/day05/demo/pathRequestServlet
    
     //4 获得请求URL(地址栏书写)
     String requestURL = request.getRequestURL().toString();
     System.out.println(" 4 requestURL -->" + requestURL);//-->http://localhost:8080/day05/demo/pathRequestServlet
     // *** 以上都不获得get请求的参数
    
     //5 获得get请求的参数,获得的是所有参数的一个字符串
     String queryString = request.getQueryString();
     System.out.println(" 5 queryString -->" + queryString); //-->username=jack&password=1234
    
     * 协议
     request.getProtocol();
     * 请求头
     * java.lang.String getHeader(java.lang.String name) 获得指定名称的头信息(一条)【★★★】
     * long getDateHeader(java.lang.String name) 获得特殊数据,时间
     * int getIntHeader(java.lang.String name) 获得特殊数据,整型
     * java.util.Enumeration getHeaderNames() 获得所有的请求头的名称
     * java.util.Enumeration getHeaders(java.lang.String name) 获得指定名称头的所有内容
     * 实例:防盗链,(不能直接访问 /refererTwoServlet)
     * 请求体
     * ServletInputStream getInputStream() 获得请求体的所有内容。(之后讲,文件上传)
    
     * 核心API
     * 属性操作
     * xxxAttribute (set / get / remove) 服务器端【★★★】
     * 获得参数
     * 获得浏览器 发送给 服务器端的参数(Parameter)
     * API【★★★】
     * 实例:url?username=jack&username=rose&username=tom&password=1234
     * getParameter(java.lang.String name) 获得指定参数的第一个值,如果数据不存在获得null 。
     * 例如:getParameter("username") 获得 jack
     * java.lang.String[] getParameterValues(java.lang.String name) 获得指定参数的所有的值。
     * 例如:getParameterValues("username") ,获得[jack,rose,tom]
     * java.util.Map<String,String[]> getParameterMap() 获得所有的内容,key 参数的名称 ,value 该参数的所有的值
     * 例如:{username=[jack,rose,tom],password=[1234]}
     * 中文乱码
     * POST请求【★★★】
     * 设置 setCharacterEncoding(java.lang.String env) ,设置字符编码
     * GET请求
     * new String(username.getBytes("ISO-8859-1"), "字符集");

    下载本文
    显示全文
    专题