Commit c110ed6b by ClassmateWang

2021-10-19 18:13 更新JAVA\网络\4)获取web数

parent f113aca6
-- "a/JAVA/\347\275\221\347\273\234/4\357\274\211\350\216\267\345\217\226web\346\225\260.md"
# 4)获取web数
# 4)获取web数
> 讨论专用于在更高层次作用web 的Java类库
## 一、URL和URI
> 定义:
>
> - URL
> - 统一资源定位符
> - http:/google.com?q=Beach+Chalt
> - URI
> - 统一资源标识符
> - URN
> - 统一资源名称
> - mailto:cay@horstmann.com
>
> URI 是纯粹的语法结构,而URL是URL的特例,在URL中包含用于定位web资源的足够信息,而URN也是URI的一个特例,不属于定位符,因为根据名称无法定位任何的资源信息
**<u>URL和URLConnect类</u>** 是在Java中为URL建立的两个类,这两个类封装了大量连接远程站点的信息,比如说:
```java
URL url = new URL("URLString")
```
如果想获取这个URL资源的内容,可以通过url.openStream,生成InputStream 对象,然后根据的一般的方法来操作对象:
```java
InputStream inStream = url.openStream();
Scanner in = new Scanner(inStream,"UTF-8");
```
<u>**URI类**</u> 并不包含任何访问资源的方法,和URL类可以打开到达资源的流不同的是,它的唯一作用就是解析URI,将URI分成不同的部分。
**<u>URI的标准规范:</u>**`[scheme:]schemeSpecificPart[#fragment]`
<u>语法格式:</u>
- [表示可选部分],且:#可以被包含在标识符内
<u>分类:</u>
- 根据路径划分:
- 绝对URI
- http://horstmann.com/index.html
- 相对URI
- ../../java/net/index.html
- 是否透明:schemeSpecificPart 部分是不是以/开头
- 是以/开头
- 透明URI
- http://horstmann.com/index.html
- 不是以/开头
- 不透明URI
- mailto:cay@horstmann.com
**需要注意的是所有绝对透明URI和相对URI都是分层的**
<u>分层URI的schemeSpecificPart 结构:</u>
- [//authority] [path] [?query]
<u>服务器URI的schemeSpecificPart 结构:</u>
- [user-info@host:port]
**<u>URI类的方法:</u>**
- 可以通过这几个方法来获取URI中不同属性的元素值
- getScheme
- getSchemeSpecificPart
- getAuthority
- getUserInfo
- getHost
- getPort
- getPath
- getQuery
- getFragment
**<u>处理绝对标识符和相对标识符:</u>**
绝对标识符:
​ http://google.com/java/net
相对URI:
​ ../java/net/index.jsp
可以结合成一个完整的URI:
​ http://google.com/java/net/index.jsp
得到相对URI的过程叫做`相对化`
比如说:
URI1:http://docs.mycompany.com/api
URI2:http://docs.mycompany.com/api/java/lang/String.html
相对化后的URI:java/lang/String.html
URI类内置方法:
- relative = URI1.relativize(URI2);
- URI2 = URI1.resolve(relative);
## 二、URLConnection
URL类和URI类可以获取一定的资源信息,但更多的web 信息就需要通过URLConnection 类来获取了,而操作URLConnection 有一定的步骤:
作用单位:`请求消息,或者响应消息`(注意不是只针对HTTP协议,而是对于URL支持的协议都适用)
1. 调用URL中的openConnection 获取URLConnection
- ```java
URLConnection connection = url.openConnection();
```
2. 设置请求的消息属性:(这些字段只能在建立连接前进行修改)
- setDoInput
- 该字段在URLConnection可用于输入时为true,否则为false。默认为true。
- 生成从服务器读取数据的输入流
- setDoOutput
- 该字段在URLConnection可用于输出时为true,否则为false。默认为false。
- 生成向服务器发送数的输出流
- setIfModifiedSince
- 该字段指示了将放置If-Modified-Since首部字段中的日期(格林威治标准时间1970年1月1日子夜后的毫秒数)
- setUseCaches
- 该字段指定了是否可以在缓存可用时使用缓存。默认为true,表示缓存将被使用;false表示缓存不被使用。
- 用于Applet
- setAllowUserInteraction
- 用于Applet
- setQequestProperty
- setConnectionTimeout
- 设置连接的超时时间,0表示永不超时
- setReadTimeout
- 设置读操作的超时时间,0表示永不超时
- setRequestProperty
- **<u>用来设置对特定协议起作用的任何键值对</u>**
3. 调用connect 方法连接远程资源
```java
connection.connect();
```
4. 与服务器建立连接后可以用于向服务器查询消息头信息
- getContentType
- 返回content-type 字段的值
- text/palin,image/gif
- getContentLength
- getContentEncoding
- getDate
- getExpiration
- getLastModified
- 返回文件的最后修改日期
5. 访问资源数据,使用getInputStream 方法获取一个输入流用以读取信息
### 获取请求头数据
- getHeaderFields
- 返回一个封装了响应头字段的Map对象
- Map<String, List< String>>
- String key = connection.getHeaderFieldKey(n)
- 获取消息头中的第n个键
- String value = connection.getHeaderField
- 获取消息头中第n个值
- 获取消息头中键对应的值的方法:
- getDate
- getExpiration
- getLastModified
- getContentType
- getContentLength
- getContentEncoding
示例:通过输入URL和用户名和密码,输出:
- 消息头中的所有键和值
- 上面6个方法的值
- 被请求资源的前10行信息
```java
/**
* @BelongsProject: JavaLearnAll
* @BelongsPackage: Socket
* @Author: Wang Haipeng
* @CreateTime: 2021-10-19 17:25
* @Description: URLConnection 示例代码
*/
public class URLConnectionTest {
public static void main(String[] args) {
try {
String urlName;
if (args.length > 0 ){
urlName = args[0];
}else {
urlName = "http://horsemann.com";
}
URL url = new URL(urlName);
URLConnection connection = url.openConnection();
/*设置连接属性*/
if (args.length >2){
String username = args[1];
String password = args[2];
/*认证字段需要用username:password 的形式连接起来*/
String input = username + ":" +password;
/*
计算上一字段所得字符串的Base64 编码,这种编码用于将字节序列编码成可打印的ASCII字符序列
*/
Base64.Encoder encoder = Base64.getEncoder();
String encoding = encoder.encodeToString(input.getBytes(StandardCharsets.UTF_8));
/*将Authorization 作为键和Basic +value 放入到连接属性中*/
connection.setRequestProperty("Authorization","Basic"+encoding);
}
/*建立连接*/
connection.connect();
/*遍历输出消息头信息*/
Map<String, List<String>> headers = connection.getHeaderFields();
for (Map.Entry<String,List<String>> entry : headers.entrySet()){
String key = entry.getKey();
for (String value : entry.getValue()){
System.out.println(key + ":" + value);
}
}
System.out.println("------------------");
System.out.println("getContentType: "+ connection.getContentType());
System.out.println("getContentLength: "+ connection.getContentLength());
System.out.println("getContentEncoding: "+ connection.getContentEncoding());
System.out.println("getDate: "+ connection.getDate());
System.out.println("getExpiration: "+ connection.getExpiration());
System.out.println("getLastModified: "+ connection.getLastModified());
String encoding = connection.getContentEncoding();
if(encoding == null){
encoding = "utf-8";
}
Scanner in = new Scanner(connection.getInputStream(),encoding);
/*输出前10行的数据*/
for (int n = 1;in.hasNextLine()&& n<10 ;n++){
System.out.println(in.nextLine());
}
if (in.hasNextLine()){
System.out.println("...");
}
}catch (Exception e){
}
}
}
```
![image-20211019175426718](https://wangnotes.oss-cn-beijing.aliyuncs.com/notesimage/image-20211019175426718.png)
![image-20211019175500692](https://wangnotes.oss-cn-beijing.aliyuncs.com/notesimage/image-20211019175500692.png)
![image-20211019175549567](https://wangnotes.oss-cn-beijing.aliyuncs.com/notesimage/image-20211019175549567.png)
## 三、涉及API
![image-20211019181137260](https://wangnotes.oss-cn-beijing.aliyuncs.com/notesimage/image-20211019181137260.png)
![image-20211019181151159](https://wangnotes.oss-cn-beijing.aliyuncs.com/notesimage/image-20211019181151159.png)
![image-20211019181200237](https://wangnotes.oss-cn-beijing.aliyuncs.com/notesimage/image-20211019181200237.png)
![image-20211019181205616](https://wangnotes.oss-cn-beijing.aliyuncs.com/notesimage/image-20211019181205616.png)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment