Article / 文章中心

关于 URL几个不知道的点

发布时间:2022-02-11 点击数:114

01、什么是 URL

为了搞清楚什么是 URL,需求引入别的两个概念 URI 和 URN。

什么鬼,URL 都没搞清楚,又来两个搞不清楚的?别忧虑,我能像变了魔法相同让咱们把三个都搞清楚。

  • URI = Universal Resource Identifier,中文释义为一致资源标志符
  • URL = Universal Resource Locator,中文释义为一致资源定位符
  • URN = Universal Resource Name,中文释义为一致资源名称

它们之间的联系如下图所示:

0.jpg

这图啥意思啊,怎样办呢?张小敬有问题就去问葛佬,咱不会就去问“维基百科”啊。

URI 能够分为 URL 和 URN,或者是 URL 和 URN 的结合体(一起具有 Locator 和 Name)。URN 就好像一个人的姓名,URL 就像一个人的地址。换句话说:URN 确定了身份,URL 供给了找到它的方法。

概念明晰了吧?URI 是一个朴实的句法结构,用于指定标识 Web 资源的字符串的各个不同部分。URL 是 URI 的一个特例,包含了定位 Web 资源的足够多的信息。URI 是一致资源标识符,而 URL 是一致资源定位符。URL 是 URI 的一种,比方:http://www.itmind.net/。但不是所有的 URI 都是 URL,由于 URI 或许包含一个子集,即一致资源名称 (URN,命名了资源但不指定如何定位资源),比方说:mailto:qing_gee@163.com。

吧啦吧啦说这么多挺累的,来一发实例吧,用于获取 URL 的主机名和端口号。

URL url = new URL("http://www.itmind.net/category/payment-selection/zhishixingqiu-jingxuan/"); System.out.println("host: " + url.getHost()); System.out.println("port: " + url.getPort()); System.out.println("uri_path: " + url.getPath()); // 输出 // host: www.itmind.net // port: -1 // uri_path: /category/payment-selection/zhishixingqiu-jingxuan/


1)创建java.net.URL目标的办法十分简略,只需求一行代码。

URL url = new URL(URL地址);

URL 目标是不可变的,由于 URL 类是 final 类型的,这样的优点就是确保它是"线程安全"的。

2)有了java.net.URL目标后,就能够获取 URL 相关的主机名、端口、路径等等。

url.getHost() url.getPort() url.getPath()

02、什么是 URLConnection

URLConnection 是一个抽象类,代表应用程序和 URL 之间的通信链接。它的实例可用于读取和写入此 URL 引证的资源。该类供给了比 Socket 类更易于运用、更高档的网络衔接抽象。

怎样获取 URLConnection 目标呢?经过 URL 目标的openConnection()办法,示例如下。

URL url = new URL("http://www.itmind.net"); URLConnection connection = url.openConnection();

假如 URL 协议为  HTTP 的话,回来的衔接为 URLConnection 的子类 HttpURLConnection。

有了URLConnection目标后,能够经过getInputStream()回来一个 InputStream,由此读取 URL 所引证的资源数据(假如读取 ASCII 文本则为 ASCII;假如读取 HTML 文件则为原始 HTML,假如读取图像文件则为二进制图片数据等)。

咱们来测验读取一下小白书院主页的内容,代码示例如下。

URL url = new URL("http://www.itmind.net"); URLConnection connection = url.openConnection(); try (InputStream in = connection.getInputStream();) {  ByteArrayOutputStream output = new ByteArrayOutputStream();  byte[] buffer = newbyte[1024];  int len = -1;  while ((len = in.read(buffer)) != -1) {  output.write(buffer, 0, len);  }  System.out.println(new String(output.toByteArray())); } catch (IOException e) {  e.printStackTrace(); }

能够运用try-with-resource获取InputStream,该类实现了AutoCloseable接口,能够在内容读取完毕后自动关闭输入流。

打印的内容如下图所示(部分):

1.jpg

假如你想读取某个 URL 的内容,上述办法是一个不错的计划,赶快去试试吧!

03、URL 和 URLConnection 的不同

URL 和 URLConnection 最大的不同在于:

  • URLConnection 供给了对 HTTP 头部的拜访;
  • URLConnection 能够配置发送给某个 URL 的请求参数;
  • URLConnection 不只能够读取 URL 定位的资源,还能够向其写入数据。

获取 HTTP 头部的办法有以下一些:

  • getContentType,回来 Content-type 头字段的值,即数据的 MIME 内容类型。若类型不可用,则回来 null。假如内容类型是文本,则 Content-type 首部或许会包含一个标识内容编码方法的字符集,例如:Content-type:text/html; charset=UTF-8
  • getContentLength(),回来 Content-length 头字段的值,即内容的字节数。
  • getContentEncoding(),回来 Content-encoding 头字段的值,即内容的编码方法(不同于字符编码方法),例如:x-gzip。
  • getDate(),回来 date 头字段的值,即请求的发送时刻。
  • getExpiration(),回来 expires(过期时刻) 头字段的值。假如回来 0,表明不过期,永久缓存。
  • getLastModified(),回来 last-modified(前次修改日期) 头字段的值。

代码示例如下。

URL url = new URL("http://www.itmind.net"); URLConnection connection = url.openConnection(); System.out.println(connection.getContentType()); System.out.println(connection.getContentLength()); System.out.println(connection.getContentEncoding()); System.out.println(connection.getDate()); System.out.println(connection.getExpiration()); System.out.println(connection.getLastModified()); // 输出 // text/html; charset=UTF-8 // -1 // null // 1566886980000 // 0 // 0

04、最终

利用 URLConnection 还能够向指定的 URL 请求发送 POST 请求,但这种作法现已很少有人在用了,所以这篇文章也不打算进行介绍了。假如十分感兴趣,想自己试一试,能够在公众号后台回复「666」获取咱们为你精心准备的高清带书签的 PDF——《Java 网络编程(第4版)》,第 7 章对此进行了详细的介绍。