您现在的位置是:首页 >其他 >《二》HTTP 请求报文和响应报文、请求方法、状态码网站首页其他

《二》HTTP 请求报文和响应报文、请求方法、状态码

花铛 2023-06-17 00:00:03
简介《二》HTTP 请求报文和响应报文、请求方法、状态码

请求报文和响应报文:

请求报文:

客户端向服务器发送的请求信息,就叫做请求报文。
请添加图片描述

客户端发送一个 HTTP 请求到服务器,请求信息包含四部分:请求行、请求头、空行、请求体。

  1. 请求行:包含三部分,分别是请求方法、请求资源的路径、协议版本。
  2. 请求头:头信息,告诉服务器一些信息,在客户端和服务器处理时起至关重要作用的信息几乎都在这边。
  3. 空行:请求头和请求体之间有一个空行来做区分,即使没有请求体,空行也不能少。
  4. 请求体:请求要发送的内容,不一定有。

    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 的响应消息。响应信息包含四部分:响应行、响应头、空行、响应体。

  1. 响应行:包含三部分,分别是所用的协议版本、状态码、状态文字。
  2. 响应头:头信息,告诉客户端一些信息,在客户端和服务器处理时起至关重要作用的信息几乎都在这边。
  3. 空行:响应头和响应体之间有一个空行来做区分,即使没有请求体,空行也不能少。
  4. 响应体:响应要返回的内容,不一定有。
// 响应行:所用的协议是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 服务器未必全部支持。

  1. GET:请求服务器中的指定资源。
  2. HEAD:和 GET 基本一致,但是没有响应体。这一方法可以在不传输整个响应体的情况下,获取响应头中的元信息。

    例如:只想知道某个资源是否还存在,而不需要知道具体是什么内容,就可以使用 HEAD,因为此时只需要状态码 200 就可以知道资源仍然存在了。

  3. POST:将数据发送到服务器以创建资源。
  4. PUT:将数据发送到服务器以替换整个资源。
  5. PATCH:将数据发送到服务器以更新部分资源。
  6. DELETE:请求服务器删除指定资源。
  7. TRACE:回显服务器收到的请求,主要用于测试或诊断。

    例如:使用了代理访问 news.163.com,如果想要知道代理有没有偷偷修改我们的 HTTP 请求,就可以使用 TRACE 来测试,news.163.com 的服务器就会把最后收到的请求返回回来。

  8. OPTIONS:返回服务器针对指定资源所支持的 HTTP 请求方法。
  9. CONNECT:建立一个到目标资源的服务器的隧道,通常用在代理服务器上,网页开发很少用到 。

GET 和 POST 的区别:

  1. 语义不同:GET 请求用来获取数据;POST 请求用来创建数据。

  2. 发送数据不同:GET 请求在请求头中携带数据,请求的数据会附在 URL 地址中;POST 请求一般是在请求体中携带数据。

    GET 请求的数据会附在 URL 地址中,以 ? 分割 URL 和传输数据,多个参数用 & 连接。如果数据是英文字母/数字,原样发送,如果是空格,转换为 +,如果是中文/其他字符,则直接把字符串用 BASE64 加密。
    POST 请求也可以在请求头中通过 URL 携带数据,这不是 GET 请求专属的特性。

  3. 传输数据的大小:GET 请求能携带的数据量和 URL 地址的长度有关系,一般最多就几 K;POST 请求能携带的数据量理论上是无限的。但实际上还是有大小限制,但是会比 GET 请求大得多。

  4. 安全性不同:POST 请求的安全性要比 GET 请求的安全性高一点。GET 请求的数据会在地址栏中显示出来;而 POST 请求的数据,不会在地址栏显示出来。

    比如:通过 GET 提交数据,用户名和密码将明文出现在 URL 上,那么(1)登录页面有可能被浏览器缓存;(2)其他人查看浏览器的历史纪录都可以看到这些信息。
    但实际上 POST 请求也不安全,打开浏览器的控制台也可以直接看到提交的信息。

HTTP 状态码:

状态码是用来定义服务器响应情况的。 HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型。

状态说明是用来描述状态码的。

HTTP 状态码分类:

  1. 1**:消息,服务器已收到请求,需要继续处理。
  2. 2**:成功,服务器成功收到并处理请求。
  3. 3**:重定向,服务器需要进一步的操作以完成请求。
  4. 4**:客户端错误,请求包含语法错误或无法完成请求。
  5. 5**:服务器错误,服务器在处理请求的过程中发生了错误。

常见的 HTTP 状态码:

  1. 200:请求成功。

  2. 301:永久移动,请求的资源已被永久的移动到新 URI。

  3. 302:临时移动,请求的资源已被临时的移动到新 URI。

    例如:通过 POST 方式提交表单数据到 05.php,但是 05.php 重定向了到 06.php,通过 301 和 302 会发生丢失数据的情况。下图可以看到,05.php 是 POST 请求,但是 06.php 变成了 GET 请求。
    在这里插入图片描述
    可以通过 307 状态码来解决。下图可以看到,05.php 和 06.php 都是 POST 请求。
    在这里插入图片描述

  4. 304:资源未被修改。

    浏览器通过此资源的标识符告诉服务器它有这个资源,且告诉服务器最后的修改时间,服务器对比资源的标识符和最后的修改时间,如果一致,说明没有更改过资源,就会返回 304。浏览器就可以从缓存中获取资源,减轻了服务器的传输压力。

  5. 307:重定向中保持原有的请求数据。

  6. 400:客户端请求的语法错误,服务器无法理解。

  7. 401:请求要求用户的身份认证。

  8. 403:服务器理解客户端的请求,但是拒绝执行。

  9. 404:无法找到资源。

  10. 500:服务器内部错误,无法完成请求。

  11. 503:由于超载或系统维护,服务器暂时的无法处理客户端的请求。

常见的 HTTP 状态说明:

  1. OK:表示服务器成功返回了页面。
  2. BadRequest:表示语法错误导致服务器不识别。
  3. Unauthorized:表示请求需要用户认证。
  4. Not Found:表示指定的 URL 在服务器上找不到。
  5. InternalServer Error:表示服务器遇到意外错误。
  6. Service Unavailable:表示由于服务器过载或维护导致无法完成请求。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。