饥人谷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

  1. <dependency>
  2. <groupId>org.apache.httpcomponents</groupId>
  3. <artifactId>httpclient</artifactId>
  4. <version>4.5.12</version>
  5. </dependency>

使用Commons-io

  1. <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
  2. <dependency>
  3. <groupId>commons-io</groupId>
  4. <artifactId>commons-io</artifactId>
  5. <version>2.11.0</version>
  6. </dependency>

jsoup 解析html

  1. <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
  2. <dependency>
  3. <groupId>org.jsoup</groupId>
  4. <artifactId>jsoup</artifactId>
  5. <version>1.15.1</version>
  6. </dependency>
  1. //创建一个客户端,这里需要设置cookie,不然会给出警告
  2. CloseableHttpClient httpClient = HttpClients.custom()
  3. .setDefaultRequestConfig(RequestConfig.custom()
  4. .setCookieSpec(CookieSpecs.STANDARD).build())
  5. .build();
  6. //建立HTTPGet请求
  7. //repo是一个库名,是我们方法的参数
  8. HttpGet httpGet = new HttpGet("https://github.com/"+repo+"/pulls");
  9. //得到响应
  10. CloseableHttpResponse response = httpclient.execute(httpGet);
  11. try {
  12. //打印响应的第一栏状态
  13. System.out.println(response.getStatusLine());
  14. //得到Http实体
  15. HttpEntity entity1 = response.getEntity();
  16. // do something useful wi th the response body
  17. // and ensure it is fully consumed
  18. //将实体转化为字节流
  19. InputStream is=entity1.getContent();
  20. //通过第三方库commons-io的IOUtils方法将字节流转换为字符串
  21. String s = IOUtils.toString(is, "UTF-8");
  22. //使用第三方库Jsoup,解析HTML字符串,并转换为Document
  23. Document document = Jsoup.parse(s);
  24. //根据class名查找需要的内容
  25. Elements select = document.select(".js-issue-row");
  26. List<GitHubPullRequest> gitHubPullRequestList=new ArrayList<>();
  27. for (Element e:select
  28. ) {
  29. //通过查找child来确定自己需要的内容
  30. String text = e.child(0).child(1).child(0).text();
  31. String id = e.child(0).child(1).child(0).attr("id").split("_")[1];
  32. //这里使用getElementsByClass方法来直接找这一行得到其内容,
  33. //因为我通过child查找时,总是报越界异常
  34. String name = e.getElementsByClass("Link--muted").text();
  35. //把得到的东西根据对应的内容加入GitHubPullRequest这个对象
  36. gitHubPullRequestList.add(new GitHubPullRequest(Integer.parseInt(id),text,name));
  37. }
  38. return gitHubPullRequestList;
  39. } finally {
  40. response.close();
  41. }

这是我们的GitHubPullRequest类,其中定义了我们需要的内容

  1. static class GitHubPullRequest {
  2. // Pull request的编号
  3. int number;
  4. // Pull request的标题
  5. String title;
  6. // Pull request的作者的 GitHub 用户名
  7. String author;
  8. GitHubPullRequest(int number, String title, String author) {
  9. this.number = number;
  10. this.title = title;
  11. this.author = author;
  12. }
  13. @Override
  14. public String toString() {
  15. return "GitHubPullRequest{" +
  16. "number=" + number +
  17. ", title='" + title + '\'' +
  18. ", author='" + author + '\'' +
  19. '}';
  20. }
  21. }

同步和异步加载

服务器端⼀次返回所有的数据
服务器端返回部分数据,使⽤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 :
    中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

另外一种常见的媒体格式是上传文件之时使用的:

  • multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

    Set-cookie

    随机生成的字符串
    一旦服务器给了set-cookie以后,之后所有发出的请求都会带上这段字符串

    HTTP body

    GET请求没有body

    HTTP request body

    • 表单 • k-v对

    HTTP response body

    • JSON
    • HTML/XML
    • ⼆进制(图⽚/下载⽂件)

    HTTP是无状态的

    发起的HTTP请求是独立的