From da830ee01356833be0b74c59ba24280074125833 Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Wed, 14 Mar 2018 09:50:12 +0800
Subject: [PATCH 01/23] auto commit
---
notes/剑指 offer 题解.md | 4 ++--
notes/面向对象思想.md | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md
index 2e19e146..f7492747 100644
--- a/notes/剑指 offer 题解.md
+++ b/notes/剑指 offer 题解.md
@@ -161,7 +161,7 @@ public boolean Find(int target, int [][] array) {
**题目要求**
-以 O(1) 的空间复杂度和 O(n) 的空间复杂度来求解。
+以 O(1) 的空间复杂度和 O(n) 的时间复杂度来求解。
**解题思路**
@@ -686,7 +686,7 @@ private void printNumber(char[] number) {
-- 综上,如果进行 N 次操作,那么大约需要移动节点的次数为 N-1+N=2N-1,其中 N-1 表示不是链表尾节点情况下的移动次数,N 表示是尾节点情况下的移动次数。那么增长数量级为 (2N-1)/N \~ 2,因此该算法的时间复杂度为 O(1)。
+- 综上,如果进行 N 次操作,那么大约需要移动节点的次数为 N-1+N=2N-1,其中 N-1 表示不是链表尾节点情况下的移动次数,N 表示是尾节点情况下的移动次数。(2N-1)/N \~ 2,因此该算法的时间复杂度为 O(1)。
```java
public ListNode deleteNode(ListNode head, ListNode tobeDelete) {
diff --git a/notes/面向对象思想.md b/notes/面向对象思想.md
index 55cdf5e0..2907b05c 100644
--- a/notes/面向对象思想.md
+++ b/notes/面向对象思想.md
@@ -26,7 +26,7 @@
> [Design Principles](http://www.oodesign.com/design-principles.html)
-设计原则可以帮助我们避免那些糟糕的设计,这些原则被归纳在《敏捷软件开发:原则、模式与实践》
+设计原则可以帮助我们避免那些糟糕的设计,这些原则被归纳在《敏捷软件开发:原则、模式与实践》这本书中。
| 简写 | 全拼 | 中文翻译 |
| -- | -- | -- |
@@ -69,7 +69,7 @@
## 5. 依赖倒置原则
- **高层模块不应该依赖于低层模块,二者都应该依赖于抽象**
-- **抽象不应该依赖于细节,细节应该依赖于抽象**
+2018-03-13 23:36:09 星期二- **抽象不应该依赖于细节,细节应该依赖于抽象**
高层模块包含一个应用程序中重要的策略选择和业务模块,如果高层模块依赖于底层模块,那么底层模块的改动就会直接影响到高层模块,从而迫使高层模块也需要改动。
From 3832615f210c1993a764ee8ca0c085f34b095ee2 Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Wed, 14 Mar 2018 09:55:43 +0800
Subject: [PATCH 02/23] auto commit
---
notes/面向对象思想.md | 59 +++++++++++++++++++++----------------------
1 file changed, 29 insertions(+), 30 deletions(-)
diff --git a/notes/面向对象思想.md b/notes/面向对象思想.md
index 2907b05c..bf64f121 100644
--- a/notes/面向对象思想.md
+++ b/notes/面向对象思想.md
@@ -1,17 +1,18 @@
-* [S.O.L.I.D](#solid)
- * [1. 单一责任原则](#1-单一责任原则)
- * [2. 开放封闭原则](#2-开放封闭原则)
- * [3. 里氏替换原则](#3-里氏替换原则)
- * [4. 接口分离原则](#4-接口分离原则)
- * [5. 依赖倒置原则](#5-依赖倒置原则)
-* [其他常见原则](#其他常见原则)
- * [1. 迪米特法则](#1-迪米特法则)
- * [2. 合成复用原则](#2-合成复用原则)
- * [3. 共同封闭原则](#3-共同封闭原则)
- * [4. 稳定抽象原则](#4-稳定抽象原则)
- * [5. 稳定依赖原则](#5-稳定依赖原则)
-* [封装、继承、多态](#封装继承多态)
+* [设计原则](#设计原则)
+ * [1. S.O.L.I.D](#1-solid)
+ * [1.1 单一责任原则](#11-单一责任原则)
+ * [1.2 开放封闭原则](#12-开放封闭原则)
+ * [1.3 里氏替换原则](#13-里氏替换原则)
+ * [1.4 接口分离原则](#14-接口分离原则)
+ * [1.5 依赖倒置原则](#15-依赖倒置原则)
+ * [2. 其他常见原则](#2-其他常见原则)
+ * [2.1 迪米特法则](#21-迪米特法则)
+ * [2.2 合成复用原则](#22-合成复用原则)
+ * [2.3 共同封闭原则](#23-共同封闭原则)
+ * [2.4 稳定抽象原则](#24-稳定抽象原则)
+ * [2.5 稳定依赖原则](#25-稳定依赖原则)
+* [面向对象的三大特性](#面向对象的三大特性)
* [1. 封装](#1-封装)
* [2. 继承](#2-继承)
* [3. 多态](#3-多态)
@@ -22,12 +23,12 @@
-# S.O.L.I.D
-
-> [Design Principles](http://www.oodesign.com/design-principles.html)
+# 设计原则
设计原则可以帮助我们避免那些糟糕的设计,这些原则被归纳在《敏捷软件开发:原则、模式与实践》这本书中。
+## 1. S.O.L.I.D
+
| 简写 | 全拼 | 中文翻译 |
| -- | -- | -- |
| SRP | The Single Responsibility Principle | 单一责任原则 |
@@ -36,7 +37,7 @@
| ISP | The Interface Segregation Principle | 接口分离原则 |
| DIP | The Dependency Inversion Principle | 依赖倒置原则 |
-## 1. 单一责任原则
+### 1.1 单一责任原则
**修改一个类的原因应该只有一个。**
@@ -44,7 +45,7 @@
如果一个类承担的职责过多,就等于把这些职责耦合在了一起,一个职责的变化可能会削弱这个类完成其它职责的能力。
-## 2. 开放封闭原则
+### 1.2 开放封闭原则
**类应该对扩展开放,对修改关闭。**
@@ -52,7 +53,7 @@
符合开闭原则最典型的设计模式是装饰者模式,它可以动态地将责任附加到对象上,而不用去修改类的代码。
-## 3. 里氏替换原则
+### 1.3 里氏替换原则
**子类实例应该能够替换掉所有父类实例。**
@@ -60,13 +61,13 @@
如果不满足这个原则,那么各个子类的行为上就会有很大差异,增加继承体系的复杂度。
-## 4. 接口分离原则
+### 1.4 接口分离原则
**不应该强迫客户依赖于它们不用的方法。**
因此使用多个专门的接口比使用单一的总接口总要好。
-## 5. 依赖倒置原则
+### 1.5 依赖倒置原则
- **高层模块不应该依赖于低层模块,二者都应该依赖于抽象**
2018-03-13 23:36:09 星期二- **抽象不应该依赖于细节,细节应该依赖于抽象**
@@ -79,7 +80,7 @@
- 任何类都不应该从具体类派生;
- 任何方法都不应该覆写它的任何基类中的已经实现的方法。
-# 其他常见原则
+## 2. 其他常见原则
除了上述的经典原则,在实际开发中还有下面这些常见的设计原则。
@@ -91,29 +92,27 @@
|SAP| The Stable Abstractions Principle | 稳定抽象原则 |
|SDP| The Stable Dependencies Principle | 稳定依赖原则 |
-## 1. 迪米特法则
+### 2.1 迪米特法则
迪米特法则又叫作最少知道原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。
-## 2. 合成复用原则
+### 2.2 合成复用原则
尽量使用对象组合,而不是继承来达到复用的目的。
-## 3. 共同封闭原则
+### 2.3 共同封闭原则
一起修改的类,应该组合在一起(同一个包里)。如果必须修改应用程序里的代码,我们希望所有的修改都发生在一个包里(修改关闭),而不是遍布在很多包里。
-## 4. 稳定抽象原则
+### 2.4 稳定抽象原则
最稳定的包应该是最抽象的包,不稳定的包应该是具体的包,即包的抽象程度跟它的稳定性成正比。
-## 5. 稳定依赖原则
+### 2.5 稳定依赖原则
包之间的依赖关系都应该是稳定方向依赖的,包要依赖的包要比自己更具有稳定性。
-# 封装、继承、多态
-
-封装、继承、多态是面向对象的三大特性。
+# 面向对象的三大特性
## 1. 封装
From e4f70d4f8ff285c94f753ac23e24c5b9e0e3124e Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Wed, 14 Mar 2018 09:56:43 +0800
Subject: [PATCH 03/23] auto commit
---
notes/面向对象思想.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/notes/面向对象思想.md b/notes/面向对象思想.md
index bf64f121..042f7b4f 100644
--- a/notes/面向对象思想.md
+++ b/notes/面向对象思想.md
@@ -70,7 +70,7 @@
### 1.5 依赖倒置原则
- **高层模块不应该依赖于低层模块,二者都应该依赖于抽象**
-2018-03-13 23:36:09 星期二- **抽象不应该依赖于细节,细节应该依赖于抽象**
+- **抽象不应该依赖于细节,细节应该依赖于抽象**
高层模块包含一个应用程序中重要的策略选择和业务模块,如果高层模块依赖于底层模块,那么底层模块的改动就会直接影响到高层模块,从而迫使高层模块也需要改动。
From 468d774c28b783b1b8c30147e05d000bb0eebc7e Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Wed, 14 Mar 2018 10:17:20 +0800
Subject: [PATCH 04/23] auto commit
---
notes/面向对象思想.md | 100 ++++++++++++++++++++++--------------------
1 file changed, 53 insertions(+), 47 deletions(-)
diff --git a/notes/面向对象思想.md b/notes/面向对象思想.md
index 042f7b4f..1b88525f 100644
--- a/notes/面向对象思想.md
+++ b/notes/面向对象思想.md
@@ -12,13 +12,21 @@
* [2.3 共同封闭原则](#23-共同封闭原则)
* [2.4 稳定抽象原则](#24-稳定抽象原则)
* [2.5 稳定依赖原则](#25-稳定依赖原则)
-* [面向对象的三大特性](#面向对象的三大特性)
+* [三大特性](#三大特性)
* [1. 封装](#1-封装)
* [2. 继承](#2-继承)
* [3. 多态](#3-多态)
* [UML](#uml)
* [1. 类图](#1-类图)
+ * [1.1 继承相关](#11-继承相关)
+ * [1.2 整体和部分](#12-整体和部分)
+ * [1.3 相互联系](#13-相互联系)
* [2. 时序图](#2-时序图)
+ * [2.1 定义](#21-定义)
+ * [2.2 赤壁之战时序图](#22-赤壁之战时序图)
+ * [2.3 活动图、时序图之间的关系](#23-活动图时序图之间的关系)
+ * [2.4 类图与时序图的关系](#24-类图与时序图的关系)
+ * [2.5 时序图的组成](#25-时序图的组成)
* [参考资料](#参考资料)
@@ -55,7 +63,7 @@
### 1.3 里氏替换原则
-**子类实例应该能够替换掉所有父类实例。**
+**子类对象必须能够替换掉所有父类对象。**
继承是一种 IS-A 关系,子类需要能够当成父类来使用,并且需要比父类更特殊。
@@ -112,22 +120,21 @@
包之间的依赖关系都应该是稳定方向依赖的,包要依赖的包要比自己更具有稳定性。
-# 面向对象的三大特性
+# 三大特性
## 1. 封装
-利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户是无需知道对象内部的细节,但可以通过该对象对外的提供的接口来访问该对象。
+利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。
封装有三大好处:
-1. 良好的封装能够减少耦合。
-2. 类内部的结构可以自由修改。
-3. 可以对成员进行更精确的控制。
-4. 隐藏信息,实现细节。
+1. 减少耦合
+2. 隐藏内部细节,因此内部结构可以自由修改
+3. 可以对成员进行更精确的控制
以下 Person 类封装 name、gender、age 等属性,外界只能通过 get() 方法获取一个 Person 对象的 name 属性和 gender 属性,而无法获取 age 属性,但是 age 属性可以供 work() 方法使用。
-注意到 gender 属性使用 int 数据类型进行存储,封装使得用户注意不到这种实现细节。并且在需要修改使用的数据类型时,也可以在不影响客户端代码的情况下进行。
+注意到 gender 属性使用 int 数据类型进行存储,封装使得用户注意不到这种实现细节。并且在需要修改 gender 属性使用的数据类型时,也可以在不影响客户端代码的情况下进行。
```java
public class Person {
@@ -147,7 +154,7 @@ public class Person {
if(18 <= age && age <= 50) {
System.out.println(name + " is working very hard!");
} else {
- System.out.println(name + " can't work!");
+ System.out.println(name + " can't work any more!");
}
}
}
@@ -155,23 +162,27 @@ public class Person {
## 2. 继承
-继承实现了 **is-a** 关系,例如 Cat 和 Animal 就是一种 is-a 关系,因此可以将 Cat 继承自 Animal,从而获得 Animal 非 private 的属性和方法。
+继承实现了 **IS-A** 关系,例如 Cat 和 Animal 就是一种 IS-A 关系,因此 Cat 可以继承自 Animal,从而获得 Animal 非 private 的属性和方法。
-Cat 可以当做 Animal 来使用,也就是可以使用 Animal 引用 Cat 对象,这种子类转换为父类称为 **向上转型** 。
-
-继承应该遵循里氏替换原则:当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有 is-a 关系。
+Cat 可以当做 Animal 来使用,也就是说可以使用 Animal 引用 Cat 对象。父类引用指向子类对象称为 **向上转型** 。
```java
Animal animal = new Cat();
```
+继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。
+
## 3. 多态
-多态分为编译时多态和运行时多态。编译时多态主要指方法的重装,运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定。
+多态分为编译时多态和运行时多态。编译时多态主要指方法的重载,运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定。
-多态有三个条件:1. 继承;2. 覆盖父类方法;3. 向上转型。
+运行时多态有三个条件:
-下面的代码中,乐器类(Instrument)有两个子类:Wind 和 Percussion,它们都覆盖了 play() 方法,并且在 main() 方法中使用父类 Instrument 来引用 Wind 和 Percussion 对象。在 Instrument 引用调用 play() 方法时,会执行实际引用对象所在类的 play() 方法,而不是 Instrument 类的方法。
+1. 继承
+2. 覆盖
+3. 向上转型
+
+下面的代码中,乐器类(Instrument)有两个子类:Wind 和 Percussion,它们都覆盖了父类的 play() 方法,并且在 main() 方法中使用父类 Instrument 来引用 Wind 和 Percussion 对象。在 Instrument 引用调用 play() 方法时,会执行实际引用对象所在类的 play() 方法,而不是 Instrument 类的方法。
```java
public class Instrument {
@@ -202,54 +213,51 @@ public class Music {
}
}
}
-
```
-
-
# UML
## 1. 类图
-**1.1 继承相关**
+### 1.1 继承相关
-继承有两种形式 : 泛化(generalize)和实现(realize),表现为 is-a 关系。
+继承有两种形式 : 泛化(Generalize)和实现(Realize),表现为 IS-A 关系。
-① 泛化关系 (generalization)
+**泛化关系 (Generalize)**
-从具体类中继承
+从具体类中继承。
-② 实现关系 (realize)
+**实现关系 (Realize)**
-从抽象类或者接口中继承
+从抽象类或者接口中继承。
-**1.2 整体和部分**
+### 1.2 整体和部分
-① 聚合关系 (aggregation)
+**聚合关系 (Aggregation)**
表示整体由部分组成,但是整体和部分不是强依赖的,整体不存在了部分还是会存在。以下表示 B 由 A 组成:
-② 组合关系 (composition)
+**组合关系 (Composition)**
和聚合不同,组合中整体和部分是强依赖的,整体不存在了部分也不存在了。比如公司和部门,公司没了部门就不存在了。但是公司和员工就属于聚合关系了,因为公司没了员工还在。
-**1.3 相互联系**
+### 1.3 相互联系
-① 关联关系 (association)
+**关联关系 (Association)**
表示不同类对象之间有关联,这是一种静态关系,与运行过程的状态无关,在最开始就可以确定。因此也可以用 1 对 1、多对 1、多对多这种关联关系来表示。比如学生和学校就是一种关联关系,一个学校可以有很多学生,但是一个学生只属于一个学校,因此这是一种多对一的关系,在运行开始之前就可以确定。
-② 依赖关系 (dependency)
+**依赖关系 (Dependency)**
和关联关系不同的是 , 依赖关系是在运行过程中起作用的。一般依赖作为类的构造器或者方法的参数传入。双向依赖时一种不好的设计。
@@ -257,13 +265,11 @@ public class Music {
## 2. 时序图
-http://www.cnblogs.com/wolf-sun/p/UML-Sequence-diagram.html
-
-**2.1 定义**
+### 2.1 定义
时序图描述了对象之间传递消息的时间顺序,它用来表示用例的行为顺序。它的主要作用是通过对象间的交互来描述用例(注意是对象),从而寻找类的操作。
-**2.2 赤壁之战时序图**
+### 2.2 赤壁之战时序图
从虚线从上往下表示时间的推进。
@@ -295,19 +301,19 @@ public class 孙权 {
}
```
-**2.3 活动图、时序图之间的关系**
+### 2.3 活动图、时序图之间的关系
活动图示从用户的角度来描述用例;
时序图是从计算机的角度(对象间的交互)描述用例。
-**2.4 类图与时序图的关系**
+### 2.4 类图与时序图的关系
类图描述系统的静态结构,时序图描述系统的动态行为。
-**2.5 时序图的组成**
+### 2.5 时序图的组成
-① 对象
+**对象**
有三种表现形式
@@ -319,13 +325,13 @@ public class 孙权 {
2. 把初始化整个交互活动的对象(有时是一个参与者)放置在最左边。
-② 生命线
+**生命线**
生命线从对象的创建开始到对象销毁时终止
-③ 消息
+**消息**
对象之间的交互式通过发送消息来实现的。
@@ -345,17 +351,17 @@ public class 孙权 {
4\. 返回消息,可选。
-④ 激活
+**激活**
生命线上的方框表示激活状态,其它时间处于休眠状态。
-
# 参考资料
- Java 编程思想
-- [ 面向对象设计的 SOLID 原则 ](http://www.cnblogs.com/shanyou/archive/2009/09/21/1570716.html)
-- [ 看懂 UML 类图和时序图 ](http://design-patterns.readthedocs.io/zh_CN/latest/read_uml.html#generalization)
+- 敏捷软件开发:原则、模式与实践
+- [面向对象设计的 SOLID 原则](http://www.cnblogs.com/shanyou/archive/2009/09/21/1570716.html)
+- [看懂 UML 类图和时序图](http://design-patterns.readthedocs.io/zh_CN/latest/read_uml.html#generalization)
- [UML 系列——时序图(顺序图)sequence diagram](http://www.cnblogs.com/wolf-sun/p/UML-Sequence-diagram.html)
-- [ 面向对象编程三大特性 ------ 封装、继承、多态 ](http://blog.csdn.net/jianyuerensheng/article/details/51602015)
+- [面向对象编程三大特性 ------ 封装、继承、多态](http://blog.csdn.net/jianyuerensheng/article/details/51602015)
From 084d7b4c7ef78c530bea1c4d8c04bd903bbff6b2 Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Wed, 14 Mar 2018 10:29:47 +0800
Subject: [PATCH 05/23] auto commit
---
notes/HTTP.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/notes/HTTP.md b/notes/HTTP.md
index bb0a2577..f15399f0 100644
--- a/notes/HTTP.md
+++ b/notes/HTTP.md
@@ -79,9 +79,9 @@ URI 包含 URL 和 URN,目前 WEB 只有 URL 比较流行,所以见到的基
## POST:传输实体主体
-POST 主要目的不是获取资源,而是传输实体主体数据。
+POST 主要目的不是获取资源,而是传输存储在内容实体中的数据。
-GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体部分。
+GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在内容实体。
```
GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1
From 9368063a3d1b916b4837a36b264dd21314bfe4e2 Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Wed, 14 Mar 2018 10:56:07 +0800
Subject: [PATCH 06/23] auto commit
---
notes/HTTP.md | 57 +++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 49 insertions(+), 8 deletions(-)
diff --git a/notes/HTTP.md b/notes/HTTP.md
index f15399f0..eed61009 100644
--- a/notes/HTTP.md
+++ b/notes/HTTP.md
@@ -1,4 +1,5 @@
+* [学习资源](#学习资源)
* [基础概念](#基础概念)
* [Web 基础](#web-基础)
* [URL](#url)
@@ -8,10 +9,11 @@
* [POST:传输实体主体](#post传输实体主体)
* [HEAD:获取报文首部](#head获取报文首部)
* [PUT:上传文件](#put上传文件)
+ * [PATCH:对资源进行部分修改](#patch对资源进行部分修改)
* [DELETE:删除文件](#delete删除文件)
* [OPTIONS:查询支持的方法](#options查询支持的方法)
- * [TRACE:追踪路径](#trace追踪路径)
* [CONNECT:要求用隧道协议连接代理](#connect要求用隧道协议连接代理)
+ * [TRACE:追踪路径](#trace追踪路径)
* [HTTP 状态码](#http-状态码)
* [2XX 成功](#2xx-成功)
* [3XX 重定向](#3xx-重定向)
@@ -43,6 +45,11 @@
+# 学习资源
+
+- [图解 HTTP](https://pan.baidu.com/s/1M0AHXqG9sP9Bxne6u0JK8A)
+- [MDN : HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP)
+
# 基础概念
## Web 基础
@@ -86,13 +93,14 @@ GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以
```
GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1
```
+
```
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
```
-GET 的传参方式相比于 POST 安全性较差,因为 GET 传的参数在 URL 是可见的,可能会泄露私密信息。并且 GET 只支持 ASCII 字符,如果参数为中文则可能会出现乱码,而 POST 支持标准字符集。
+GET 的传参方式相比于 POST 安全性较差,因为 GET 传的参数在 URL 中是可见的,可能会泄露私密信息。并且 GET 只支持 ASCII 字符,如果参数为中文则可能会出现乱码,而 POST 支持标准字符集。
## HEAD:获取报文首部
@@ -102,33 +110,66 @@ GET 的传参方式相比于 POST 安全性较差,因为 GET 传的参数在 U
## PUT:上传文件
-由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般 WEB 网站不使用该方法。
+由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不使用该方法。
+
+```html
+PUT /new.html HTTP/1.1
+Host: example.com
+Content-type: text/html
+Content-length: 16
+
+New File
+```
+
+## PATCH:对资源进行部分修改
+
+PUT 也可以用于修改资源,但是只能完全替代原始资源,PATCH 允许部分修改。
+
+```html
+PATCH /file.txt HTTP/1.1
+Host: www.example.com
+Content-Type: application/example
+If-Match: "e0023aa4e"
+Content-Length: 100
+
+[description of changes]
+```
## DELETE:删除文件
与 PUT 功能相反,并且同样不带验证机制。
+```html
+DELETE /file.html HTTP/1.1
+```
+
## OPTIONS:查询支持的方法
查询指定的 URL 能够支持的方法。
会返回 Allow: GET, POST, HEAD, OPTIONS 这样的内容。
+## CONNECT:要求用隧道协议连接代理
+
+要求在于代理服务器通信时建立隧道,使用 SSL(Secure Sokets Layer,安全套接字)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
+
+```html
+CONNECT www.example.com:443 HTTP/1.1
+```
+
+
+
## TRACE:追踪路径
服务器会将通信路径返回给客户端。
发送请求时,在 Max-Forwards 首部字段中填入数值,每经过一个服务器就会减 1,当数值为 0 时就停止传输。
-TRACE 一般不会使用,并且它容易受到 XST 攻击(Cross-Site Tracing,跨站追踪),因此更不会去使用它。
+通常不会使用 TRACE,并且它容易受到 XST 攻击(Cross-Site Tracing,跨站追踪),因此更不会去使用它。
-## CONNECT:要求用隧道协议连接代理
-主要使用 SSL(Secure Sokets Layer,安全套接字)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
-
-
# HTTP 状态码
From 68b8b0153afefb7831ca37e52e83eda903cdcc0e Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Wed, 14 Mar 2018 10:58:12 +0800
Subject: [PATCH 07/23] auto commit
---
notes/HTTP.md | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/notes/HTTP.md b/notes/HTTP.md
index eed61009..781a948b 100644
--- a/notes/HTTP.md
+++ b/notes/HTTP.md
@@ -1,5 +1,4 @@
-* [学习资源](#学习资源)
* [基础概念](#基础概念)
* [Web 基础](#web-基础)
* [URL](#url)
@@ -42,14 +41,10 @@
* [各版本比较](#各版本比较)
* [HTTP/1.0 与 HTTP/1.1 的区别](#http10-与-http11-的区别)
* [HTTP/1.1 与 HTTP/2.0 的区别](#http11-与-http20-的区别)
+* [参考资料](#参考资料)
-# 学习资源
-
-- [图解 HTTP](https://pan.baidu.com/s/1M0AHXqG9sP9Bxne6u0JK8A)
-- [MDN : HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP)
-
# 基础概念
## Web 基础
@@ -470,3 +465,8 @@ HTTP1.1 的首部带有大量信息,而且每次都要重复发送,HTTP/2.0
**二进制格式**
HTTP1.1 的解析是基于文本的,而 HTTP2.0 采用二进制格式。
+
+# 参考资料
+
+- [图解 HTTP](https://pan.baidu.com/s/1M0AHXqG9sP9Bxne6u0JK8A)
+- [MDN : HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP)
From 4dbc5213aaea47571ed53fea36e4d085d0161d59 Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Wed, 14 Mar 2018 11:10:23 +0800
Subject: [PATCH 08/23] auto commit
---
notes/HTTP.md | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/notes/HTTP.md b/notes/HTTP.md
index 781a948b..f9a5647f 100644
--- a/notes/HTTP.md
+++ b/notes/HTTP.md
@@ -75,7 +75,7 @@ URI 包含 URL 和 URN,目前 WEB 只有 URL 比较流行,所以见到的基
# HTTP 方法
-客户端发送的请求报文第一行为请求行,包含了方法字段。
+客户端发送的 **请求报文** 第一行为请求行,包含了方法字段。
## GET:获取资源
@@ -164,11 +164,9 @@ CONNECT www.example.com:443 HTTP/1.1
-
-
# HTTP 状态码
-服务器返回的响应报文中第一行为状态行,包含了状态码以及原因短语,来告知客户端请求的结果。
+服务器返回的 **响应报文** 中第一行为状态行,包含了状态码以及原因短语,用来告知客户端请求的结果。
| 状态码 | 类别 | 原因短语 |
| --- | --- | --- |
@@ -184,7 +182,7 @@ CONNECT www.example.com:443 HTTP/1.1
- **204 No Content** :请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。
-- **206 Partial Content**
+- **206 Partial Content** :表示客户端进行了范围请求。响应报文包含由 Content-Range 指定范围的实体内容。
## 3XX 重定向
@@ -192,7 +190,7 @@ CONNECT www.example.com:443 HTTP/1.1
- **302 Found** :临时性重定向
-- **303 See Other**
+- **303 See Other** :和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源。
- 注:虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会 在 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法。
@@ -202,9 +200,9 @@ CONNECT www.example.com:443 HTTP/1.1
## 4XX 客户端错误
-- **400 Bad Request** :请求报文中存在语法错误
+- **400 Bad Request** :请求报文中存在语法错误。
-- **401 Unauthorized** :该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。如果之前已进行过一次请求,则表示用户认证失败。
+- **401 Unauthorized** :该状态码表示发送的请求需要有认证信息(BASIC 认证、DIGEST 认证)。如果之前已进行过一次请求,则表示用户认证失败。
@@ -214,9 +212,9 @@ CONNECT www.example.com:443 HTTP/1.1
## 5XX 服务器错误
-- **500 Internal Server Error** :服务器正在执行请求时发生错误
+- **500 Internal Server Error** :服务器正在执行请求时发生错误。
-- **503 Service Unavilable** :该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
+- **503 Service Unavilable** :服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
# HTTP 首部
From 5082b8c1a5d7dbabdcbe1c884123215a2dba5b1d Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Wed, 14 Mar 2018 11:23:59 +0800
Subject: [PATCH 09/23] auto commit
---
notes/HTTP.md | 29 ++++++++++++++++++++++++-----
1 file changed, 24 insertions(+), 5 deletions(-)
diff --git a/notes/HTTP.md b/notes/HTTP.md
index f9a5647f..7d7c1ee0 100644
--- a/notes/HTTP.md
+++ b/notes/HTTP.md
@@ -295,18 +295,37 @@ CONNECT www.example.com:443 HTTP/1.1
HTTP 协议是无状态的,主要是为了让 HTTP 协议尽可能简单,使得它能够处理大量事务。HTTP/1.1 引入 Cookie 来保存状态信息。
-服务器发送的响应报文包含 Set-Cookie 字段,客户端得到响应报文后把 Cookie 内容保存到浏览器中。下次再发送请求时,从浏览器中读出 Cookie 值,在请求报文中包含 Cookie 字段,这样服务器就知道客户端的状态信息了。Cookie 状态信息保存在客户端浏览器中,而不是服务器上。
+Cookie 是服务器发送给客户端的数据,该数据会被保存在浏览器中,并且在下一次发送请求时包含该数据。通过 Cookie 可以让服务器知道两个请求是否来自于同一个客户端,从而实现保持登录状态等功能。
-
+**创建过程**
-Set-Cookie 字段有以下属性:
+服务器发送的响应报文包含 Set-Cookie 字段,客户端得到响应报文后把 Cookie 内容保存到浏览器中。
+
+```html
+HTTP/1.0 200 OK
+Content-type: text/html
+Set-Cookie: yummy_cookie=choco
+Set-Cookie: tasty_cookie=strawberry
+
+[page content]
+```
+
+客户端之后发送请求时,会从浏览器中读出 Cookie 值,在请求报文中包含 Cookie 字段。
+
+```html
+GET /sample_page.html HTTP/1.1
+Host: www.example.org
+Cookie: yummy_cookie=choco; tasty_cookie=strawberry
+```
+
+**Set-Cookie**
| 属性 | 说明 |
| -- | -- |
| NAME=VALUE | 赋予 Cookie 的名称和其值(必需项) |
| expires=DATE | Cookie 的有效期(若不明确指定则默认为浏览器关闭前为止) |
| path=PATH | 将服务器上的文件目录作为 Cookie 的适用对象(若不指定则默认为文档所在的文件目录) |
-| domain= 域名 | 作为 Cookie 适用对象的域名(若不指定则默认为创建 Cookie 的服务器的域名) |
+| domain=域名 | 作为 Cookie 适用对象的域名(若不指定则默认为创建 Cookie 的服务器的域名) |
| Secure | 仅在 HTTPS 安全通信时才会发送 Cookie |
| HttpOnly | 加以限制,使 Cookie 不能被 JavaScript 脚本访问 |
@@ -320,7 +339,7 @@ Session 是服务器用来跟踪用户的一种手段,每个 Session 都有一
**使用 Cookie 实现用户名和密码的自动填写**
-网站脚本会自动从 Cookie 中读取用户名和密码,从而实现自动填写。
+网站脚本会自动从保存在浏览器中的 Cookie 读取用户名和密码,从而实现自动填写。
## 缓存
From 5764d220a7209096b1701b13b5b00b4c5c9cb10f Mon Sep 17 00:00:00 2001
From: CyC2018 <1029579233@qq.com>
Date: Wed, 14 Mar 2018 11:35:16 +0800
Subject: [PATCH 10/23] auto commit
---
notes/HTTP.md | 23 +++++++++++++++---
pics/e84dd187-779f-4ffc-8ccc-40d8c03f5324.jpg | Bin 0 -> 55296 bytes
2 files changed, 20 insertions(+), 3 deletions(-)
create mode 100644 pics/e84dd187-779f-4ffc-8ccc-40d8c03f5324.jpg
diff --git a/notes/HTTP.md b/notes/HTTP.md
index 7d7c1ee0..34f482ca 100644
--- a/notes/HTTP.md
+++ b/notes/HTTP.md
@@ -343,11 +343,28 @@ Session 是服务器用来跟踪用户的一种手段,每个 Session 都有一
## 缓存
-有两种缓存方法:让代理服务器进行缓存和让客户端浏览器进行缓存。
+**优点**
-Cache-Control 用于控制缓存的行为。Cache-Control: no-cache 有两种含义,如果是客户端向缓存服务器发送的请求报文中含有该指令,表示客户端不想要缓存的资源;如果是源服务器向缓存服务器发送的响应报文中含有该指令,表示缓存服务器不能对资源进行缓存。
+1. 降低服务器的负担;
+2. 提高响应速度(缓存资源比服务器上的资源离客户端更近)。
-Expires 字段可以用于告知缓存服务器该资源什么时候会过期。当首部字段 Cache-Control 有指定 max-age 指令时,比起首部字段 Expires,会优先处理 max-age 指令。
+**实现方法**
+
+1. 让代理服务器进行缓存;
+2. 让客户端浏览器进行缓存。
+
+
+
+**Cache-Control**
+
+该字段用于控制缓存的行为。Cache-Contro : no-cache 有两种含义:
+
+1. 如果是客户端向缓存服务器发送的请求报文中含有该指令,表示客户端不想要缓存的资源;
+2. 如果是源服务器向缓存服务器发送的响应报文中含有该指令,表示缓存服务器不能对资源进行缓存。
+
+**过期时间**
+
+Expires 字段可以用于告知缓存服务器该资源什么时候会过期。当首部字段 Cache-Control 有指定 max-age 指令时,比起 Expires 字段,会优先处理 max-age 指令。
## 持久连接
diff --git a/pics/e84dd187-779f-4ffc-8ccc-40d8c03f5324.jpg b/pics/e84dd187-779f-4ffc-8ccc-40d8c03f5324.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..76c44279055b4a2b6d006130a884278bec06a0ec
GIT binary patch
literal 55296
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 $wTJc3o?HJn~oWNI=
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 |