URI与URL详解

看开源框架经常看到会用到URL或者URI之类的,为什么要熟悉这个呢?

      比如说你写一个网络程序,需要访问资源,资源位置信息最好封装起来,如果使用String表示,虽然可以使用,但是感觉挺low的。你用了URI或者URL,当你想获取这个资源位置信息的某个属性时怎么着也比String方便吧。


1、URI与URL的定义

      URI:统一资源标志符(Uniform Resource Identifier)
      URL:统一资源定位符(uniform resource location)
      说白了, URI与URL都是定位资源位置的,就是表示这个资源的位置信息,就像经纬度一样可以表示你在世界的哪个角落。URI是一种宽泛的含义更广的定义,而URL则是URI的一个子集,就是说URL是URI的一部分。
      换句话说,每个URL都是URI,但是不是每个URI都是URL的。他们之间最明显的不同就是在java.net.URI你只能看到他的一些属性,他只是表示一个位置,但是你没有办法通过URI获取到这个对象的流,但是URL就不同了。java.net.URL该类提供方法(openConnection()),通过该方法我们可以通过IO流操作他。但是URI中我貌似没看到相关的方法。
      也就是说: URL是可以直接操作的,但是URI并不行。(如果你发现这句话不对,麻烦告诉我下)

2、URL的语法

      URL与URI很像,两者的格式几乎差不多,但是我们接触的还是URL比较多,就以URL为例说明
      URL提供了一种访问定位因特网上任意资源的手段,但是这些资源可以通过不同的方法(例如HTTP、FTP、SMTP)来访问,不管怎样,他都基本上由9个部分构成:
      <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<fragment>
      scheme:获取资源使用的协议,例如http、ftp等,没有默认值
      user:password:用户名与密码,这个是一个特殊的存在,一般访问ftp时会用到,他显示的表明了访问资源的用户名与密码。但是这个可以不写,不写的话可能会让你输入用户名密码
      host:主机,访问那台主机,有时候可以是IP,有时候是主机名,例如www.baidu.com
      port:端口,访问主机时的端口,如果http访问默认80,可以省略。
      path:通过host:port我们能找到主机,但是主机上文件很多,通过path则可以定位具体文件。例如www.baidu.com/file/index.html。则path是/file/index.html,表示我们访问/file/index.html这个文件,他很像linux上的路径。
      params:这个很少见,主要作用就是像服务器提供额外的参数,用来表示本次请求的一些特性。例如ftp传输模式有两种,二进制和文本,你肯定不希望使用文本形式传输二进制图片,这样你的图片下载下来后可能没法看了。为了向应用程序提供更丰富的信息,URL中有个专门的部分来表示这种参数。例如ftp://file.qiandu.com/pub/guid.pdf;type=d其中的type=d就是params
      query:通过get方式请求的参数,例如:www.qiandu.com/index.html? username=dgh&passwd=123
      fragment:例如www.qiandu.com/index.html#1。当html页面比较长时,我们通常会将其分为好几段,#1就可以 快速定位到某一段。

3、Java中对URI的操作类


  
  
  1. @Test
  2. public void uriTest() throws Exception{
  3. URI uri = new URI( "https://www.qiandu.com:8080/goods/index.html?username=dgh&passwd=123#j2se");
  4. System.out.println( "scheme : " + uri.getScheme());
  5. System.out.println( "SchemeSpecificPart : " + uri.getSchemeSpecificPart());
  6. System.out.println( "Authority : " + uri.getAuthority());
  7. System.out.println( "host : " + uri.getHost());
  8. System.out.println( "port : " + uri.getPort());
  9. System.out.println( "path : " + uri.getPath());
  10. System.out.println( "query : " + uri.getQuery());
  11. System.out.println( "fragment : " + uri.getFragment());
  12. }
运行上面的代码,然后得到如下的结果:


4、Java中对URL的操作


  
  
  1. @Test
  2. public void urlTest() throws Exception{
  3. URL url = new URL( "https://www.qiandu.com:8080/goods/index.html?username=dgh&passwd=123#j2se");
  4. System.out.println( "URL: " + url.toString());
  5. System.out.println( "protocol: " + url.getProtocol());
  6. System.out.println( "authority: " + url.getAuthority());
  7. System.out.println( "file name: " + url.getFile());
  8. System.out.println( "host: " + url.getHost());
  9. System.out.println( "path: " + url.getPath());
  10. System.out.println( "port: " + url.getPort());
  11. System.out.println( "default port:" + url.getDefaultPort());
  12. System.out.println( "query: " + url.getQuery());
  13. System.out.println( "ref: " + url.getRef());
  14. }
运行上面的代码,得到以下结果:


5、UserInfo属性

      其实关于资源定位的时候还有一种写法,就是类似于
sftp://tomcat@www.qiandu.com///app/index.pdf
  
  
就是在主机名前面有类似于xxx@的东西,其实这种表示就: 用户@主机名或者 用户@IP。 @前面表示登录主机的用户,也就是UserInfo了。


原文地址:https://blog.csdn.net/readiay/article/details/52862379
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nginx是一款高性能的Web服务器和反向代理服务器,支持多种协议,并且灵活性高。当我们需要将请求转发到其他服务器时,可以使用nginx的proxy_pass指令来实现。下面是nginx_proxy_pass配置文件的详解: 1. 语法格式: proxy_pass URL; 其中,URL表示需要转发的目标地址,可以是IP地址或者域名。 2. 功能描述: 使用proxy_pass指令可以将请求转发到其他服务器上,从而实现反向代理的功能。通过反向代理,可以提高网站的稳定性和安全性,同时分布式部署的多台服务器也可以提高网站的并发能力和响应速度。 3. 示例代码: location / { proxy_pass http://127.0.0.1:8080; } 上面的代码表示将所有的请求转发到本地的8080端口上,只需要在nginx中配置好proxy_pass指令即可实现请求转发。 4. 注意事项: 在使用proxy_pass指令时,需要注意以下事项: (1)URL地址需要符合标准的URI格式; (2)URL可以是绝对路径也可以是相对路径; (3)如果需要对目标服务器进行负载均衡,则需要配合其他模块使用,如upstream模块; (4)需要使用proxy_set_header指令设置HTTP头部信息; (5)在使用proxy_pass指令时,需要注意请求的路径是否与目标服务器的路径一致,如果不一致,可能会导致404错误。 总之,nginx_proxy_pass配置文件具有非常重要的作用,可以灵活地部署多台服务器,提高网站的并发能力和响应速度。在开发过程中,需要熟悉这方面的知识点,并能够灵活地运用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值