您的位置:首页 > 理论基础 > 计算机网络

HTTP请求与响应

2016-03-07 22:38 609 查看

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允许客户端和服务器指定与请求响应连接有关选项
DateHTTP报文创建时间
PragmaCache-Control的HTTP1.0兼容
Trailer..
Transfer-Encoding报文编码方式
Upgrade..
Via报文经过的中间节点

请求首部

首部字段名说明
Accept用户代理可处理的媒体类型
Accept-Charset优先的字符集
Accept-Encoding优先的内容编码
Accept-Language用户语言
AuthorizationWeb认证信息
Except期待服务器的特定行为
HOST给出了接收请求的服务器的主机名和端口号
If-Match比较实体标记Etag
If-Modified-Since比较资源更新时间
If-Unmodified-SinceIf-Modified-Since相反
If-None-Match和If-Match相反
Max-Forwards最大传输跳数
Proxy-Authorization代理服务器认证信息
Range实体范围请求
If-Range资源未更新时 发送实体范围请求 单位是Byte
RefererURI来源
TE传输编码优先级
User-AgentHTTP客户端信息

响应首部

首部字段名说明
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: