HTTP

# HTTP

我们能够通过 url 在互联网中找到自己想要的服务。

但是只有服务还不够,双方还需要约定一种语言来进行对话,否则都不懂各自的要求。

这种语言就是协议,而互联网中常见的协议就是 http 协议。

https协议是在http协议基础上发展起来的,它增加了安全性,其他和http协议完全一致。

http 协议是基于 【请求-响应】 的方式完成通信的。每次通信都是由客户端向服务器发起请求,传递一些消息过去,然后经过服务器程序处理后,响应给客户端一些消息。

# http协议规定:

  • 每次【请求-响应】都是独立的,相互之间互不干扰。这种模式我们称之为无状态协议
  • 每次【请求-响应】传递的消息都是纯文本(字符串),而且文本格式必须按照http协议规定的格式来。

# 请求的消息格式

请求的消息格式由三部分组成

  • 请求行:高度高阔了客户端想要什么。
  • 请求头:描述了请求的一些额外信息
  • 请求体:包含了要给服务器传递的正文数据。请求体可以省略。

# 请求行

请求行是整个 http报文的第一行字符串,它包含三个部分:请求方法 路径+参数+hash 协议和版本

请求方法是一个单词,它表达了客户端的动作

  • GET:表示获取
  • POST:表示提交
  • PUT:表示修改
  • DELETE:表示删除

浏览器遵循了上面的规范,这带来了GET 和 POST的区别,比如由于GET请求没有请求体,所以要传递数据只能把数据放到 url 的 参数中。

浏览器自动发出的请求基本都是GET请求,而POST请求需要开发者手动处理,比如在form 表单中设置method为POST

# 请求头 Header

请求头一一系列的键值对。

1、Host:url地址中的主机

2、User-Agent:客户端的信息描述

3、Content-Type:请求体的消息是什么格式,如果没有请求体,这个字段毫无意义

  • application/x-www-form-urlencoded:表示请求体的数据格式和url地址中参数的格式一样(MIME-标准的字符串表达内容格式)
  • application/json:表示请求体的数据是json格式。
  • multipart/form-data:一种特殊的请求体格式,上传文件一般选择该格式。

# 请求体 Body

理论上,请求体可以使任意格式的字符串,但服务器普遍能识别以下格式:

  • application/x-www-form-urlencoded
  • application/json
  • multipart/form-data

由于请求体格式的多样性,服务器在分析请求体时可能无法知晓具体的格式,从而不知道如何解析请求体,因此,服务器往往要求在请求头中附带一个属性Content-Type 来描述请求体使用的格式。

# 响应行

响应行是整个响应字符串的第一行。

包含两个部分:

  • 协议版本:表示服务器打算和客户端用什么协议通信。
  • 状态码、状态消息:表示服务器对当前请求的表态。
分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

通常任务,0~399之间的状态码都是正常的,其他都不正常。

常见的状态码:

1、200 OK: 一切正常。

2、301 Moved Permanently:资源被永久重定向。

表示收到请求,但是资源已经更换了地址,你去请求一个新的地址,地址我放到请求头的Location 中。

浏览器会缓存新地址信息,如果继续使用旧地址访问,浏览器不会再次询问旧地址直接请求新地址。

3、302 Found:资源被临时重定向

浏览器不会缓存新地址信息,而是每次访问旧地址都会先询问旧地址是否要跳转到新的地址中去。

4、304 Not Modified:文档内容未被更改(内容与之前一致)

5、400 Bad Request:语义有误,请求无法被服务器理解。

6、403 Forbidden:服务器拒绝执行。(一般为权限问题)

7、404 Not Found:资源不存在。

8、500 Internal Server Error:服务器内部错误。

# 响应头 header

与请求头一样,响应头也是由多个键值对组成的。对我们最重要的键值对是 Content-Type ,他有多种取值,表示响应体的数据类型。

在 B/S 模式中,浏览器会自动根据相应头中 Content-Type 的取值,决定如何处理响应体。

  • text/plain:普通的纯文本
  • text/html:html文档,浏览器会当做页面进行渲染。
  • text/javascript(application/javascript):js代码,浏览器会使用JS执行引擎将他解析执行
  • text/css:css代码,浏览器会将他视为样式。
  • image/jpeg:浏览器会将他视为图片
  • attachment:附件,通常会触发下载。
  • 其他MIME类型

# 响应体 body

响应体的内容。一般为服务器请求给我们的数据。