URL是Java对统一资源定位符的抽象。虽然URL只是一个字符串,但是是由很多不同的部分组成的,例如协议、ip、端口号、路径等,URL类提供了构建URL、获取URL各个部分以及读取URL返回数据的一些方法。我们来具体看一下。

构建URL

URL类提供了几个不同的构造方法来获取URL对象,可以用组成URL的组件如协议、ip、路径来获取,也可以直接通过完整的URL字符串:
image.png
我们先来看第四个,第四个直接给出完整的URL字符串即可:

  1. public URL(String spec) throws MalformedURLException {
  2. this(null, spec);
  3. }

它是调用了其他的构造方法来实现的,不去看了。直接上例子:

  1. public static void main(String[] args) throws MalformedURLException, UnsupportedEncodingException {
  2. URL url = new URL("http://10.130.19.236:7090/api/v1/query?name=崔华龙");
  3. System.out.println(url.getProtocol());
  4. System.out.println(url.getHost());
  5. System.out.println(url.getPort());
  6. System.out.println(url.getFile());
  7. System.out.println(url.getPath());
  8. System.out.println(url.getQuery());
  9. }

我们输出了这个URL的各个部分:

  1. http
  2. 10.130.19.236
  3. 7090
  4. /api/v1/query?name=崔华龙
  5. /api/v1/query
  6. name=崔华龙

这些组成部分我们应该都比较熟悉。

从URL获取数据

使用openStream方法获取输入流

URL提供了几个方法让我们可以获取数据,openStream是其中的一个:

  1. public final InputStream openStream() throws java.io.IOException {
  2. return openConnection().getInputStream();
  3. }

它返回的是一个InputStream,它是通过调用另一个方法openConnection实现的,我们先看我们使用openStream能做什么:

  1. public static void main(String[] args) throws IOException {
  2. URL url = new URL("http://10.130.19.236:7090/api/v1/query?query=container_last_seen");
  3. InputStream inputStream = url.openStream();
  4. System.out.println(inputStream);
  5. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
  6. StringBuilder stringBuilder = new StringBuilder();
  7. int c ;
  8. while((c=bufferedReader.read())!=-1){
  9. stringBuilder.append((char)c);
  10. }
  11. System.out.println(stringBuilder);
  12. }
  1. sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@1698c449
  2. {"status":"success","data":{"resultType":"vector","result":[]}}

可以看到我们可以直接读取InputStream中的数据,并且读取到的数据就是返回的原始数据,没有协议的首部、mime类型这些数据,所以使用它来解析数据是有局限的,如果返回的是图片或者视频,我们就不知道怎么解析了。

openConnection方法获取URLConnection

要想控制首部、mime类型这些信息,可以使用openConnection()方法:

  1. public URLConnection openConnection() throws java.io.IOException {
  2. return handler.openConnection(this);
  3. }

它返回的是URLConnection类,这个类代表到URL的一个连接,我们下一篇文章会重点介绍这个类,现在先来看它的一些用法:

  1. public static void main(String[] args) throws IOException {
  2. URL url = new URL("http://10.130.19.236:7090/api/v1/query?query=container_last_seen{name='cuihualong'}");
  3. URLConnection urlConnection = url.openConnection();
  4. String contentType = urlConnection.getContentType();
  5. int contentLength = urlConnection.getContentLength();
  6. System.out.println(contentLength);
  7. System.out.println(contentType);
  8. System.out.println(urlConnection.getHeaderFields());
  9. }

它有一些方法用来返回contentType、header等。看返回:

  1. 63
  2. application/json
  3. {null=[HTTP/1.1 200 OK], Content-Length=[63], Date=[Wed, 27 Apr 2022 13:29:36 GMT], Content-Type=[application/json]}

这样我们就能更精细地控制URL连接了。URLConnection的用处不止这些,这里先了解这些。
上面的openStream实际上也是先获取了URLConnection,然后调用了URLConnection的openStream方法来获取的InputStream。