HTTP协议
HTTP协议是Web浏览器和Web服务器之间通信的标准协议。对于从客户端到服务器的每个请求,需要进行以下几步:
上面是HTTP1.0的过程。在HTTP1.1及以后版本中,可以通过一个TCP连接连续发送多个请求和响应。同时在HTTP1.1中,请求和相应可以分为多个块发送。
HTTP请求
每个请求和响应都应有相同的基本形式:一个请求行,一个包含元数据的HTTP首部,一个空行,最后一个消息体。下面是一个基本的GET请求,每行必须以\r\n结尾
GET /Index.html HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Host: www.baidu.com
Connection: keep-alive
Accept-Language: en-US,en;1=0.5
Accept-Encoding: gzip, deflate
Accept: text/html, application/xhtml+xml, application/xml;q=0.9,*/*;q=0.8
(空行\r\n)
请求行
第一行称为请求行,包括一个方法,资源的路径以及HTTP的版本。HTTP有4个主要的方法GET,POST,PUT,DELETE。紧跟着就是请求资源的路径,最后一个客户端支持的HTTP版本
HTTP首部
HTTP首部包含了与HTTP协议相关的元数据。格式采用键值对的形式:
keyword: Value
关键字不区分大小写。值有时区分大小写,有时也不区分。关键字和值只能是ASCII码
对于上面的示例,主要解释一下Accept关键字。该关键字用来告诉客户端可以处理哪些数据类型(但是服务器常常忽略这一点)。Accept中的数据类型被称为MIME。MIME分为两级:类型(type)和子类型(subtype)。类型笼统的说明了可以处理哪些数据:图片,文本还是影片。子类型表示数据的特定类型,如GIF图像,JPEG图像,TIFF图像。例如,HTML的内容类型是text/html,那么类型是text,子类型是html。JEPG图像的内容类型是image/jpeg,类型是image,子类型是jpeg。下面是已经定义的几个顶级类型:
multipart/* 表示多个文档和资源的容器
可以在http://www.iana.org/assignments/media-types/media-types.xhtml看到已经注册的最新的MIME类型。另外,也可以自由定义非标准的定制类型和子类型,只要它们以x-开头即可。例如,flash文件通常会指定为application/x-shockwave-flash类型
结束行
为了向服务器传达请求头部已经结束这样一个信号,必须设置一个标志。这个标志就是最后的空行。
HTTP响应
http响应的格式和http请求的格式是一致的。下面是一个简单的响应头:
HTTP/1.1 200 OK
Date: Sun, 21 Apr 2016 12:12:12 GMT
Server: Apache
Connection: close
Content-Type: text/html; charset=utf-8
Content-length: 53
<html>
<head></head>
<body>Hello Http!</body>
</html>
响应行
首先指定服务器使用的HTTP协议版本。后面是一个响应码,200 OK表示响应成功。
HTTP首部
Date:表示请求的日期(采用服务器的时间戳)
Server:表示服务器软件
Connection:表示服务器是否会关闭这个连接。如果是close的话,表示服务器会关闭该连接。如果是keep-alive的话,表示服务器会继续维持这个连接,以便其他的http请求也能使用到这个连接进行数据传输。
Content-Type:表示服务器返回的消息体的数据类型。如果数据类型为text类型,还需指定其编码方式。这里需要注意一点,指明数据编码方式必须要与数据真实的编码方式一致。详情请看链接 http://www.cnblogs.com/xidongyu/p/5305177.html
Contento-length:表示消息体的长度,单位为字节。对Content-Length的研究请看http://www.cnblogs.com/xidongyu/p/5938888.html
消息体
在元数据之后会有一个空行,然后就是服务器返回给客户端的消息体了。消息体通常是html文本,当然还有其他格式。
响应码
html中响应码有很多,下面介绍几种常见的响应码。
响应码和消息 | 含义 |
2XX | 请求成功 |
200 OK | 表示请求成功,请求所希望的响应头或数据体将随此响应返回 |
201 Created | 服务器已经在响应主体中指定的URL处创建了资源。客户端应当尝试加载该URL。该码只响应POST请求 |
202 Accepted | 表示请求(一般是POST)已经被接受,但尚未处理或处理尚未结束。多用于服务器端的异步操作 |
204 No Content | 服务器成功处理的请求,但没有信息发回给客户端 |
205 Reset Content | 服务器成功处理请求,但没有信息发回给客户端。此外,客户端应当清除发送请求的表单 |
206 Partial Content | 服务器返回给客户端请求资源的一部分,而不是整个文档。这种情况一般发生在加载大图片的情况下。 |
3XX Redirection | 重定位及重定向 |
301 Move Permanently | 资源已经被移动到一个新的URL。客户端应当自动加载这个URL的资源,更新所指向原URL的书签 |
302 Move Temporarily | 资源临时移动到一个新的URL,但在不久的将来其位置会再次改变。客户端应请求这个新的URL,但不需要更新书签。 |
304 Not Modified | If-Modified-Since首部要求服务器提供最新的文档。如果文档没有被更新过,服务器会返回该码。这时浏览器会从自己的缓存中加载资源 |
4XX Unauthorized | 访问这个页面需要身份认证,一般是用户名和密码 |
403 Forbidden | 服务器能理解的请求,但是有意拒绝进行处理。 |
404 Not Found | 服务器找不到指定的资源 |
405 Method Not Allow | 请求的方法不支持指定的资源。例如,向不支持PUT的服务器发送PUT请求 |
406 Not Acceptable | 所请求的资源不能以客户端希望的格式提供。 |
408 Request Timeout | 客户端用了太长时间发送请求,可能是因为网络拥塞的原因 |
411 Length Required | 客户端必须在请求HTTP首部中发送一个Content-Length字段,但是没有做到 |
5XX 服务器错误 | 服务器错误 |
500 Internal Server Error | 发生了意外情况,服务器不知道如何处理 |
502 Bad Gateway | 这个响应码只用于作为代理或网关的服务器。它指示该代理在试图完成请求时,从它连接的服务器接受到一个无效的响应。 |
503 Service Unavailable | 服务器暂时无法处理请求,可能是超负荷或维护原因 |
504 Gateway Timeout | 代理服务器在合理的时间内未能接收到上游服务器的响应,所以无法向客户端发送所需的相应 |
无论哪个版本,响应码100到199总表示一个提供信息的相应,200到299总指示成功,300到399表示重定向,400到499总是指示一个客户端错误,500到599总表示一个服务器错误。
Cookie
因为HTTP是无状态的协议,但是为了记录客户端的一些状态,就是用了Cookie。cookie位于请求和响应的首部,先从服务器传递到客户端,再从客户端传递到服务器。cookie可以用来指示会话ID,购物车内容,登陆凭据和用户首选项。
要在浏览器中设置一个cookie,服务器必须在HTTP首部包含一个Set-Cookie首部行来告知浏览器。例如:下面HTTP首部将cookie“cart”的值设置为"ATVPKIKI0RED”
HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie: cart=ATVPKIKI0RED
Accept: text/html
如果这时浏览器向服务器发起请求的话,它会在HTTP请求行中的Cookie行中发回这个cookie
GET /index.html HTTP/1.1
Host: www.example.org
Cookie: cart=ATVPKIKI0RED
Accept: text/html
服务器可以设置多个cookie,即在响应首部可以出现多个Set-Cookie字段
Cookie的作用域
Cookie最简单的方式就是只采用一个键值对来标记。当然它也可以加入其他的一些属性来控制它们的作用域,包括cookie的时效性,路径,域,端口,版本和安全选项。
域
例如,默认情况下,cookie来自哪个服务器就应用于哪个服务器。如一个cookie由www.xdysite.cn设置,浏览器就应把这个cookie发回给www.xdysite.cn。不过可以设置将cookie作用于整个域。下面这个为整个xdysite.cn域设置一个用户cookie。
Set-Cookie: user=dy;Domain=.xdysite.cn
这样设置后浏览器不只是把这个cookie回送给www.xdysite.cn,同时它也会把这个cookie发送到该域的其他服务器上。
路径
指定cookie在某些路径上有效,如果切换到其他路径上则cookie就无效了。默认的作用域是最初的URL和其所有子目录。例如:如果为URL http://www.xdysite.cn/XOM设置了一个cookie,那么这个cookie还可以应用于htt://www.xdysite.cn/XOM/apidocs/,但不能应用于httP://www.xdysite.cn/slides。不过可以使用Path属性来改变默认的作用域。例如,下面的响应中的cookie只能应用于服务器的/test目录及其子目录,而不能应用去网站的其他部分。
Set-Cookie: user=xdy; Path=/test
过期时间
通过expires属性可以设置cookie的过期时间,时间格式为“Wdy, DD-Mon-YYYY, HH:MM:SS GMT”。还有一种格式为Max-Age,后面跟的秒数,表示多少秒之后cookie过期。
Set-Cookie: user=xdy;expires=Wed, 21-Dec-2015 15:23:00 GMT
Set-Cookie: user=xdy;Max-age=3600
安全
当cookie中包含敏感信息时,应该在cookie中添加secure属性,来告诉浏览器只有使用HTTPS时才回传cookie。
Set-Cookie: key=passwd;Domain=.xdysite.cn;secure
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步