关于 URL几个不知道的点
01、什么是 URL
为了搞清楚什么是 URL,需求引入别的两个概念 URI 和 URN。
什么鬼,URL 都没搞清楚,又来两个搞不清楚的?别忧虑,我能像变了魔法相同让咱们把三个都搞清楚。
-
URI = Universal Resource Identifier,中文释义为一致资源标志符
-
URL = Universal Resource Locator,中文释义为一致资源定位符
-
URN = Universal Resource Name,中文释义为一致资源名称
它们之间的联系如下图所示:
这图啥意思啊,怎样办呢?张小敬有问题就去问葛佬,咱不会就去问“维基百科”啊。
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接口,能够在内容读取完毕后自动关闭输入流。
打印的内容如下图所示(部分):
假如你想读取某个 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 章对此进行了详细的介绍。