Http基础

Http基础

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

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首部字段是由首部字段名和字段值构成的,中间用冒号":"分割。在请求报文中首部字段根据实际用处被分为如下3种格式tcp

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

其中实体首部字段是针对报文的实体部分使用的首部,补充了资源内容更新时间等与实体有关的信息。
下面的表格显示了经常使用首部字段的类型有哪些
通用首部字段工具

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

请求首部字段post

首部字段名 说明
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的版本,状态码和短语
下面的表格显示了状态码和短语ui

状态码 类别 缘由短语
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用于修改服务器的数据,因此他的参数通常存储在报文的报文主体。

相关文章
相关标签/搜索