1. web开发流程
(1) HTML、CSS、JS、图片等资源通过浏览器进行整合,最终渲染出所需画面。
(2)浏览器对Web服务器进行资源请求
浏览器通过url请求资源。【HTTP协议、URL:确定唯一的一个资源】
浏览器请求资源过程中可能出现的结果:----去书店买书
- URL中指定的Web服务器进程不存在(主机或端口出现错误)----该地址所对应的书店不存在
- URL连接到对应的Web服务器进程,但是路径对应的资源不存在----书店存在,书不存在
- URL连接到Web服务器进程,并且路径对应的资源也存在,但是在处理响应的过程中,出现错误(主要发生在动态资源上)----老板当场写书,写书过程中出错
- 一切正常,给出响应
(3) Web服务器
服务器管理诸多资源,以树形结构进行管理。资源包括静态资源和动态资源。
静态资源:提前已经把内容准备好的资源
动态资源:在请求到达后,根据实际情况,运行代码生成内容的资源
(4)以下说法较为绝对
- 网站:多个相互关联的网页组成
- 网页:一个HTML+其他与之关联的资源(CSS、JS、图片、其他)组成
- 每个资源对应一个唯一的URL,浏览器每次获取一个资源,都需要向对应的Web服务器经历一次HTTP请求/响应的过程。
- 请求一次URL对应的资源,可能成功、可能失败。
- Web服务器以静态、动态的方式生成资源内容。
2. HTTP(Hyper Text Transfer protocol)协议
HTTP协议又称超文本传输协议,是一种应用层协议。http协议目前版本有http1.0、http1.1、http2.0(之前基于TCP实现)、http3.0 (基于UDP实现)版本,以下主要以http1.1作为重点理解。
HTTP是请求-响应工作模式:浏览器处于主动地位,服务器处于被动地位。
2.1 请求(Request)报文格式
请求的主体是客户端,是由客户端进行发起的。
请求中的内容必须有一定的格式。——Web服务器端只能看见请求中的东西。
- 本次请求的是哪个url
- 本次请求的动作:是从浏览器提交内容给服务器 / 浏览器从服务器取东西
- 本次请求遵循的是哪个版本的http协议
- 本次请求的专门的描述
- 本次请求假如是从向服务器提交内容,则内容放在哪里?
格式:
- 请求行(请求方法、请求资源url(路径)、请求版本)
- 请求头们:请求报文的属性,冒号分隔的键值对,每组属性各占一行(Name1:Value1 Name2:Value2...)
- 请求体
2.2 响应(Response)报文格式
响应的主体是服务器,由服务器被动发起的。
【注:无论资源是否存在的情况下,服务器能响应一次的请求的前提是,浏览器发起的请求满足:
主机是存在的、端口是存在的、没有防火墙阻拦网络连接】
格式:
响应行:响应的协议版本信息+状态(状态码+状态描述)
响应头:响应报文的属性,冒号分隔的键值对,每组属性各占一行。Name:Value\r\n...
响应体:资源的内容(一般响应是有响应体的)
2.3 HTTP报文中空行存在的原因
因为HTTP协议并没有规定报头部分的键值对有多少个,空行就相当于是“报头的结束标记”,或者是“报头和正文之间的分隔符”。
3. HTTP常用的方法
方法 | 说明 |
---|---|
GET | 获取资源 |
POST | 传输实体主体 |
PUT | 传输文件 |
HEAD | 和 GET 类似,但只返回报文首部,不返回报文实体主体部分 |
DELETE | 删除文件 |
OPTIONS | 询问支持的方法(查询指定的 URL 支持的方法) |
TRACE | 追踪路径(服务器会将通信路径返回给客户端) |
CONNECT | 要求用隧道协议连接代理 |
LINK | 建立和资源之间的联系 |
UNLINK | 断开连接关系 |
4. GET和POST的区别
- 在浏览器地址栏输入URL,发起的是GET请求 <a href=“...”><img src="..."><link href="..."><script src="...">也是GET请求
- post 请求发送目前有难度,只有通过from表单进行提交时采用post方法 <form action="post"></from>
web服务器中的资源:
(1)具有唯一的路径
(2)支持的方法:
- 对于静态资源:默认既支持get又支持post
- 对于动态资源:一般会进行配置,没有配置过的,一般是全支持!
经典面试题:谈谈get和post的区别
- 语义不同:GET一般用来获取数据;POST一般用于提交数据
- GET的body一般为空,需要传递的数据通过query string传递,POST的query string一般为空,需要的数据通过body传递
- GET请求一般是幂等的,POST请求一般是不幂等的(如果多次请求得到的结果 一样,就视为请求是幂等的)
- GET可以被缓存,POST不能被缓存(承接幂等性)
补充说明:
- 关于语义:GET也可以用来提交数据,POST也可以来获取数据,不过是根据字面进行更为合适而已。
- 关于幂等性:标准建议GET实现是幂等的,但是实际应用中也未必全部遵守此规则(主流网站“猜你喜欢”功能,会根据用户的历史行为实时更新现有的结果)。
- 关于安全性:“POST比GET更安全的说法”是不太科学的。安全与否取决于前端在传输密码等敏感信息是否进行加密操作,与GET / POST无关。
- 关于传输数据量:“GET传输数据量小,POST传输数据量大”,这个也是不科学的。标准并未规定GET的url长度,也没有规定POST的body长度,传输数据量的多少,完全取决于不同浏览器和不同服务器之间的实现区别。
- 关于传输数据类型:“GET 只能传输文本数据,POST可以传输二进制数据”,这个说法也是不科学 的。GET的query string虽然无法直接传输二进制数据,但是可以针对二进制数据进行url encode。
5. 关于请求报头(header)
header的整体格式是“键值对”结构,每个键值对占一行,键和值之间使用分号分割。
介绍几个常见的报头:
- Host:表示服务器主机的地址和端口(127.0.0.1)
- Content-Length:表示body中的数据长度
- Content-Type:表示请求的body中的数据格式
- User-Agent:表示浏览器/操作系统的属性
- Referer:表示这个页面是从哪个页面跳转过来的
- ...........