请求报文和响应报文:
请求报文:
客户端向服务器发送的请求信息,就叫做请求报文。
客户端发送一个 HTTP 请求到服务器,请求信息包含四部分:请求行、请求头、空行、请求体。
- 请求行:包含三部分,分别是请求方法、请求资源的路径、协议版本。
- 请求头:头信息,告诉服务器一些信息,在客户端和服务器处理时起至关重要作用的信息几乎都在这边。
- 空行:请求头和请求体之间有一个空行来做区分,即使没有请求体,空行也不能少。
- 请求体:请求要发送的内容,不一定有。
GET 请求方法没有请求体,数据通过请求头携带。
POST 请求方法有请求体,数据通过请求体携带。
GET 方式示例:
// 请求行:请求方法是 GET,请求资源的路径是 /0606/01.php,携带的参数是 username=Lee&age=28 ,所用的协议是 HTTP/1.1
GET /0606/01.php?username=Lee&age=28 HTTP/1.1
// 请求头:是一行一行的 key-value
Host: localhost
// 空行
POST 方式示例:
// 请求行:请求方法是 POST,请求资源的路径是 /0606/02.php ,所用的协议是 HTTP/1.1
POST /0606/02.php HTTP1.1
// 请求头:Content-type 表明请求体的类型,Content-length 表明请求体的长度
Host: localhost
Content-type: application/x-www-form-urlencoded
Content-length: 19
// 空行
// 请求体
username=Lee&age=28
响应报文:
服务器返回的响应信息,就叫做响应报文。
一般情况下,服务器接收并处理客户端发过来的请求后会返回一个 HTTP 的响应消息。响应信息包含四部分:响应行、响应头、空行、响应体。
- 响应行:包含三部分,分别是所用的协议版本、状态码、状态文字。
- 响应头:头信息,告诉客户端一些信息,在客户端和服务器处理时起至关重要作用的信息几乎都在这边。
- 空行:响应头和响应体之间有一个空行来做区分,即使没有请求体,空行也不能少。
- 响应体:响应要返回的内容,不一定有。
// 响应行:所用的协议是HTTP/1.1,状态码是200,状态文字是 OK
HTTP/1.1 200 OK
// 响应头
Date:Thu, 06 Jun 2021 12:39:02 GMT
Server: Apache/2.2.21 <Win32> PHP/5.38
X-Powered-By: PHP/5.38
Content-Length: 5
Content-Type: text/html
// 空行
// 响应体
hello
请求方法:
请求方法用来定义对于资源采取什么样的操作,有各自的语义。分别有:GET、POST、PUT、DELETE、HEAD、CONNECT、OPTIONS、TRACE、PATCH。
这些请求方法虽然有各自的语义,但并不是强制性的。
HTTP 里虽然规定了这些请求方法,但 Web 服务器未必全部支持。
- GET:请求服务器中的指定资源。
- HEAD:和 GET 基本一致,但是没有响应体。这一方法可以在不传输整个响应体的情况下,获取响应头中的元信息。
例如:只想知道某个资源是否还存在,而不需要知道具体是什么内容,就可以使用 HEAD,因为此时只需要状态码 200 就可以知道资源仍然存在了。
- POST:将数据发送到服务器以创建资源。
- PUT:将数据发送到服务器以替换整个资源。
- PATCH:将数据发送到服务器以更新部分资源。
- DELETE:请求服务器删除指定资源。
- TRACE:回显服务器收到的请求,主要用于测试或诊断。
例如:使用了代理访问
news.163.com
,如果想要知道代理有没有偷偷修改我们的 HTTP 请求,就可以使用 TRACE 来测试,news.163.com
的服务器就会把最后收到的请求返回回来。 - OPTIONS:返回服务器针对指定资源所支持的 HTTP 请求方法。
- CONNECT:建立一个到目标资源的服务器的隧道,通常用在代理服务器上,网页开发很少用到 。
GET 和 POST 的区别:
-
语义不同:GET 请求用来获取数据;POST 请求用来创建数据。
-
发送数据不同:GET 请求在请求头中携带数据,请求的数据会附在 URL 地址中;POST 请求一般是在请求体中携带数据。
GET 请求的数据会附在 URL 地址中,以
?
分割 URL 和传输数据,多个参数用&
连接。如果数据是英文字母/数字,原样发送,如果是空格,转换为+
,如果是中文/其他字符,则直接把字符串用 BASE64 加密。
POST 请求也可以在请求头中通过 URL 携带数据,这不是 GET 请求专属的特性。 -
传输数据的大小:GET 请求能携带的数据量和 URL 地址的长度有关系,一般最多就几 K;POST 请求能携带的数据量理论上是无限的。但实际上还是有大小限制,但是会比 GET 请求大得多。
-
安全性不同:POST 请求的安全性要比 GET 请求的安全性高一点。GET 请求的数据会在地址栏中显示出来;而 POST 请求的数据,不会在地址栏显示出来。
比如:通过 GET 提交数据,用户名和密码将明文出现在 URL 上,那么(1)登录页面有可能被浏览器缓存;(2)其他人查看浏览器的历史纪录都可以看到这些信息。
但实际上 POST 请求也不安全,打开浏览器的控制台也可以直接看到提交的信息。
HTTP 状态码:
状态码是用来定义服务器响应情况的。 HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型。
状态说明是用来描述状态码的。
HTTP 状态码分类:
1**
:消息,服务器已收到请求,需要继续处理。2**
:成功,服务器成功收到并处理请求。3**
:重定向,服务器需要进一步的操作以完成请求。4**
:客户端错误,请求包含语法错误或无法完成请求。5**
:服务器错误,服务器在处理请求的过程中发生了错误。
常见的 HTTP 状态码:
-
200
:请求成功。 -
301
:永久移动,请求的资源已被永久的移动到新 URI。 -
302
:临时移动,请求的资源已被临时的移动到新 URI。例如:通过 POST 方式提交表单数据到 05.php,但是 05.php 重定向了到 06.php,通过 301 和 302 会发生丢失数据的情况。下图可以看到,05.php 是 POST 请求,但是 06.php 变成了 GET 请求。
可以通过 307 状态码来解决。下图可以看到,05.php 和 06.php 都是 POST 请求。
-
304
:资源未被修改。浏览器通过此资源的标识符告诉服务器它有这个资源,且告诉服务器最后的修改时间,服务器对比资源的标识符和最后的修改时间,如果一致,说明没有更改过资源,就会返回 304。浏览器就可以从缓存中获取资源,减轻了服务器的传输压力。
-
307
:重定向中保持原有的请求数据。 -
400
:客户端请求的语法错误,服务器无法理解。 -
401
:请求要求用户的身份认证。 -
403
:服务器理解客户端的请求,但是拒绝执行。 -
404
:无法找到资源。 -
500
:服务器内部错误,无法完成请求。 -
503
:由于超载或系统维护,服务器暂时的无法处理客户端的请求。
常见的 HTTP 状态说明:
- OK:表示服务器成功返回了页面。
- BadRequest:表示语法错误导致服务器不识别。
- Unauthorized:表示请求需要用户认证。
- Not Found:表示指定的 URL 在服务器上找不到。
- InternalServer Error:表示服务器遇到意外错误。
- Service Unavailable:表示由于服务器过载或维护导致无法完成请求。