HTTP请求与响应
最权威的文档
然而阅读起来难度有点大呢
所以可以看看HTTP权威指南 以及图解HTTP(很好的入门书)
header & body
一个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-Alive
一个纯文本的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>
....
HTTP Action
- OPTIONS
这个方法可使服务器传回该资源所支持的所有HTTP请求方法。比如服务器会返回这么一个Allow字段
Allow: GET, POST, PUT, OPTIONS
- GET/POST
- HEAD
与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的实体部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(对象是否存在 对象的类型 对象是否被修改)。 - PUT
POST用于向服务器发送数据 PUT用于向服务器上的文件中存储数据 - DELETE
请求服务器删除Request-URI所标识的资源。 - TRACE
回显服务器收到的请求,主要用于测试或诊断。因为客户端发出的请求会经过防火墙 代理 网关等 期间请求可能被修改 有了TRACE就可以看到请求是如何被修改的 - CONNECT
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
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/
MIME类型
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就有
304
仅仅是资源超过了规定时间但是并不意味着服务器上的资源更新了
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