HTTP协议
前言介绍与引用:
URL
- URL(统一资源定位符,Uniform Resource Locator,或称统一资源定位器、定位地址、URL地址,俗称网页地址或简称网址)
统一资源定位符的标准格式如下:
[协议类型]: //[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]
统一资源定位符的完整格式如下:
[协议类型]: //[访问资源需要的凭证信息]@[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]
其中[访问凭证信息]、[端口号]、[查询]、[片段ID]都属于选填项。 - 超文本传输协议的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址中:
1.传送协议。
2.层级URL标记符号(为[//],固定不变)
3.访问资源需要的凭证信息(可省略)
4.服务器。(通常为域名,有时为IP地址)
5.端口号。(以数字方式表示,若为默认值可省略)
6.路径。(以“/”字符区别路径中的每一个目录名称)
7.查询。(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与资料,通常以UTF8的URL编码,避开字符冲突的问题)
8.片段。以“#”字符为起点 - 以https://zh.wikipedia.org:443/w/index.php?title=Special:随机页面为例, 其中:
1.https,是协议;
2.zh.wikipedia.org,是服务器;
3.443,是服务器上的网络端口号;
4./w/index.php,是路径;
5.?title=Special:随机页面,是询问/查询。
HTTP协议
- HTTP协议是应用层协议。
- 是一个客户端(用户)和服务端(网站)之间请求和应答的标准,通常使用TCP协议。因为尽管TCP/IP协议是互联网上最流行的应用,但是在HTTP协议中并没有规定它必须使用或它支持的层。事实上HTTP可以在任何互联网协议或其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用,所以其在TCP/IP协议族使用TCP作为其传输层。
- 通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。
- HTTP请求信息由3部分组成,分别是请求方法即URI协议,请求头,请求正文;HTTP的响应信息也由3部分组成,分别为状态行,消息报头,响应正文。
请求
常见HTTP请求方法:
GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT(有些请求头带来的安全问题,比如IISPUT)。用的最多的就是 GET 和 POST。
- GET请求
get方法传递参数
请求参数和对应的值附加在URL后面,利用问号代表URL的结尾与请求参数的开始。例如:index.php?id=100&op=bind - GET方法,是最常见的一种请求方式。它要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。点击网页上的链接或者在浏览器输入地址访问网页都是使用的GET方式。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号代表URL的结尾与请求参数的开始,传递参数长度受限制,安全性不够。
- 用POST方式,这种方法可以允许客户端给服务器提供的信息较多。POST方法将请求参数封装在HTTP请求数据中,以名称或者值的形式出现,可以传输大量数据,对传送的数据大小没有限制,而且也不会显示在URL中。
- POST请求中的Content-Length:注明内容长度。
- Content-Type: APPLICATION/X-WWW-FORM-URLENCODED:消息内容会经过URL编码.
- Content-Type:mulpart/form-data:支持文件上传(支持2进制数据)
HTTPS
全称:Hyper Text Transfer Protocol over Secure Socket Layer
- HEAD 方法与 GET 方法类似,但它只返回 HTTP 报头,不会返回文档主体,通常用于需要节省带宽的情况下检测资源的有效性。
- PUT 方法表示新创建一个资源,也即更新资源,多在REST API中被使用。
- DELETE 方法表示删除指定资源,同样多在REST API中被使用。
- OPTIONS 方法可以返回服务器支持的HTTP方法。
- CONNECT 方法把请求连接转换到透明的TCP/IP通道,也就是 使用HTTPS的时候会使用它。
常见的HTTP请求头
前言参考资料:
参考:
Expires、Cache-Control、Last-Modified和Etag总结
wiki:超文本传输协议
正文
- 缓存副本:即网页缓存
- 我们常见的请求头有很多:GET是请求方法;/PATH/?id=1则是请求路径;HTTP/1.1是协议版本号;Host 请求的主机名;
- Content-Type意思为内容类型,用于定义网络文件的类型和网页的编码,更详细的参考
- cache-control这个值告诉客户端,服务端不希望客户端缓存资源,在下次请求资源时,必须要重新请求服务器,不能从缓存副本中获取资源。
- Connection告诉客户端服务器的tcp连接也是一个长连接,客户端可以继续使用这个tcp连接发送http请求。
- User-Agent是对浏览器的识别,查看系统版本,浏览器内核等。
- Accept告诉服务器当前客户端可以接收的文档的类型。其实这里包含了*/*,就表示什么都可以接收。
- last-modified.
在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间
客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过。如果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为空,这样就节省了传输数据量。 - Configure entity tags (ETags)。
Etag仅仅是一个和文件相关的标记,可以是一个版本标记,比如说v1.0.0或者说"2e681a-6-5d044840"这么一串看起来很神秘的编码。但是HTTP/1.1 标准并没有规定Etag的内容是什么或者说要怎么实现,唯一规定的是Etag需要放在""内。
可以将ETag看做是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端。
例如:第一次请求:Response Header 中会附加上服务器添加的last-modified 以及ETag(如果服务器进行配置的话)。
第二次请求:在请求 Request Header 中,会添加 If-modified-since 用于比对第一次请求之后的响应头中的 last-modified。以及 if-none-match ,用于比对 第一次请求之后的响应头中服务器生成的Etag。如果两个值均相同,则返回304,不再向客户端发送资源。
常见的相应状态码
前言参考资料
作者:阿拉斯加大狗
链接:https://juejin.im/post/6844903890840715271
来源:掘金
正文
- 1XX Informational(请求正在处理)
- 2XX Success(请求成功)
- 3XX Redirection(重定向) 需要进行附加操作以完成请求,由服务器通过发送特殊的响应(即 redirects)而触发
- 4XX Client Error(客户端错误)
- 5XX Server Error(服务器错误)
- 200 OK 请求正常处理
- 204 请求处理成功 但是没有任何资源返回给客户端(一般用于只需客户端向服务端发送消息)
- 206 对资源的某一部分请求 响应报文中包含由 Content-Range 指定范围的实体内容
- 300 (Multiple Choice,多项选择) 是一种手工重定向:以 Web 页面形式呈现在浏览器中的消息主体包含了一个可能的重定向链接的列表,用户可以从中进行选择。
- 301永久重定向
如果把资源对应的URI保存为书签,则此时书签会根据Localtion首部字段提示的URI重新保存 - 302 临时重定向 临时地从旧地址A跳转到地址B
- 303 和301,302类似 当使用post方法访问一个资源时,把客户端以get的方式重定向到对应的URI,返回303状态码
- 304 资源已经找到,但是不满足条件,所以不把资源返回给客户端。常用于协商缓存,会使页面跳转到本地缓存的版本当中。
- 400 请求报文内有语法错误
- 401 该状态码表示发送的请求需要通过HTTP认证,初次收到401响应浏览器弹出认证的对话窗口。若收到第二次401状态码,则说明第一次验证失败。
- 403 请求资源的访问被服务器拒绝,一般是未获得文件系统的访问权限,访问权限出现问题。
- 404 服务器上找不到请求资源 或路径错误
- 405 请求方法被服务端识别,但是服务端禁止使用该方法。可以用OPTIONS来查看服务器允许哪些访问方法
- 500 服务器端在执行请求时出错,一般是因为web应用出现bug
- 502 代理服务器或网关从上游服务器中收到无效响应
- 503 服务器暂时处于超负载或停机维护,目前无法处理请求
Cookies
-
HTTP本身是无状态协议,即服务器不知道用户上一次的请求的内容和次数。Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookie中包含信息,借此维护用户跟服务器会话中的状态。Cookie存在于请求报头中。
下次自动登录的流程:
-
Cookie如何分配
浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器,也即浏览器扫描用户所有Cookie,但只读取需要的Cookie。 -
cookie的内容主要包括:名字,值,过期时间,路径和域。其中域可以指定某一个域比如.google.com,也可以指定一个域下的具体某台机器比如froogle.google.com,比如www就也是一个主机名,域下的一台机器(事实上含www.和不含www.打开的不是同一个页面)。路径就是跟在域名后面的URL路径。
路径与域合在一起就构成了cookie的作用范围。 -
Cookie的工作原理
Cookie定义了一些HTTP请求头和HTTP响应头,通过这些HTTP头信息使服务器可以与客户进行状态交互。
客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据这个响应头存储Cookie信息。再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态等较验。