Http 协议详解

超文本传输协议,英文 HyperText Transfer Protocol
互联用中应用最广泛的网络协议。

组成

请求消息

  • 请求行
    包括请求方法资源路径协议版本,中间由空格隔开。
    例如:GET /image/logo.gif HTTP/1.1
  • 请求头
    key:value 形式的键值对,例如 Accept-Language: en
  • 空行
  • 消息体
    GET请求无消息体。

注:请求行和请求头的键值对都必须以 <CR><LF> 作为结尾。在 HTTP/1.1 协议中,请求头除 Host 外,都是可选的。

响应消息

  • 响应行
    包括协议版本状态码状态描述,中间由空格隔开。例如 HTTP/1.1 200 OK
  • 响应头
    key: value 形式的键值对,例如 Content-Type: text/html
  • 空行
  • 响应体

注:响应行和响应头的键值对都必须以 <CR><LF> 作为结尾

状态码

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——需要后续操作才能完成这一请求
  • 4xx请求错误——请求含有词法错误或者无法被执行
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误

常见状态码及状态描述语
200 OK 请求成功
302 Found 重定向
304 Not Modified 客户端原缓冲资源可用
400 Bad Request 请求语法出错
401 Unauthorized 请求头认证未通过
403 Forbidden 资源禁止访问
404 Not Found 未找到指定位置的资源
405 Method Not Allowed 请求方法不适用
500 Internal Server Error 服务端程序出错
502 Bad Gateway 网关出错
504 Gateway Timeout 网关响应超时

请求方法

HTTP/1.1协议中共定义了八种方法来操作指定的资源:

  • OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。
  • HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。
  • GET:向指定的资源发出“显示”请求。
  • POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。
  • PUT:向指定资源位置上传其最新内容。
  • DELETE:请求服务器删除Request-URI所标识的资源。
  • TRACE:回显服务器收到的请求,主要用于测试或诊断。
  • CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的通常用于SSL加密服务器的链接。

GET 和 POST 的区别

  • GET 请求是以 ? 分割 URL 和传输数据,数据是以 & 隔开拼接而成的。POST是把数据放到 HTTP 请求体中。在 HTTP 协议中两种方式都是不安全的。
  • GET 原则上没有长度限制,个别浏览器和服务器会对长度有要求。POST 数据是没有限制的,取决于服务器处理程序的处理能力。
  • GET 请求通常是幂等的,即一次请求与多次请求在服务器看来是无区别的,或者说是无副作用的。通常用来请求资源,而 POST 通常用来新增或修改服务器服务器服务器资源的。可以假想如果用 GET 方法来删除服务器资源,网络爬虫带来的后果不堪设想。

URI 和 URL 的区别

URI,是 Uniform Resource Identifier 的缩写,意思为统一资源标识符,用来唯一标识一个服务器资源。
URL,是 Uniform Resource Locator 的缩写,意思为统一资源定位符。不仅可以唯一标识一个资源,还可以通过访问定位到这个资源。URL 是 URI 的子集。

HTTP 版本区别

  • HTTP/0.9
    已过时。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。
  • HTTP/1.0
    这是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用,特别是在代理服务器中。
  • HTTP/1.1
    持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。详见 RFC 7230
  • HTTP/2.0
    HTTP/2的目标包括异步连接复用,头压缩和请求反馈管线化并保留与HTTP 1.1的完全语义兼容。详见 RFC 7540

参考

http维基百科
ranyonsue的cnblog
get和post的区别

显示 Gitment 评论