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服务器根据请求发送对象。


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

格式

HTTP报文

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

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

HTTP请求报文

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


HTTP请求

请求行

由上图,显而易见:

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

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

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


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响应报文

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开发相关的技术干货,期待与你的交流,共勉。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容