最权威的文档html
https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html跨域
然而阅读起来难度有点大呢
因此能够看看HTTP权威指南 以及图解HTTP(很好的入门书)数组
一个HTTP请求 是由请求头和请求体组成的 不过呢GET请求是没有请求体的 POST才有浏览器
一个请求/响应的大体结构:
header(包括请求行 请求首部字段 通用首部字段 实体首部字段)
空行(CR+LF)
body
缓存
一个GET请求服务器
GET /books/?name=Professional%20Ajax HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Aliveapp
一个纯文本的POST请求测试
POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
(此处空一行)
name=Professional%20Ajax&publisher=Wiley编码
发送图片等二进制数组的POST请求加密
POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryPh3G5pOw90P9pzQW
Content-Length: 35827
Connection: Keep-Alive
------WebKitFormBoundaryPh3G5pOw90P9pzQW
Content-Disposition: form-data; name="file"; filename="2015-11-20 235622.jpg"
Content-Type: image/jpeg
------WebKitFormBoundaryPh3G5pOw90P9pzQW--
一个响应
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
(此处空一行)
<html>
....
Allow: GET, POST, PUT, OPTIONS
PS 这些Action并非所有 还有一些扩展的方法
200 请求成功 响应有响应体
204 请求成功处理 可是返回的报文不包括body
206 Partical Content 响应的报文中包含了Content-Range指定的范围实体内容
301 永久移动 表示资源已经被从新分配了URI
302 临时移动 临时移动并非说资源暂时移至别处后会回到原来的位置 实际意思是虽然资源分配了新的URI 可是这个URI仍是会改变的额
303 和302同样 可是303表示客户端应当使用GET
304 当客户端发送了附带条件的请求的时候 服务端运算后发现条件不成立 返回304 (条件不成立表示服务器的资源没有更新 可使用缓存) 返回304的时候不包括响应体
条件请求 If-Match If-Modifiled-Since If-None-Match If-Range If-Unmodified-Since
307 临时重定向 和302相似 可是302规定禁止从POST变成GET
400 Bad Request 报文存在语法错误
401 未受权 此时浏览器会弹出一个框要求输入用户名和密码
403 禁止访问这个资源(从未受权的IP地址发出的访问)
404
500
503 服务器超负载状态 或者处于停机维护
PS URL是URI(统一资源标识符)的子集
好比下面也都是URI
mailto:xxx@xx.com temlnet://xx.xx.xx.xx:80/
Web服务器能够用文件的扩展名来讲明MIME的类型
请求和响应都有的字段 (HTTP权威指南71页)
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存行为 |
Connection | 容许客户端和服务器指定与请求响应链接有关选项 |
Date | HTTP报文建立时间 |
Pragma | Cache-Control的HTTP1.0兼容 |
Trailer | .. |
Transfer-Encoding | 报文编码方式 |
Upgrade | .. |
Via | 报文通过的中间节点 |
首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型 |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码 |
Accept-Language | 用户语言 |
Authorization | Web认证信息 |
Except | 期待服务器的特定行为 |
HOST | 给出了接收请求的服务器的主机名和端口号 |
If-Match | 比较实体标记Etag |
If-Modified-Since | 比较资源更新时间 |
If-Unmodified-Since | If-Modified-Since相反 |
If-None-Match | 和If-Match相反 |
Max-Forwards | 最大传输跳数 |
Proxy-Authorization | 代理服务器认证信息 |
Range | 实体范围请求 |
If-Range | 资源未更新时 发送实体范围请求 单位是Byte |
Referer | URI来源 |
TE | 传输编码优先级 |
User-Agent | HTTP客户端信息 |
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围的请求 |
Age | 原服务器建立响应后到如今通过的时间 单位为秒 |
Etag | 资源的信息 |
Location | 重定向URI |
Proxy-Authenticate | 代理服务器与客户端的认证信息 |
Retry-After | 若是资源不可用的话,在此日期或时间重试 |
Server | 服务器应用程序软件的名称和版本 |
WWW-Authenticate | 服务器和客户端的认证信息 |
首部字段名 | 说明 |
---|---|
Allow | 该资源能够支持的HTTP方法或其余 好比是否容许跨域 |
Content-Type | 实体媒体类型 |
Content-Location | |
Content-Length | |
Content-Language | |
Content-MD5 | |
Expires | 过时时间 |
Last-Modified | 最后修改时间 |
在规定时间内 都认为内容是新鲜的 缓存能够任意使用这些副本 无需和服务器联系
Expires: Sat, 29 June 2002, 14:30:00 GMT
OR
Cache-Control: max-age=43220
max-age表示从服务器响应的时候开始 此资源处于新鲜状态的时间长度
PS
Cache-Control是HTTP1.1中才有的 Expires是HTTP1.0就有
仅仅是资源超过了规定时间可是并不意味着服务器上的资源更新了
HTTP向原始服务器发送一个条件GET 服务器自行判断 在缓存资源和服务器中的资源不一样的时候才返回对象 (这个时候才有响应体)
这也就是常说的条件GET 只有条件成立 服务器才返回对象 不成立 则返回304
最经常使用的是 If-Modified-Since 和 If-None-Match
在GET请求资源的时候降入这个首部
请求
If-Modified-Since: Sat, 29 June 2002, 14:30:00 GMT If-None-Match: <tags>
响应
HTTP/1.0 304 Not Modified Date: Wed, 03 Jul 2002, 19:22:00 GMT Expires: Fri, 05 Jul 2002, 19:22:00 GMT
那么If-Modified-Since发送的时间到底是何时呢
一般是和 Last-Modefied 这个响应的首部 配合
一个资源第一次请求 服务器的响应包含了Last-Modefied的话
下一次再次发送请求就会有If-Modified-Since 字段 , 值就是Last-Modefied的值
If-None-Match也是一样道理 配合服务器响应的Etag首部
Etag是文件的标识, 标识规则是服务器来肯定, 因此要发送的If-None-Match的值也就是
该资源第一次请求服务器响应的Etag值
PS 若是响应中既有Last-Modefied 和 Etag 只有二者都知足的时候才返回304