前言
现如今,网络无处不在。对于Android开发者而言,免不了涉及到对网络的访问。于是挖个坑= = ,介绍一下Android下关于网络编程的方方面面,本文将讲述HTTP协议的一些必备知识。
接下来我将持续推出Android网络相关的一系列文章,包括HttpURLConnection、Volley、OkHttp3、Retrofit2的使用及源码分析等,有兴趣可以关注whd_Alive的Android开发笔记
相关文章
Android 网络(二) HttpURLConnection用法解析
Android 网络(三) Volley使用解析
Android 网络(四) Volley源码解析
Android 网络(五) OkHttp用法解析
Android 网络(六) OkHttp源码解析
Android 网络(七) Retrofit用法解析
Android 网络(八) Retrofit源码解析
HTTP协议简介
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。它是一个属于应用层的面向对象的协议,所有的WWW文件都必须遵守这个标准。
协议特点
-
采用C/S模型:
--Client:浏览器(浏览器)请求,接收,显示“网络对象
--Server:Web服务器根据请求发送对象。
C/S架构图示 - 使用TCP传输协议
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
格式
HTTP报文
HTTP报文分为请求报文和响应报文两种基本分类。一般来说,一个响应对应一个请求。
- 请求报文是客户端发送给服务器的用于请求服务和资源的消息
- 响应报文是服务器对请求消息的应答。
HTTP请求报文
首先,放上上课时PPT中的截图(我还只是个学生,笑)
请求行
由上图,显而易见:
请求行 = 请求方法 + 空格 + URL + 空格 + HTTP协议版本
示例 :GET /somedir/page.html HTTP/1.1
其中URL就是一个统一资源标识符,HTTP协议版本就是字面上的意思,表明请求的HTTP协议版本。
HTTP请求方法有8种,说明如下:
请求方法 | 说明 |
---|---|
GET | 请求获取Request-URI所标识的资源 |
POST | 在Request-URI所标识的资源后附加新的数据 |
HEAD | 请求获取由Request-URI所标识的资源的响应消息报头 |
PUT | 请求服务器存储一个资源,并用Request-URI作为其标识 |
DELETE | 请求服务器删除Request-URI所标识的资源 |
TRACE | 请求服务器回送收到的请求信息,主要用于测试或诊断 |
CONNECT | 保留将来使用 |
OPTIONS | 请求查询服务器的性能,或者查询与资源相关的选项和需求 |
对于Android开发而言,我们最关注的其实也就只有POST和GET。
GET与POST对比
我就不再个人赘述了,直接放上一篇比较系统的分析文章
请求报头
请求报头和方法配合工作,决定客户端能做什么事情,详见消息报头
请求数据
- 不在GET方法中使用,而在POST方法中使用
- POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
HTTP响应报文
状态行
每条响应报文都会包含一个3位数字和可读的状态,用来告诉客户端,服务器发生了什么事情。数字状态码便于程序处理差错,原因短语更便于人们理解。状态码分为5类:
- 100~199:指示信息,表示请求已接收,继续处理
- 200~299:请求成功,表示请求已被成功接收、理解、接受
- 300~399:重定向,要完成请求必须进行更进一步的操作
- 400~499:客户端错误,请求有语法错误或请求无法实现
- 500~599:服务器端错误,服务器未能实现合法的请求
常见的状态码如下,详情参见HTTP状态码维基百科
- 101 Switching Protocols:服务器正在根据客户端的指定,将协议切换成Update首部所示的协议。
- 200 OK:服务器已成功处理了请求并提供了请求的网页
- 204 No Content:服务器成功处理了请求,但没有返回任何内容
- 301 Moved Permanently:请求的网页已永久移动到新位置。响应的Location首部应包含资源现在所处的URL。
- 302 Found:与301类似,但这里的移除是临时的。将来的请求仍应使用老的URL。
- 304 Not Modified:客户的缓存资源是最新的,要客户端使用缓存。
- 400 Bad Request:告知客户端发送了一个错误的请求。
- 403 Forbidden:请求被服务器拒绝了。(可能是没有访问服务器的权限)
- 404 Not Found:服务器无法找到所请求的URL。
- 410 Gone:服务器曾经有这个资源,现在没有了,与404类似。
- 500 Internal Server Error:服务器遇到一个错误,使其无法为请求提供服务。
- 502 Bad Gateway:作为代理或网关使用的服务器收到了上游的无效响应。
- 503 Service Unavailable:服务器现在无法为请求提供服务,但过一段时间就可以恢复服务。
响应报头
见下文HTTP消息报头
响应正文
好像没什么好说的= =!
HTTP消息报头
消息报头和方法配合工作,共同决定了客户端和服务器能做什么事情。可以将/消息报头分为通用报头、请求报头、响应报头、实体报头等,以下将分类详细说明。
通用报头
客户端和服务器都可以使用,提供与报文下相关的最基本的信息。
- Connection:允许客户端和服务器指定与请求/响应连接相关的选项
- Date:日期和时间标志,说明报文是什么时刻创建的
- MIME-Version:给出了发送端使用的MIME版本
- Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式
- Via:显示了报文经过的中间节点(代理、网关等等)
- Cache-Control:用于随报文传送缓存指示
- Pragma:另一种随报文传送指示的方式,但并不专用于缓存
请求报头
只在请求报文中有意义,用于说明是谁或什么在发送请求、请求源自何处,或客户端的喜好及能力等。
- Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机
- User-Agent:发送请求的浏览器类型、操作系统等信息
- Accept:客户端可识别的内容类型列表,用于指定客户端接收那些类型的信息
- Accept-Encoding:客户端可识别的数据编码
- Accept-Language:表示浏览器所支持的语言类型
- Referer:提供了包含当前请求URI的文档的URL
响应报头
为客户端提供了一些额外信息,比如谁在发送响应、响应者的功能、其它一些特殊指令等
- Location:用于重定向接受者到一个新的位置,常用在更换域名的时候
- Server:包含可服务器用来处理请求的系统信息,与User-Agent请求报头是相对应的
- Age:(从最初创建开始)响应持续时间
- Public:服务器为其资源支持的请求方法列表
- Retry-After:如果资源不可用,在此时间重试
- Accept-Ranges:(协商首部)对此资源来说,服务器可接受的范围类型
- Set-Cookie:(安全首部)类似Cookie,用于设置Cookie
实体报头
用来描述HTTP报文的负荷,提供了有关实体及其内容的大量信息,可以告知报文的接收者它在对什么进行处理
- Allow:列出可以对此实体执行的请求方法
- Content-Type:发送给接收者的实体正文的媒体类型
- Content-Lenght:实体正文的长度
- Content-Language:描述资源所用的自然语言,没有设置则该选项则认为实体内容将提供给所有的语言阅读
- Content-Encoding:实体报头被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。
- Last-Modified:实体报头用于指示资源的最后修改日期和时间
- Expires:实体报头给出响应过期的日期和时间
总结
- 本文对HTTP协议中的必备知识做出讲解。
- 笔者水平有限,如有错漏,欢迎指正。
- 接下来我将持续推出Android网络相关的一系列文章,包括HttpURLConnection、Volley、OkHttp3、Retrofit2的使用等,有兴趣可以关注whd_Alive的Android开发笔记
欢迎关注whd_Alive的简书
- 不定期分享Android开发相关的技术干货,期待与你的交流,共勉。