URL是Java对统一资源定位符的抽象。虽然URL只是一个字符串,但是是由很多不同的部分组成的,例如协议、ip、端口号、路径等,URL类提供了构建URL、获取URL各个部分以及读取URL返回数据的一些方法。我们来具体看一下。
构建URL
URL类提供了几个不同的构造方法来获取URL对象,可以用组成URL的组件如协议、ip、路径来获取,也可以直接通过完整的URL字符串:
我们先来看第四个,第四个直接给出完整的URL字符串即可:
public URL(String spec) throws MalformedURLException {
this(null, spec);
}
它是调用了其他的构造方法来实现的,不去看了。直接上例子:
public static void main(String[] args) throws MalformedURLException, UnsupportedEncodingException {
URL url = new URL("http://10.130.19.236:7090/api/v1/query?name=崔华龙");
System.out.println(url.getProtocol());
System.out.println(url.getHost());
System.out.println(url.getPort());
System.out.println(url.getFile());
System.out.println(url.getPath());
System.out.println(url.getQuery());
}
我们输出了这个URL的各个部分:
http
10.130.19.236
7090
/api/v1/query?name=崔华龙
/api/v1/query
name=崔华龙
从URL获取数据
使用openStream方法获取输入流
URL提供了几个方法让我们可以获取数据,openStream是其中的一个:
public final InputStream openStream() throws java.io.IOException {
return openConnection().getInputStream();
}
它返回的是一个InputStream,它是通过调用另一个方法openConnection实现的,我们先看我们使用openStream能做什么:
public static void main(String[] args) throws IOException {
URL url = new URL("http://10.130.19.236:7090/api/v1/query?query=container_last_seen");
InputStream inputStream = url.openStream();
System.out.println(inputStream);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
StringBuilder stringBuilder = new StringBuilder();
int c ;
while((c=bufferedReader.read())!=-1){
stringBuilder.append((char)c);
}
System.out.println(stringBuilder);
}
sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@1698c449
{"status":"success","data":{"resultType":"vector","result":[]}}
可以看到我们可以直接读取InputStream中的数据,并且读取到的数据就是返回的原始数据,没有协议的首部、mime类型这些数据,所以使用它来解析数据是有局限的,如果返回的是图片或者视频,我们就不知道怎么解析了。
openConnection方法获取URLConnection
要想控制首部、mime类型这些信息,可以使用openConnection()方法:
public URLConnection openConnection() throws java.io.IOException {
return handler.openConnection(this);
}
它返回的是URLConnection类,这个类代表到URL的一个连接,我们下一篇文章会重点介绍这个类,现在先来看它的一些用法:
public static void main(String[] args) throws IOException {
URL url = new URL("http://10.130.19.236:7090/api/v1/query?query=container_last_seen{name='cuihualong'}");
URLConnection urlConnection = url.openConnection();
String contentType = urlConnection.getContentType();
int contentLength = urlConnection.getContentLength();
System.out.println(contentLength);
System.out.println(contentType);
System.out.println(urlConnection.getHeaderFields());
}
它有一些方法用来返回contentType、header等。看返回:
63
application/json
{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。