HTTP请求与响应

HTTP请求与响应

最权威的文档html

https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html跨域

然而阅读起来难度有点大呢
因此能够看看HTTP权威指南 以及图解HTTP(很好的入门书)数组

header & body

一个HTTP请求 是由请求头和请求体组成的 不过呢GET请求是没有请求体的 POST才有浏览器

一个请求/响应的大体结构:
header(包括请求行 请求首部字段 通用首部字段 实体首部字段)
空行(CR+LF)
body
enter image description here缓存

一个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>
....

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

相关文章
相关标签/搜索