Android 网络(一) HTTP协议

前言

现如今,网络无处不在。对于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服务器根据请求发送对象。


    Android 网络(一) HTTP协议_第1张图片
    C/S架构图示
  • 使用TCP传输协议
  • 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

格式

HTTP报文

HTTP报文分为请求报文响应报文两种基本分类。一般来说,一个响应对应一个请求。

  • 请求报文是客户端发送给服务器的用于请求服务和资源的消息
  • 响应报文是服务器对请求消息的应答。

HTTP请求报文

首先,放上上课时PPT中的截图(我还只是个学生,笑)


Android 网络(一) HTTP协议_第2张图片
HTTP请求

请求行

由上图,显而易见:

请求行 = 请求方法 + 空格 + URL + 空格 + HTTP协议版本
示例 :GET /somedir/page.html HTTP/1.1

其中URL就是一个统一资源标识符,HTTP协议版本就是字面上的意思,表明请求的HTTP协议版本。

HTTP请求方法有8种,说明如下:


Android 网络(一) HTTP协议_第3张图片
Method
请求方法 说明
GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

对于Android开发而言,我们最关注的其实也就只有POSTGET

GET与POST对比

我就不再个人赘述了,直接放上一篇比较系统的分析文章

HTTP协议中GET和POST方法的区别

请求报头

请求报头和方法配合工作,决定客户端能做什么事情,详见消息报头

请求数据

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

HTTP响应报文

Android 网络(一) HTTP协议_第4张图片
image.png

状态行

每条响应报文都会包含一个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开发相关的技术干货,期待与你的交流,共勉。

你可能感兴趣的:(Android 网络(一) HTTP协议)