HTTP协议
http协议概述
Hypertext Transfer Protocol,超文本传输协议;
**协议双方*: 浏览器 和 服务器server;
通信规则规定了客户端发送给服务器的内容格式(请求协议request),也规定了服务器发送给客户端的内容格式(响应协议response);
http是基于请求/响应模式,请求一次响应一次, 不是时刻连接的;
http是无状态协议,服务器server无法区分客户端;
URL: 统一资源定位符,即网址:协议名://域名:端口/路径
请求协议
GET http1.1 # 请求方式
key:value # 多个键值对
\r\n # 空行,区分
请求体() # 具体的数据,针对POST方式,若果是GET请求,请求体为空,键值对数据会追加在路径后面,中间用?隔开
一般情况下:
地址栏url访问 GET
<a href=""> GET
form表单默认 GET
# 1. 请求行
描述客户端的请求方式、请求资源的名称、http协议的版本号。 例如: GET/BOOK/JAVA.HTML HTTP/1.1
# 2. 请求头:
Accept:用于告诉服务器,客户机支持的数据类型 (例如:‘Accept:text/html,image/*‘)
Accept-Charset:用于告诉服务器,客户机采用的编码格式
Accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式
Accept-Language:客户机语言环境
Host:客户机通过这个服务器,想访问的主机名
If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间
Referer:客户机通过这个头告诉服务器,它(客户端)是从哪个资源来访问服务器的(防盗链)
User-Agent:客户机通过这个头告诉服务器,客户机的软件环境(操作系统,浏览器版本等)
Cookie:客户机通过这个头,将Coockie信息带给服务器
Connection:告诉服务器,请求完成后,是否保持连接
Date:告诉服务器,当前请求的时间
# 3. 实体内容
就是指浏览器端通过http协议发送给服务器的实体数据。例如:name=dylan&id=110
(get请求时,通过url传给服务器的值。post请求时,通过表单发送给服务器的值)
响应协议
# 1. 响应首行
HTTP/1.1 200 OK (协议的版本号是1.1 响应状态码为200 响应结果为 OK)
# 2. 响应头信息
Response Headers
Location:这个头配合302状态吗,用于告诉客户端找谁
Server:服务器通过这个头,告诉浏览器服务器的类型
Content-Encoding:告诉浏览器,服务器的数据压缩格式
Content-Length:告诉浏览器,回送数据的长度
Content-Type:告诉浏览器,回送数据的类型
Last-Modified:告诉浏览器当前资源缓存时间
Refresh:告诉浏览器,隔多长时间刷新
Content-Disposition:告诉浏览器以下载的方式打开数据。例如: context.Response.AddHeader("Content-Disposition","attachment:filename=aa.jpg"); context.Response.WriteFile("aa.jpg");
Transfer-Encoding:告诉浏览器,传送数据的编码格式
ETag:缓存相关的头(可以做到实时更新)
Expries:告诉浏览器回送的资源缓存多长时间。如果是-1或者0,表示不缓存
Cache-Control:控制浏览器不要缓存数据 no-cache
Pragma:控制浏览器不要缓存数据 no-cache
Connection:响应完成后,是否断开连接。 close/Keep-Alive
Date:告诉浏览器,服务器响应时间
# 3. 空行
\r\n
# 4. 响应体
响应包含浏览器能够解析的静态内容,例如:html,纯文本,图片等等信息
# 状态码:
200 请求已成功,请求所希望的响应头或数据体将随此响应返回;
404 请求失败,请求所希望得到的资源未被在服务器上发现;
500 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。
302 请求的资源现在临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。
304 如果客户端发送了一个带条件的GET请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。该响应必须包含以下的头信息:Date,除非这个服务器没有时钟。假如没有时钟的服务器也遵守这些规则,那么代理服务器以及客户端可以自行将 Date 字段添加到接收到的响应头中去(正如RFC2068中规定的一样),缓存机制将会正常工作。
状态码304:原理详见下图