引言
HTTP(超文本传输协议)是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
HTTP协议的主要特点:
- 支持客户/服务器模式
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记。
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP-URL
URI: 统一资源标识符
URL: 统一资源定位符,URL是一种特殊类型的URI,描述了一台特定服务器上某资源的特定位置
HTTP URL 的格式如下: http://host:port/abs_path
- http 表示要通过 HTTP 协议来定位网络资源;
- host 表示合法的 Internet 主机域名或者 IP 地址;
- port 指定一个端口号,为空则使用缺省端口 80;
- abs_path 指定请求资源的URI;如果URL中没有给出 abs_path,那么当它作为请求 URI 时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。
eg:
-
输入:www.baidu.com 浏览器自动转换成: http://www.baidu.com/
-
http:192.168.0.116:8080/index.jsp
HTTP-报文
HTTP报文是简单的格式化数据块。每条报文都包含一条来自客户端的请求,或者一条来自服务器的相应。它们由三个部分组成:对报文进行描述的起始行(start line)、包含属性的首部(header)、包含数据的主体(body)。
HTTP报文可以分为两类:请求报文 和 响应报文
请求报文格式:
<methord> <request-URL> <version>
<headers>
<entity-body>
响应报文格式:
<version> <status> <reason-phrase>
<headers>
<entity-body>
请求报文和响应报文的格式,只有起始行的语法有所不同
-
方法(method)
客户端希望服务器对资源执行的动作。是一个单独的词,如GET、HEAD或POST。
-
请求URL(request-URL)
统一资源标识符。
-
版本(version)
报文所使用的HTTP版本。其格式如这样:
HTTP/<major>.<minor>
-
状态码(status-code)
服务器发回的响应状态代码。这三位数字描述了请求过程中所发生的情况。每个状态码的第一位数字都用于描述状态的一般类别(“成功”、“出错”等)。
-
原因短语(reason-phrase)
表示状态码的文字描述。
-
首部(header)
可以有零个或者多个首部,每个首部都包含一个名字,后面跟着一个冒号:,然后是一个可选的空格,接着是一个值,最后是一个CRLF(回车或者换行)。首部是由一个空行(CRLF)结束的,表示了首部列表的结束和实体主体部分的开始。
-
实体的主体部分(entity-body)
实体的主体部分包含一个由任意数据组成的数据块。并不是所有的报文都包含实体的主体部分,有时,报文只是以一个CRLF结束。
常用HTTP方法
方法 | 描述 | 是否包含主体 |
---|---|---|
GET | 请求获取 Request-URL 所标识的资源 | 否 |
POST | 在 Request-URL 所标识的资源后附加新的数据 | 是 |
HEAD | 请求获取由 Request-URL 所标识的资源的首部,不返回实体的主体部分 | 否 |
PUT | 将请求的主体部分存储在服务器,并用 Request-URL 作为其标识 | 是 |
DELETE | 请求服务器删除 Request-URL 所标识的资源 | 否 |
TRACE | 请求服务器回送收到的请求信息,主要用于测试或诊断 | 否 |
OPTIONS | 请求web服务器告知其支持的各种功能,可以询问服务器通常支持哪些方法,或者对某些特殊资源支持哪些方法 | 否 |
状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
- 1xx:指示信息--表示请求已接收,继续处理
- 2xx:成功--表示请求已被成功接收、理解、接受
- 3xx:重定向--要完成请求必须进行更进一步的操作
- 4xx:客户端错误--请求有语法错误或请求无法实现
- 5xx:服务器端错误--服务器未能实现合法的请求
常见的状态码
状态码 | 状态描述 | 说明 |
---|---|---|
200 | OK | 客户端请求成功 |
400 | Bad Request | 客户端请求有语法错误,不能被服务器所理解 |
401 | Unauthorized | 请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用 |
403 | Forbidden | 服务器收到请求,但是拒绝提供服务 |
404 | Not Found | 请求资源不存在 |
500 | Internal Server Error | 服务器发生不可预期的错误 |
503 | Server Unavailable | 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常 |
首部(消息报头)
首部和方法配合工作,共同决定了客户端和服务器能做什么事情。
在请求和响应报文中都可以用首部来提供信息,有些首部是某种报文专用的,有些首部则更通用一些,可以将首部分为四个类型:
通用首部
这些是客户端和服务器都可以使用的通用首部。可以在客户端、服务器和其他应用程序之间提供一些非常有用的通用功能。提供了与报文相关的最基本的信息。
首部 | 描述 |
---|---|
Connection | 允许客户端和服务器指定与请求/响应连接有关的选项,例如指定连接是连续,或者指定“close”选项,通知服务器,在响应完成后,断开连接 |
Date | 提供日期和时间标志,说明报文是什么时间创建的 |
Cache-Control | 用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制) |
Pragma | 另一种随报文传送只是的方式,但并不专用于缓存 |
请求首部
请求首部是请求报文特有的。他们为服务器提供了一些额外信息,比如客户端希望接收什么类型的数据。用于说明是谁或者什么在发送请求、请求源自何处,或者客户端的喜好及能力。服务器可以根据请求首部给出的客户端信息,试着为客户端提供更好的响应。
请求的信息性首部
首部 | 描述 |
---|---|
Client-IP | 提供了运行客户端的机器的IP地址 |
From | 提供了客户端用户的E-mail地址 |
Host | 给出了接收请求的服务器的主机名和端口号 |
User-Agent | 将发起请求的应用程序名称告知服务器 |
Accept首部
Accept首部为客户端提供了一种能够将其喜好和能力告知服务器的方式,包括它们想要什么,可以使用什么,以及最重要的,它们不想要什么。这样服务器就可以根据这些额外的信息,对要发送的内容作出更明智的决定。
首部 | 描述 |
---|---|
Accept | 告诉服务器可以发送哪些媒体类型 |
Accept-Charset | 告诉服务器可以发送哪些字符集 |
Accept-Encoding | 告诉服务器可以发送哪些编码方式 |
Accept-Language | 告诉服务器可以发送哪些语言 |
安全请求首部
首部 | 描述 |
---|---|
Authorization | 包含了客户端提供给服务器,以便对其自身进行认证的数据 |
Cookie | 客户端向服务器传送一个令牌——它并不是真正的安全首部,但确实隐含了安全功能 |
响应首部
响应首部是响应报文特有的。响应首部为客户端提供了一些额外信息,比如谁在发送响应、响应者的功能,甚至与响应相关的一些特殊指令。这些首部有助于客户端处理响应,并在将来发起更好的请求。
首部 | 描述 |
---|---|
Age | (从最初创建开始)响应持续时间 |
Location | 可以将响应接收方(客户端,如浏览器)引导至某个与请求URI位置不同的资源,当请求的资源位置改变时会返回该响应 |
Server | 服务器应用程序软件的名称和版本 |
WWW-Authenticate | 来自服务器的对客户端的质询列表,该首部必须被包含在状态码为401的响应报文中,客户端收到401响应消息的时候,发送含Authorization首部的请求报文请求服务器对其进行验证,服务器响应报文里就包含本首部 |
实体首部
实体首部提供了有关实体及其内容的大量信息,请求和响应报文中都可能包含实体部分,所以这两类报文都可能出现这些首部。总之,实体首部可以告知报文的接收者它在对什么进行处理。
首部 | 描述 |
---|---|
Content-Base | 解释主体中的相对 URL 时使用的基础 URL |
Content-Encoding | 对主体执行的任意编码方式 |
Content-Language | 主体资源所用的自然语言 |
Content-Length | 主体的长度或尺寸 |
Content-Locaton | 资源实际所处的位置 |
Content-Type | 发送给接收者的实体正文的媒体类型 |
Content-Range | 在整个资源中此实体表示的字节范围 |
Expires | 响应过期的日期和时间,超过该事件,实体不再有效,要从原始的源端再次获取此实体 |
Last-Modified | 实体最后一次被修改的日期和时间 |
网友评论