饥人谷java体系课
计算机网络基础架构与HTTP原理
在打开⽹⻚的时候发⽣了什么
先通过域名,向DNS发送请求得到该域名的IP地址,可以借此IP地址找到对应的主机,通过TCP高速通道向主机发送HTTP Request,主机接到请求后会给一个HTTP Response响应,响应体中有HTML,浏览器会解析HTML的内容来形成我们所看到的页面
1.网络
2.主机
3.IP地址
IPV4 :四个字节 四个0-255
IPV6:128位(16个字节)8个无符号整数,每个整数用四位16进制数表示,之间用冒号隔开
4.DNS 域名服务
5.端口:0-65535
16位整数
公认端口: 0-1023。被预先定义的服务通信占用(如HTTP:80,FTP:21,Telnet:23)
注册端口:1024-49151(如Tomcat:8080,MySql:3306,Oracle:1521等
动态\私有端口:49152-65535
Https默认端口号443,Http默认端口号80
指定通信主机上的归属地
TCP协议 传输控制协议
基于流的协议,双向通道 全双工协议 可以同时接受发送数据
定义了字节流在网络上如何发送和接受
HTTP协议 超文本传输协议
定义文本之外的数据如何传输
HTTP状态码 200 请求成功
HTML 超文本标记语言
定义了网页页面如何被渲染
CSS是样式表,告诉浏览器当前页面如何被渲染
java发送HTTP请求
使用第三方库HTTPCLient
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
使用Commons-io
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
jsoup 解析html
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.1</version>
</dependency>
//创建一个客户端,这里需要设置cookie,不然会给出警告
CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(RequestConfig.custom()
.setCookieSpec(CookieSpecs.STANDARD).build())
.build();
//建立HTTPGet请求
//repo是一个库名,是我们方法的参数
HttpGet httpGet = new HttpGet("https://github.com/"+repo+"/pulls");
//得到响应
CloseableHttpResponse response = httpclient.execute(httpGet);
try {
//打印响应的第一栏状态
System.out.println(response.getStatusLine());
//得到Http实体
HttpEntity entity1 = response.getEntity();
// do something useful wi th the response body
// and ensure it is fully consumed
//将实体转化为字节流
InputStream is=entity1.getContent();
//通过第三方库commons-io的IOUtils方法将字节流转换为字符串
String s = IOUtils.toString(is, "UTF-8");
//使用第三方库Jsoup,解析HTML字符串,并转换为Document
Document document = Jsoup.parse(s);
//根据class名查找需要的内容
Elements select = document.select(".js-issue-row");
List<GitHubPullRequest> gitHubPullRequestList=new ArrayList<>();
for (Element e:select
) {
//通过查找child来确定自己需要的内容
String text = e.child(0).child(1).child(0).text();
String id = e.child(0).child(1).child(0).attr("id").split("_")[1];
//这里使用getElementsByClass方法来直接找这一行得到其内容,
//因为我通过child查找时,总是报越界异常
String name = e.getElementsByClass("Link--muted").text();
//把得到的东西根据对应的内容加入GitHubPullRequest这个对象
gitHubPullRequestList.add(new GitHubPullRequest(Integer.parseInt(id),text,name));
}
return gitHubPullRequestList;
} finally {
response.close();
}
这是我们的GitHubPullRequest类,其中定义了我们需要的内容
static class GitHubPullRequest {
// Pull request的编号
int number;
// Pull request的标题
String title;
// Pull request的作者的 GitHub 用户名
String author;
GitHubPullRequest(int number, String title, String author) {
this.number = number;
this.title = title;
this.author = author;
}
@Override
public String toString() {
return "GitHubPullRequest{" +
"number=" + number +
", title='" + title + '\'' +
", author='" + author + '\'' +
'}';
}
}
同步和异步加载
服务器端⼀次返回所有的数据
服务器端返回部分数据,使⽤AJAX异步加载
HTTP基础
HTTP方法与状态码
HTTP方法
GET
请求指定的页面信息,并返回实体主体。
要求去读一个东西
请求的东西全放在HTTP Request header中
PUST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
真正的数据放在body中
状态码
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
分类
| 1 | 信息,服务器收到请求,需要请求者继续执行操作 | | —- | —- | | 2 | 成功,操作被成功接收并处理 | | 3 | 重定向,需要进一步的操作以完成请求 | | 4 | 客户端错误,请求包含语法错误或无法完成请求 | | 5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
描述
状态码 | 状态码英文名称 | 中文描述 |
---|---|---|
100 | Continue | 继续。客户端应继续其请求 |
101 | Switching Protocols | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
200 | OK | 请求成功。一般用于GET与POST请求 |
201 | Created | 已创建。成功请求并创建了新的资源 |
202 | Accepted | 已接受。已经接受请求,但未处理完成 |
203 | Non-Authoritative Information | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
204 | No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
205 | Reset Content | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 | Partial Content | 部分内容。服务器成功处理了部分GET请求 |
300 | Multiple Choices | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 |
301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 | See Other | 查看其它地址。与301类似。使用GET和POST请求查看 |
304 | Not Modified | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
305 | Use Proxy | 使用代理。所请求的资源必须通过代理访问 |
306 | Unused | 已经被废弃的HTTP状态码 |
307 | Temporary Redirect | 临时重定向。与302类似。使用GET请求重定向 |
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 | Unauthorized | 请求要求用户的身份认证 |
402 | Payment Required | 保留,将来使用 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置”您所请求的资源无法找到”的个性页面 |
405 | Method Not Allowed | 客户端请求中的方法被禁止 |
406 | Not Acceptable | 服务器无法根据客户端请求的内容特性完成请求 |
407 | Proxy Authentication Required | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 | Request Time-out | 服务器等待客户端发送的请求时间过长,超时 |
409 | Conflict | 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 |
410 | Gone | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 | Length Required | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 | Precondition Failed | 客户端请求信息的先决条件错误 |
413 | Request Entity Too Large | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
414 | Request-URI Too Large | 请求的URI过长(URI通常为网址),服务器无法处理 |
415 | Unsupported Media Type | 服务器无法处理请求附带的媒体格式 |
416 | Requested range not satisfiable | 客户端请求的范围无效 |
417 | Expectation Failed | 服务器无法满足Expect的请求头信息 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 |
502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | HTTP Version not supported | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
HTTP请求header
Host
User-Agent
Accept*
Referer
Cookie
维持http状态
响应后给了set-cookie,之后的所有请求的cookie都会带上set-cookie给的字符串
只对当前域名有效
有有效期
HTTP响应header
Content-type
响应的数据类型,与Accept协同工作
常见的媒体格式类型如下:
- text/html : HTML格式
- text/plain :纯文本格式
- text/xml : XML格式
- image/gif :gif图片格式
- image/jpeg :jpg图片格式
- image/png:png图片格式
以application开头的媒体格式类型:
- application/xhtml+xml :XHTML格式
- application/xml: XML数据格式
- application/atom+xml :Atom XML聚合格式
- application/json: JSON数据格式
- application/pdf:pdf格式
- application/msword : Word文档格式
- application/octet-stream : 二进制流数据(如常见的文件下载)
- application/x-www-form-urlencoded :
另外一种常见的媒体格式是上传文件之时使用的: