Android网络编程(二)构:HTTP协议报文基本结

HTTP协议属于TCP/IP中的应用层,用于客户端与服务端之间的通信,客户端请求访问文本或图像等资源,服务器端则提供资源响应,HTTP协议中,必定是客户端先发起请求,服务端在未收到请求之前不会进行响应。这一章主要针对HTTP/1.1版本进行讲解,因为和HTTP/2.0有些区别。后面有空会对比这两个版本的区别。

1 HTTP在TCP/IP中的位置

Android网络编程(二)构:HTTP协议报文基本结_第1张图片
HTTP与TCP/IP中其它协议的关系

找了张神图,很清晰明了的标明了HTTP的应用层协议与其它层协议的关系。

  • 1.1 DNS:属于应用层,域名解析系统,通过把域名转换为IP地址,因为底层的网络层是通过IP来寻址的,域名它不认识;
  • 1.2 TCP协议:属于传输层,负责端对端的连接,通过三次握手提供可靠性连接;
  • 1.3 IP协议:属于网络层,负责把上面要传输的数据从一台主机打包带到目标IP主机上;

2 HTTP协议请求与响应头

HTTP协议通过客户端请求和服务端的响应来建立通信,所以必须请求和响应的信息必须得按照特定的套路来,不然双方就不认识,比如说,给日本人打电话先你得先确认好用哪种语言进行沟通,这个举例有些苍白,但是Who Care!

2.1 请求报文

客户端请求的格式我们称之为请求报文,由请求的方法,URI,HTTP协议的版本号,请求的字段(可选),还有请求的内容(可选)构成。


Android网络编程(二)构:HTTP协议报文基本结_第2张图片
请求的套路:请求报文

请求方法、请求URI和协议版本号构成请求行,请求首部是可选的,包括请求首部,通用首部,实体首部,报文主体与报文首部之间必须有空行,因为服务端是通过空行来判断报文主体的。


Android网络编程(二)构:HTTP协议报文基本结_第3张图片
请求报文结构

下面讲一下这些各个组成。

  • 2.1.1 请求方法:首先,你客户端需要服务端提供服务,你首先要让服务器知道你要干嘛,是洗脚还是按摩或者一条龙,不同的请求意图价位可是不一样的,服务器应对方式也会有所区别。
    2.1.1.1 GET方法:获取资源。
    2.1.1.2 POST方法:获取资源的时候带上传输实体,GET也可以,但GET一般不这样用。
    2.1.1.3 PUT方法:传输实体文件。一般不用,因为不安全,方法自身没有安全验证,导致谁都可以
    给你的服务器传文件。
    2.1.1.4 HEAD方法:和GET一样获取资源,但是只拿响应头,服务端不返回报文主体;
    2.1.1.5 DELETE: 删除指定的资源,作用和PUT相反;
    2.1.1.6 OPTIONS: 获取服务端针对请求的URI支持的方法;
    2.1.1.7 TRACE: 追踪路径,追踪请求经过的代理服务器,可以用来确认请求经过代理时进行的操作;
    2.1.1.8 CONNECT:用隧道协议连接代理,用隧道协议进行通信。
  • 2.1.2 URI(统一资源标识符 Uniform Resource Identifier)
    URI用于标识资源,而URL(统一资源定位符)是用于标识互联网资源,URL是狭义的概念,URI是广义的概念,URI包含URL,在RFC文档中,已经不再使用URL,转用URI,绝对URI的格式为


    Android网络编程(二)构:HTTP协议报文基本结_第4张图片
  • 2.1.3 客户端使用的HTTP协议版本,顾名思义,HTTP协议的版本号
    HTTP/0.9(出现的时候没有作为标准),HTTP/1.0(开始作为标准),
    HTTP/1.1(目前的普及版本),HTTP/2.0(最新版本,正在快速普及的版本)。
  • 2.1.4 请求首部字段
    需要服务端处理的请求内容或属性,可以添加一些附加的要求,这一块的字段超级多,后面再讲。
  • 2.1.5 内容实体
    客户端要发送数据内容,比如用POST请求附加的文件和字段就是加在这里。

2.2 响应报文

收到客户端的大佬请求后,服务端会返回对应的请求信息,即响应报文,响应报文主要包括服务器端的HTTP协议版本、状态码、表示状态码的原因短语,这三者组成状态行,除此之外还有响应首部字段,以及响应主体,整体结构除了状态行,其它部分结构和请求报文类似。


Android网络编程(二)构:HTTP协议报文基本结_第5张图片
响应的套路:响应报文

报文主体和首部字段之间有一个必不可少的空行。


Android网络编程(二)构:HTTP协议报文基本结_第6张图片
响应报文结构

这里也大概讲一下响应报文各部分信息:

  • 2.2.1 协议版本
    服务器端使用的HTTP协议版本号
  • 2.2.2 状态码和原因短语:这两个是孪生的,状态码会伴随着描述状态码的原因短语,我们客户端就是通过状态码来判断请求是成功了还是失败了,状态码以3位数字组成,主要分为下面几类
    2.2.2.1 1xx 信息性状态码,表示请求正在处理中
    2.2.2.2 2xx 请求成功状态码,请求正常处理完成,常用的有200,204,206
    2.2.2.3 3xx 重定向状态码,需要进行一些附加的操作才能完成请求,常用的有301,302,303,307
    2.2.2.4 4xx 客户端错误状态码,表示客户端的请求存在错误,常用的有400,401,403,404
    2.2.2.5 5xx 服务器端错误状态码,表示服务器端处理发生错误,常用的有500,503
    大概码一下这些常用的,以后翻起来也方便不是。
状态码 原因短语 原因短语
200 OK 成功处理客户端发来的请求
204 No Content 成功处理请求,但不返回主体内容,通常用于客户端向服务器发送信息而服务器无需返回新内容的情况下使用
206 Partial Content 客户端进行范围请求,即GET方法要求获取资源的部分内容
301 Moved Permanently 永久重定向,所请求的资源已经更换URI了
302 Found 临时重定向,所请求的资源暂时更换成新的URI
303 See Other 资源存在另一个URI,明确要求客户端采用GET方法获取资源
304 Not Modified 表示客户端带有附加条件请求资源时,服务器端已找到资源,但是不满足客户端的附加条件,3xx里的奇葩,因为跟重定向没关系
307 Temporary Redirect 临时重定向,和302有一样的意思,满足特定浏览器需求
400 Bad Request 请求报文中存在语法错误
401 Unauthorized 表示请求的内容需要有身份认证信息,嗯,大概就是你权限还不够的意思
403 Forbidden 服务器拒绝服务,没有为什么,就是拒绝
404 Not Found 服务器找不到对应请求的资源,在服务器想委婉拒绝你的时候也会用这个借口
500 Internal Server Error 什么都不用说了,服务器端出现bug了
503 Service Unavailable 还请求个蛋啊,服务器已经挂了

请求报文还有响应报文的首部字段还没有细讲,因为这些字段实在太多了,看缘分,后面再码一下,就当做扫盲了。

你可能感兴趣的:(Android网络编程(二)构:HTTP协议报文基本结)