从敲url到页面的内容,都是HTTP规定的。
规定了浏览器、服务器的一些行为。
1.URI和URL
- URI:统一资源标识符
- URL:统一资源定位符
URL是使用浏览器访问web页面的时候,需要输入的网页地址
http://www.google.com
URI是更通用的资源标识符,URL是它的一个子集。
URI有两种主要子集组成
1.URL:通过描述资源的位置来描述资源
2.URN:通过名字来识别资源,和位置无关
URI
URI(Uniform Resource Identifier)
- Uniform: 规定统一的格式,可方便处理各种不同类型的资源,而不用根据上下文环境来识别资源指定的访问方式,加入新的协议方案(HTTP,HTTOS,FTP等)也更容易。
- Resource:资源的定义是“可以标识的任何东西”,除了文档文件、图像或者服务(天气预报)等能够区别于其他类型的,全都可以称为资源,另外资源不仅可以是单一的,也可以是多数的集合体。
- Identifier:表示可标识的对象,也称为标识符。
URI是某个协议方案表示的资源的定位标识符,协议方案指访问资源所使用的协议类型名称
采用HTTP协议的时候,协议方案就是http,除此之外还有ftp、mailto、file等。
ftp://ftp.is.cd.za.rfc/rfc1808.txt
http://xxxx.github.io/f2e/js/ajax.html
mailto:xxx@gmail.com
telnet://192.0.2.16:80
URL格式
常见的URL主要有3部分组成:
1.协议
2.服务器路径
3.资源路径
http://xxxx.github.io/f2e/js/ajax.html
通用的URL有9部分组成:
<scheme>://<user>"<password>@<host>:<port>/<path>;<params>?<query>#<hash>
- 对于web页面来说最常用的协议就是http和https
- user和password现在不常见了,不会再URL明文书写用户名和密码了,都是通过登录的方式
- 主机可以是IPO地址过着域名
- 端口号用来区分主机上的进程,方便找到web服务器,http默认是80
- path是资源的路径,也就是存放位置,不一定和物理路径完全对应,符合web服务器路由约定即可
- params在一些协议中需要参数来访问资源,例如ftp是二进制还是文本传输,参数是名值对,用;隔开
- query:这个是get请求最常用的传递参数方式了?a=1&b=2&c=3
- hash也称为片段,设计为标识文档的一部分,很多MVVM框架用作了路由功能
相对URL
相对URL是URL一部分,从路径开始
./image/logo.png
../script/a.js
/css/main/css
2.客户端向服务器发送请求方法
HTTP最大的作用就是客户端发送请求,服务器给出响应,客户端向服务器发送请求的方式有很多
1.GET(向服务器要资源)
GET是最常用的方法,通常用于请求服务器发送某个资源
在浏览器输入页面地址,就是给服务器发送一个get请求,希望得到这个网页。
2.HEAD(查文件信息,而不是内容时)
HEAD方法和GET类似,但是在服务器的响应中没有资源的内容,只有资源的一些基本信息,主要用于
- 1.在不获取资源的情况下获取资源信息(类型、大小等)
- 2.通过状态码查看资源是否存在
- 3.通过查看首部,调试资源是否被修改了
3.PUT(往服务器上传资源)
和GET从服务器获取资源相反、PUT用于向服务器写入资源。PUT的语义就是让服务器用请求的主体部分创建一个请求URL命名的文档,如果存在就替换
当然处于安全原因,并不是所有的服务器都实现。
4.POST(想把一些信息交给服务器)
POST用于向服务器发送数据,通常用来支持HTML的表单(input、select、textarea),表单中的数据会被发送到服务器。
5.TRACE(诊断,看看经历哪些节点)
客户端发送一个请求的时候,这个请求可能会穿过防火墙、代理、网关和一些其它应用程序,每个中间节点都可能修改HTTP请求,TRACE方法允许客户端在最终请求发往服务器的时候,看看它变成了什么样子
TRACE请求会在目的服务器端发送一个“闭环”诊断,行程最后一站服务器会弹回一条TRACE响应,并在响应主题中携带它收到的原始请求报文。
6.DELETE(发一个请求删除一个资源)
DELETE方法用于请求服务器删除请求的URL,和PUT一样,服务器可能会不支持
7.OPTIONS(看看这么多方法,支持哪个)
OPTIONS方法用于请求web服务器告知其支持的各种功能。
最常用的是GET和POST
3.状态码 Status Code
状态码被分为五个大类:
-
100-199
用于指定客户端相应的某些动作 -
200-299
用于表示请求成功。 -
300-399
用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。 -
400-499
用于指出客户端的错误。 -
500-599
用于支持服务器错误。
常用状态码 | 表示 |
---|---|
200 | 表示ok |
206 | 部分已经成功了 |
301 | 永久性移动 |
302 | 临时性移动 |
304 | 请求的资源没有变化,使用本地缓存就好。 |
403 | 没有权限访问此站 |
404 | 所请求的页面不存在或已被删除 |
500 | 服务器出错,不能完成客户请求。 |
502 | 找不到网关 |
503 | 服务器出错 |
504 | 能找到网关,但超时 |
Request Headers: 请求
Accept: //能接受的类型,MIME类型。
Accept-Encoding: //能接受的一些压缩类型
Accept-Language: //能接受的哪种类型的语言,显示出来。
Cookie: 键值对纯文本,能发给服务器,客户端的一些信息。在控制台Resources => cookies 有详细信息:Domain在哪个域名下,Path在哪个地址下,Expires/Max-Ag哪天失效,session当前登录期间有效,size多大。
报文
HTTP报文是在HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息开头,描述报文的内容及含义,后面跟着可选的数据部分
组成
客户端往服务器发的一个请求,服务器给客户端的也是一个报文。有发过去的有发回来的,都是通过报文的格式。
HTTP报文是简单的格式化数据块,每个报文都包含一条来自客户端的请求或者一条来自服务器的响应,由3个部分组成
- 对报文进行描述的起始行 —— start line
- 包含属性的首部块 —— header
- 可选的包含数据的主体部分 —— body
//start line
HTTP/1.0 200 OK
//headers
content-type: text/plain
content-length: 19
//body
Hi, I'm a message
语法
HTTP报文分为两类
向web服务器请求一个动作
- 请求报文:
<method><request-URL><version>
//get http://www.baidu.com http1.1
<headers>
//request Headers信息
<entity-body>
//不一定有
- 响应报文:
把请求结果返回给客户端
<version><status><reason-phrase>
//版本 状态 短语(ok)
<headers>
//request Headers信息
<entity-body>
//响应一般都有body,不一定是文本,也有可能是二进制的。
通用首部Headers
客户端和服务器都可以用的,都认识的。
首部 | 描述 |
---|---|
Connection | 客户端和服务器是否保持连接 |
Date | 日期,报文创建时间 |
Update | 给出了发送端可能想要升级使用新版本或协议 |
Via | 显示了报文经过的中间节点(代理、网关) |
Trailer | 如果报文采用分块传输编码方式,可以利用这个首部列出位于报文trailer部分的首部集合 |
Trailer-Encoding | 告诉接收端对报文采用什么编码格式 |
Cache-Control | 随报文传送缓存指示 |
Pragma | 早期的随报文传送指示方式 no-cache,这个页面永远不用缓存,用最新的。 |
Connection:HTTP是一种无状态协议,像QQ,可以持续的聊天,不用每次聊都要点一下连接。网页确不行,比如说访问百度,百度给我地址以后需要把客户端和服务器之间的链接给断开,因为可能要收一亿多次请求,都连着不断的话,资源就释放不了了。无状态,一断之后,下次连可能就不认识了。这样本身设计是没问题的,问题在每次下次再找它特别累。所以HTTP1.1给加了新特性Connection,虽然TCP断开了,但是中间的链路保持链接,下次不用重新找它了,直接连接就行了。
Update :web socket ,需要HTTP来实现的。
请求首部
首部 | 描述 |
---|---|
Client-IP | 客户端IP |
From | 客户端邮件地址 |
Host | 接收请求的服务器的主机名和端口号 |
Referer | 提供了包含当前请求URI的文档的URL,告诉服务器自己来源 |
User—Agent | 发起请求的客户端应用程序 |
Accept | 告诉服务器能够发送那些媒体类型 |
Accept-Charset | 告诉服务器能够发送那些字符集 |
Accept-Encoding | 告诉服务器能够发送那些编码 |
Accept-Language | 告诉服务器能够发送那些语言 |
Expect | 允许客户端列出请求所要求的服务器行为 |
If-Match | 如果ETag和文档当前ETag匹配,就获取文档 |
If-Modified-Since | 除非在某个指定日期之后修改过,否则限制这个请求 |
If-None-Match | 如果ETag和当前文档ETag不符合,获取资源 |
If-Range | 允许对文档否个范围内的条件请求 |
If-Unmodified-Since | 在某个指定日期之后没有修改过,否则现在请求 |
Cookie | 客户端字符串 |
响应首部
首部 | 描述 |
---|---|
Age | 响应持续时间 |
Server | 服务器应用软件名称和版本 |
Allow | 列出了可用的请求方法 |
Location | 告诉客户端实在在哪里,用于301,302定向往哪里跳 |
Content-Base | 解析主体中相对URL的基础URL |
Content-Encoding | 主体编码格式 |
Content-Language | 解析主体时适用的语言 |
Content-Length | 主体的长度或尺寸 |
Content-Location | 告诉资源实际位置在哪 |
Content-MD5 | 主体的MD5校验和 |
Content-Range | 在整个资源中此实体部分的字节范围 |
Content-Type | 主体的MIME |
ETag | 主体的实体标记 |
Expires | 过期时间 |
Last-Modified | 实体最后一次修改时间 |