Http基础

时间:2022-11-08 19:50:02

Http基础

这篇文章是讲Android网络请求的先导文章,主要讲Http工作流程,请求报文和响应报文的格式,以及GETPOST方法的具体含义。

Http工作流程

HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。(我们称这个客户端)叫用户代理(user agent)。应答的服务器上存储着(一些)资源,比如HTML文件和图像。(我们称)这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个中间层,比如代理,网关,或者隧道(tunnels)。尽管TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。 事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用。

这里我们规定下文讨论的HTTP都是基于tcp协议的,至于为什么不是udp,原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。

我们用一个例子来说明http在通信的时候IP, TCP, DNS分别做了什么工作。

客户端发起请求,想要浏览百度这个网页,他先告诉DNS,获取百度这个网页的IP地址,然后HTTP协议生成针对目标web服务器的HTTP请求报文,TCP协议则为了方便通信,将HTTP请求报文分割成报文段,把每个报文可靠地传给对方。IP协议则搜索对方的地址,一边中转一边传送

服务器端,TCP协议负责从对方那里接收到报文段,重组到达的报文段,HTTP则负责对WEB服务器请求的内容进行处理。然后结果同样利用TCP/IP向用户回传。

我们仔细看一下上面的流程,去掉TCP,IP ,DNS在里面做的工作,首先客户端发起请求,向服务器请求一个页面的内容,通常是在浏览器里面输入一个网址(URL)这个网址叫URL(统一资源定位符),他只是表示资源所在的地点,在网络中更常见的是URI(统一资源标识符),他是URL的超集,在后面我们讨论的资源路径都是用URI表示的,我们可以看一个绝对URI的例子。

http://user:pass@www.example.cn:80/dir/index.htm?uid=1#ch1
http:协议方案名
user:pass 登录信息 (登录服务器的身份认证,可省略)
www.example.cn 服务器地址(可以是DNS可解析的名称,也可以时IP)
80 服务器端口号 (可选,不填则默认是80)
dir/index.htm 带层次的文件路径 (指定服务器上的文件路径来定位特指的资源)
uid=1 查询字符串 (针对已制定的文件路径内的资源,使用查询字符串传入任意参数)
#ch1 片段标识符 (无明确用法,不予讨论 ,可忽略)

那么在浏览器或者其他工具中输入URI后是怎么应用的呢?答案是HTTP请求报文(后面会讲),HTTP根据输入的URI和其他参数生成HTTP请求报文发送给服务器,忽略中间传输过程,HTTP服务器得到请求报文后,会对其进行解析,然后根据请求内容查询服务器的资源,再以响应报文的形式传回给客户端。客户端解析响应报文的内容,根据报文的内容进行下一步的任务。

请求报文与响应报文的格式

用于HTTP协议交互的信息被称为HTTP报文。请求端的HTTP报文叫做请求报文,响应段(服务器端)的叫做响应报文。HTTP报文本身是由多行数据构成的字符串文本。用(CR+LF做换行符,CR回车符,16进制0x0d,LF换行符,16进制0x0a)

下图就是请求报文的格式

Http基础

上图可以看到请求报文是由报文首部,空行,报文实体构成的。报文首部在通信中至关重要,因为重要作用的信息几乎都在这边。报文主体是所需要的用户和资源信息在这边。

下面我们重点说一下首部字段。使用首部字段是为了给浏览器和服务器提供报文主体大小,所使用的语言,认证信息等内容。HTTP首部字段是由首部字段名和字段值构成的,中间用冒号":"分割。在请求报文中首部字段根据实际用处被分为以下3种格式

  1. 通用首部字段
  2. 请求首部字段
  3. 实体首部字段

其中实体首部字段是针对报文的实体部分使用的首部,补充了资源内容更新时间等与实体有关的信息。

下面的表格显示了常用首部字段的类型有哪些

通用首部字段

首部字段名 说明
Cache-Control 控制缓存的行为
Date 创建报文的日期时间
Connection 逐跳首部、连接的管理
Transfer-Encoding 指定报文主体的传输编码方式

请求首部字段

首部字段名 说明
Accept 用户代理可处理的媒体类型
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
Accept-Language 优先的语言(自然语言)
Authorization Web认证信息
Host 请求资源所在服务器
User-Agent HTTP 客户端程序的信息

实体首部字段

首部字段名 说明
Allow 资源可支持的HTTP方法
Content-Encoding 实体主体适用的编码方式
Content-Type 实体主体的媒体类型
Content-Length 实体主体的大小(单位:字节)
Content-Location 替代对应资源的URI

关于每个字段的含义可以参考一下《图解http协议》这本书。

下面我们看一下响应报文的格式

Http基础

由上图可以看出来,响应报文格式和请求报文大同小异,都是有保温首部,空行,报文实体组成。不同的是,组成报文首段的是通用首部,响应首部和实体首部组成。状态行的不同和响应首部的增加是响应报文有别于请求报文的地方,我们重点看一下状态行。

状态行中需要HTTP的版本,状态码和短语

下面的表格显示了状态码和短语

状态码 类别 原因短语
1xx Informational(信息性状态码) 接收的请求正在处理
2xx Success(成功状态码) 请求正常处理完毕
3xx Redirection(重定向状态码) 需要进行附加操作以完成请求
4xx Client Error(客户端错误状态码) 服务器无法处理请求
5xx Server Error(服务器错误状态码) 服务器处理请求出错

状态码种类繁多,我们介绍实际上常用的几种

200 OK 表示从客户端发来的请求在服务器端被正常处理了。

204 No Content 该状态码代表服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。

206 Partial Content 该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。

301 Moved Permanently 永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后应使用资源现在所指的 URI

302 Found 临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。

303 See Other 该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。

304 Not Modified 该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。

400 Bad Request 该状态码表示请求报文中存在语法错误

401 Unauthorized 该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。另外若之前已进行过 1 次请求,则表示用 户认证失败。

403 Forbidden 该状态码表明对请求资源的访问被服务器拒绝了。

404 Not Found 该状态码表明服务器上无法找到请求的资源。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。

500 Internal Server Error 该状态码表明服务器端在执行请求时发生了错误。

503 Service Unavailable 该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

接下来,我们看一下响应首部字段的几个字段的含义。

首部字段名 说明
Accept-Ranges 是否接受字节范围请求
Retry-After 对再次发起请求的时机要求
ETag 资源的匹配信息

上面就是我们对请求报文和响应报文的简单介绍

GET和POST

这篇文章主要是Android网络请求的先导文章,所以这里我们主要介绍Android网络请求的时候2个主要的方法,GETPOST

网上有很多说法关于GET和POST的区别,大家可以看看这篇文章GET和POST真正的区别,这个不是我们这篇文章要讨论的内容,我们只需要记住一点,GET是从服务器获取数据,POST是改变服务器数据就可以了。

GET方法用于获取由URI所标示的资源信息,他是将请求参数直接放到URL后面,第一个参数前有一个"?",参数格式为 参数名=参数值,参数之间通过"&"链接

POST用于修改服务器的数据,所以他的参数一般存储在报文的报文主体。