Http | 青训营笔记

61 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

初识http

什么是htttp

超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而 [9]  消息内容则具有一个类似MIME的格式。

工作原理

HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程

(1)客户与服务器建立连接

(2) 客户向服务器提出请求

(3) 服务器接受请求,并根据请求返回相应的文件作为应答

(4) 客户与服务器关闭连接

协议分析

报文

报文格式

请求报文格式: 请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体

应答报文格式:状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体 image.png

状态码

image.png

RESTful API

一种API设计风格

  • 每一个URL代表一种资源
  • 看了护短和服务器之间,传递这种资源的某种表现层
  • 客户端通过HTTP method,对服务器资源进行操作,实现“表现层状态转化”

常用请求头

image.png

常用响应头

image.png

缓存

这里的缓存是指浏览器在本地磁盘当中对访问过的资源保存的副本文件

强缓存

服务器通过设置http中的header的Expires和cach-control字段告诉浏览器缓存的有效期

   Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。

   Expires的值是GMT格式的绝对时间,在设置的时间前浏览器会直接使用本地缓存。

   cache-control有12个值,其中的max-age值定义缓存的有效期,单位是秒,例如:cach-control:max-age=700,它表示缓存有效期为700秒,以消息的生成日期为基准,也就是header中的Date字段。

   cache-control与Expires的区别在于cache-control的值是相对时间,而Expires是绝对时间,如果我们人为的修改了本地的时间,那么此时本地的时间与服务器上的时间不一致,就会导致缓存不能正确得被使用;而如果用相对时间,不管怎么改变本地时间,缓存的有效期都不会改变。

协商缓存

简单地说,协商缓存就是通过服务器来判断缓存是否可用。

   Last-Modified:表示这个响应资源的最后修改时间,web服务器在响应请求时,告诉浏览器资源的最后修改时间。

   If-Modified-Since:当资源过期时(使用cache-control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since则与被请求资源的最后修改时间进行对比。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在相应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应HTTP304(无需包体,节省浏览),告知浏览器继续使用所保存的cache。

   Etag/If-None-Match

   Etag/If-None-Match也要配合Cache-Control使用。

   Etag:web服务器响应求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器决定)。Apache中,Etag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。

   If-None-Match:当资源过期时(使用Cache-Control表示的max-age),发现资源具有Etag声明,则再次向web服务器请求时带上头If-None-Match(Etag的值)。web服务器收到请求后发现有头If-None-Match则与被请求资源的相应校验串进行对比,决定返回200或304。

cookie

储存在用户本地终端上的数据 类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息

image.png

Https

区别就在于他要经过TSL/SSL加密

image.png

对称加密:加密和解密都是用同一个密钥

非对称加密:加密和解密用两个不同的密钥,公钥和私钥

跨域

首先狭义的同源就是指,域名、协议、端口均为相同。 当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。

解决方案

cors

CORS 是一个 W3C 标准,全称是跨域资源共享"(Cross-origin resource sharing)。CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE 浏览器不能低于IE10。它允许浏览器向跨源服务器,发出XMLHttpRequest 请求,从而克服了 AJAX只能同源使用的限制。整个 CORS 通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS 通信与同源的 AJAX 通信没有差别,代码完全一样。浏览器一旦发现 AJAX 请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。因此,实现 CORS 通信的关键是服务器。只要服务器实现了 CORS接口,就可以跨源通信。

代理服务器

大概的意思就是,我们在客服端请求代理服务器,然后代理服务器转发客服端的请求访问服务器,服务器处理后给代理服务器响应数据,然后再代理服务器当中把服务器响应的数据再返回给客户端,客服端和自己搭建的代理服务器之间也存在跨域问题,所以需要设置CORS image.png