这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
HTTP工作过程
HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的应用层协议。
1.基于某个特定的传输层协议(TCP)之上 2.描述业务 3.非OS系统
当我们在浏览器中输入一个 “网址”, 此时浏览器就会给对应的服务器发送一个 HTTP 请求. 对方服务器收到这个请求之后, 经过计算处理, 就会返回一个 HTTP 响应。
事实上, 当我们访问一个网站的时候, 可能涉及不止一次的 HTTP 请求/响应 的交互过程。
回到目录…
HTTP 协议格式
注意: 为什么 HTTP 报文中要存在空行呢?
因为 HTTP 协议并没有规定报头部分的键值对有多少个,使用空行就相当于是报文的结束标记或报文和正文之间的分隔符 HTTP 在传输层依赖 TCP 协议,TCP 是面向字节流的。如果没有这个空行,就会出现”粘包问题“ 回到目录…
请求(Request)格式
URL格式 URL (Uniform Resource Locator 统一资源定位符),互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
URL的具体格式:
资源在哪台主机上——域名 (domain) 或者ip来体现一主机 (host) 和主机上的哪个进程去获取资源——端口 (port) 具体定位到是该进程管理的哪个资源——资源路径/路径 (path) URL设计之处,不仅仅为HTTP协议使用。所以需要标识出本次资源对应的协议(protocol / schema) 针对本次请求,除了资源本身之外的特殊要求。(查询字符串 query string、文档片段 fragment)
GET 请求的特点:
首行里面的第一个部分就是 GET URL 里面的 query string 可以为空,也可以不为空 %E8%9B%8B%E7%B3%95 GET 请求的 header 有若干个键值对结构 GET 请求的 body 一般是空的 GET 请求示例: 搜狗首页请求
POST 方法 POST 方法也是一种常见的方法,多用于提交用户输入的数据给服务器(如登录页面)。
POST 请求的特点:
首行第一个部分就是 POST URL 里面的 query string 一般是空的 POST 请求的 header 里面有若干个键值对 POST 请求的 body 一般不为空(body 的具体数据格式,由 header 中的 Content-Type 来描述; body 的具体数据长度,由 header 中的 Content-Length 来描述 POST 请求示例: QQ 邮箱登录请求
GET vs POST 我们平时构建发送的 GET/POST请求:
GET
-
地址栏输入url回车
-
通过一些标签
;、
-
ajax
-
重定向(redirect) POST 1.
-
ajax
-
重定向(redirect)
GET 和 POST 的区别
GET 和 POST 其实没有本质区别,使用 GET 的场景完全可以使用 POST 代替,使用 POST 的场景一样可以使用 GET 代替。但是在具体的使用上,还是存在一些细节的区别
GET 习惯上会把客户端的数据通过 query string 来传输(body 部分是空的);POST 习惯上会把客户端的数据通过 body 来传输(query string 部分是空的)
GET 习惯上用于从服务器获取数据;POST 习惯上是客户端给服务器提交数据
一般情况,程序员会把 GET 请求的处理,实现成“幂等”的;对于 POST 请求的处理,不要求实现成“幂等”
GET 请求可以被缓存,可以被浏览器保存到收藏夹中;POST 请求不能被缓存
回到目录…
协议头(header) header 的整体格式是键值对结构,每个键值对占一行,键和值之间使用 冒号+空格 进行分割
key value Host 表示服务器主机的地址和端口 Content-Length 表示 body 的数据长度,长度单位是字节 Content-Type 表示 body 的数据格式 User-Agent 表示浏览器或者操作系统的属性 Referer 表示这个页面是从哪个页面跳转过来的 Cookie 是浏览器提供的一种让程序员在本地存储数据的能力 Content-Type 有以下三种请求中的数据格式:
application/x-www-form-urlencoded 这是 form 表单提交的数据格式,此时 body 的格式就类似于 query string(是键值对的结构,键值对之间使用 & 分割,键与值之间使用 = 分割
multipart/form-data 这是 form 表单提交的数据格式(需要在 from 标签上加上 enctyped="multipart/form-data"),通常用于 HTML 提交图片或者文件
application/json 此时 body 数据为 json 格式,json 格式就是源自 js 的对象的格式。用一个 { } 括住,里面有多个键值对,键值对之间使用逗号分割,键和值之间使用冒号分割
回到目录…
2-2 响应(Response)格式
2-2-1 状态码 常见的状态码
常见状态码 说明 200 OK 这是一个最常见的状态码, 表示访问成功。抓包抓到的大部分结果都是 200
404 Not Found 没有找到资源。URL 标识的资源不存在, 那么就会出现 404
403 Forbidden 表示访问被拒绝。有的页面通常需要用户具有一定的权限才能访问(登陆后才能访问).。如果用户没有登陆直接访问, 就容易见到 403 405 Method Not Allowed 我们学习了 HTTP 中所支持的方法, 有 GET, POST, PUT, DELETE 等。但是对方的服务器不一定都支持所有的方法(或者不允许用户使用一些其他的方法).
500 Internal Server Error 服务器出现内部错误. 一般是服务器的代码执行过程中遇到了一些特殊情况(服务器异常崩溃)会产生这个状态码,一般很少见
504 Gateway Timeout 当服务器负载比较大的时候, 服务器处理单条请求的时候消耗的时间就会很长, 就可能会导致出现超时的情况
302 Move temporarily 临时重定向。在登陆页面中经常会见到 302. 用于实现登陆成功后自动跳转到主页
301 Moved Permanently 永久重定向。当浏览器收到这种响应时, 后续的请求都会被自动改成新的地址。301 也是通过 Location 字段来表示要重定向到的新地址