Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
mynote
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ClassmateWang
mynote
Commits
c110ed6b
Commit
c110ed6b
authored
Oct 19, 2021
by
ClassmateWang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
2021-10-19 18:13 更新JAVA\网络\4)获取web数
parent
f113aca6
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
291 additions
and
1 deletions
+291
-1
JAVA/网络/4)获取web数.md
+291
-1
No files found.
JAVA/网络/4)获取web数.md
View file @
c110ed6b
-- "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
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment