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
响应体的内容。一般为服务器请求给我们的数据。