1. HTTP是什么?
HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。
应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上的应用程序进程之间如何相互通信的规则和标准。简单来说,应用层协议就是应用程序用来"对话"的语言和约定。
HTTP 协议的常见应用场景:
- 浏览器与服务器之间的交互(访问网站)。
- 手机与服务器之间的通信。
- 多个服务器之间进行通信。
2. HTTP协议的工作过程
HTTP是一个一问一答的过程。

3. HTTP协议格式

3.1 抓包工具的原理

抓包工具就相当于一个中间人,他对客户端的请求与服务器的响应都了解。
3.2 请求报文

请求行:
请求报头:
请求报头的每一行都用一组键值对表示,键与值用:隔开,键值对可以是HTTP规范中的内容,也可以是程序员自定义的内容。
空行:
是分割请求头与真实用户数据的部分。
Body(正文):
空行后面的内容都是Body.Body 允许为空字符串 .如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度;
3.3 响应报文


4. HTTP请求
4.1 认识URL
4.1.1 URL基本格式

4.1.2 URL encode
URL 中的特殊字符都用URLEncode进行编码,每个byte用两个十六进制表示,每个byte前加一个%。
4.1.3 方法

1. GET方法
如何指定请求的方法?
- 当在浏览器的地址栏中输入一个URL并发起访问时,发送的全是GET请求。
- 通过代码(js)发送请求,可以指定GET,POST,PUT,DELETE。
- 通过HTML中的表单来指定方法名。
- 网站加载所需要的一些资源都是使用GET方法,比如网站中中的图片,样式,字体...
GET 请求的特点:1.首行的第一部分为GET。
URL的query string 可以为空,也可以不为空。
header部分有若干个键值对结构。
body部分为空。
2. POST 方法
POST方法也是一种常见的方法,多用于提交用户输入的数据给服务器(例如登陆页面)。
POST请求的特点:
- 首行的第一部分为POST。
- URL的query String一般为空(也可以不为空)。
- header部分有若干个键值对结构。
- body部分一般不为空,body内的数据格式通过header中的Content-type指定。body的长度由header中的Content-length指定。
GET请求是以query String的方式提交参数的,POST的请求参数在Body部分。
经典面试题:谈谈GET和POST的区别?
- 语义不同:GET一般用于获取数据,POST一般用于提交数据。
- GET的body一般为空,需要传递的数据通过queryString传递的,POST的query string一般为空,需要传递的数据通过body传递。
- GET请求一般是幂等(每次访问同一个URL,得到的结构都相同)的,POST请求一般是不幂等的。
- GET可以被缓存在本地(下次再访问的时候就不用通过网络,而是从本地缓存中直接获取),POST不能被缓存(这一点也是承接幂等性的)。
网上有些博客说GET的URL长度(URL + query string)的长度是有限制的,比如说255个字符,1000个字符...,这种说法是完全错误的。HTTP协议的官方说明中表示对URL的长度不做限制,如果受限制了,也是浏览器或者应用程序自身做的限制。
4.2 认识请求报头
1. HOST
表示服务器的主机的地址和端口。
2. Content-Length
表示body中的数据长度,单位是字节。
POST的请求和响应中都有这个字段,只要body中有真实的数据就根据这个长度的值去读取。
3. Content-Type
表示请求的body中是数据格式,包含多种格式,目的是告诉浏览器要用什么格式来解析body中的数据。
常见的几种
application/x-www-form-urlencoded: form
表单提交的数据格式,此时body的格式形如:
java
title=test&content=hello
multipart/form-data: form
表单提交的数据格式(在form标签中加上enctyped="multipart/form-data"
)通常用于提交图片/文件。此时的body格式形如:
java
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3Trw
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"
title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png
PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--
application/json
数据为json格式,body格式形如:
java
{"username":"123456789","password":"xxxx","code":"jw7l","uuid":"d110a05ccde64b16"}
4. User-Agent(简称UA)
表示浏览器/操作系统的属性,形如:
5. Referer
表示页面是从哪个页面跳转过来的。
6. Cookie
作用:在用户的电脑(浏览器)中保存一些简单的数据。
向客户端浏览器写入cookie的两种方式:
- 为header中的set-cookie这个键设置具体的cookie值。
- 通过JS代码的方式去写。
如果使用其他用户(已登录的状态)的cookie访问网站,会出现什么样的情况?最终是以cookie所对应的用户身份去访问网站,这就是cookie欺骗技术。
理解登陆过程:
5. 认识状态码
1. 200
表示访问成功。
表示客户端与服务器之间的请求与响应是没有问题的。
问:客户端进行登陆,输入一个错误的用户名和密码,服务器返回了一个登陆失败的错误提示,这种情况状态码是不是200?
答:是200。虽然输入的用户名和密码是正确的,但是服务器完成了用户名和密码的校验,并返回了一个适当的提示。状态码200表示的是请求与响应是正常的,和业务处理没有问题。
2. 404 Not Found
没有找到资源。
浏览器输入一个URL,目的就是为了访问对方服务器上的一个资源,如果这个URL标识的资源不存在,那么就会出现404.
3. 403 Forbidden
表示访问被拒绝,有的页面通常需要用户具有一定的权限(比如:登陆后才能访问),如果用户没有登陆页面直接访问,就容易见到403.
4. 405 Method Not Allowed
HTTP中支持GET、POST、PUT、DELETE等,但是对方的服务器不一定都支持所有的方法(或者不允许用户使用一些其他的方法)。
如果服务器的某个URL只支持GET方法访问,但用POST、PUT、DELETE方法进行访问的时候就是405.
5. 500 Internal Server Error
服务器出现了内部错误,一般是服务器的代码执行的过程中遇到了一些特殊情况(服务器异常崩溃)会产生这个状态码。
6. 302 Move temporarily
临时重定向:同一个入口根据不同的常见,转发到不同的页面,也可能不转发。
重定向:当前访问的URL并不是最终的地址,当前的请求会被转发,转发到最终的目的页(落地页)。
7. 301 Moved Permanently
永久重定向。当浏览器收到这种响应时,后续的请求都会被自动修改成新的地址。
只要访问这个页面全部无条件重定向,主要应用在新旧系统的迁移。