Android 网络编程:HTTP 协议

  HTTP 协议是一个基于请求与响应模式的、无状态的、应用层的协议,常基于 TCP 的连接方式,HTTP1.1 版本中给出一种持续连接的机制,绝大多数的 Web 开发,都是构建在 HTTP 协议之上的 Web 应用。在之前的博客中多次使用 HTTP 网络请求,了解 HTTP 协议的详细工作过程以及报文格式,对于深入理解 Android 网络编程具有重要的意义。此篇博文通过搜集网络上优秀的博客文章,对 HTTP 协议的内容进行了较为详细的总结。

  HTTP 协议(HyperText Transfer Protocol,超文本传输协议)是用于从 WWW 服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

HTTP工作流程

  HTTP协议永远都是客户端发起请求,服务器回送响应。见下图:

22-1

  这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。HTTP协议是一个无状态的协议,同一个客户端的这次请求和上次请求是没有对应关系。

  一次HTTP操作称为一个事务,其工作过程可分为四步:

  1. 首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。

  2. 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。

  3. 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。

  4. 客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。

  如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。

HTTP URL的格式

1
http://host[":"port][abs_path]
  • http 表示通过 HTTP 协议来定位网络资源

  • host 表示合法的 Internet 主机域名或者 ip 地址

  • port 指定一个端口号,为空则使用默认端口 80

  • abs_path 指请求资源的 URL

HTTP请求报文

  HTTP 请求由四部分组成,分别是:请求行、请求报头、空行、请求数据。

22-2

请求行

请求行格式:

1
方法 请求的URL 版本 回车换行

HTTP请求方法:

  HTTP请求方法有8种,分别是GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE、CONNECT 。

  • GET:GET的本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。

  • POST:向服务器提交数据。这个方法用途广泛,几乎目前所有的提交操作都是靠这个完成。

  • PUT:本质上来讲, PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。

  • DELETE:请求服务器删除请求的URI所标识的资源。

  • HEAD:HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息。有的人可能觉得这个方法没什么用,其实不是这样的。想象一个业务情景:欲判断某个资源是否存在,我们通常使用GET,但这里用HEAD则意义更加明确。

  • OPTIONS:它可以用来获取服务器支持的HTTP请求方法,还可以用来用来检查服务器的性能。它对于服务端和用户端一定是安全的。

  • TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断。

  • CONNECT 保留将来使用。

请求报头

  在请求行之后会有 0 个或者多个请求报头,每个请求报头都由关键字/值对组成,每行一对,关键字和值用英文冒号 : 分隔。请求报头通知服务器关于客户端求求的信息,典型的请求头有:

  • Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机

  • User-Agent:发送请求的浏览器类型、操作系统等信息

  • Accept:客户端可识别的内容类型列表,用于指定客户端接收那些类型的信息

  • Accept-Encoding:客户端可识别的数据编码

  • Accept-Language:表示浏览器所支持的语言类型

  • Connection:允许客户端和服务器指定与请求/响应连接有关的选项,例如设置为Keep-Alive则表示保持连接。

  • Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式。

空行

  最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。

请求数据

  请求数据不在 GET 方法中使用,而是在 POST 方法中使用。POST 方法适用于需要客户填写表单的场合,与请求数据相关的最常用的请求头是 Content-Type 和 Content-Length。

HTTP响应报文

  HTTP响应也由四部分组成,分别是:状态行、响应报头、空行、响应数据

22-3

状态行

状态行格式:

1
版本 状态码 原因短语 回车换行

HTTP协议响应状态码:

  HTTP 协议响应状态码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

  • 1xx:指示信息–表示请求已接收,继续处理

  • 2xx:成功–表示请求已被成功接收、理解、接受

  • 3xx:重定向–要完成请求必须进行更进一步的操作

  • 4xx:客户端错误–请求有语法错误或请求无法实现

  • 5xx:服务器端错误–服务器未能实现合法的请求

常见状态代码、状态描述、说明

  • 200 OK 客户端请求成功。

  • 304 NOT MODIFIED 未修改;一般浏览器会缓存一些数据,当下次请求时将发送Etag与Last_Modified信息给服务器确定是否次文件在服务器修改过,若果是将重新加载。

  • 400 Bad Request 客户端请求有语法错误,不能被服务器所理解。

  • 401 Unauthorized 请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用。

  • 403 Forbidden 服务器收到请求,但是拒绝提供服务。

  • 404 Not Found 请求资源不存在,eg:输入了错误的URL。

  • 500 Internal Server Error 服务器发生不可预期的错误。

  • 503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

响应报头

  用于服务器传递自身信息的响应,常见的响应报头:

  • Location:用于重定向接受者到一个新的位置,常用在更换域名的时候。
  • Server:包含可服务器用来处理请求的系统信息,与User-Agent请求报头是相对应的。
响应数据

  服务器根据发送的请求返回的数据。

HTTP报头

  HTTP报头分为通用报头,请求报头,响应报头和实体报头。

  • 请求方的http报头结构:通用报头|请求报头|实体报头 。

  • 响应方的http报头结构:通用报头|响应报头|实体报头。

  请求报头与响应报头在前文已经详细描述,下文主要讲解通用报头和实体报头。

通用报头

  既可以出现在请求报头,也可以出现在响应报头中。

  • Date:表示消息产生的日期和时间。

  • Connection:允许发送指定连接的选项,例如指定连接是连续的,或者指定“close”选项,通知服务器,在响应完成后,关闭连接。

  • Cache-Control:用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制)。

实体报头

  实体报头用来定于被传送资源的信息,既可以用于请求也可用于响应。请求和响应消息都可以传送一个实体,常见的实体报头为:

  • Content-Type:发送给接收者的实体正文的媒体类型。

  • Content-Lenght:实体正文的长度。

  • Content-Language:描述资源所用的自然语言,没有设置则该选项则认为实体内容将提供给所有的语言阅读。

  • Content-Encoding:实体报头被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。

  • Last-Modified:实体报头用于指示资源的最后修改日期和时间。

  • Expires:实体报头给出响应过期的日期和时间。

请求示例

  Windows 下使用 cmd 的 telnet 命令模拟 HTTP 请求

打开命令提示符输入以下内容,建立连接
1
telnet blog.line-coding.tech 80

  HTTP 默认使用 80 端口,HTTPS 默认使用 443。此示例是对我的博客的一个404页面发送一个GET请求,所以请求地址为 blog.line-coding.tech。

  输入上面的命令回车之后就会进入命令界面,可以输入请求信息,也可以通过使用快捷键 “Ctrl+](右中括号)” 来打开本地回显功能查看自己输入的内容,在本地回显界面再按下回车就可以进入命令界面编辑请求信息。

输入请求头信息
1
2
3
4
5
6
7
GET / HTTP/1.1
HOST:blog.line-coding.tech
User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN
Connection:keep-alive
按两下回车键得到响应信息

  第一个回车代表请求头结束的空行,第二个回车代表请求数据为空并发送请求。结果如下:

22-4

  红色箭头指示为我们输入的请求头,蓝色箭头指示的为响应报文的内容,下面还有一些内容就是响应数据。

  参考文章:

[1]《网络协议》HTTP 协议

[2] http协议学习系列

[3]通过win7中cmd命令提示符telnet模拟http请求

坚持原创技术分享,您的支持将鼓励我继续创作!