Android之网络—第一篇(Http原理)

前言:这篇网络系列的初衷是分享下网络相关的知识,文章属于个人的学习总结博客。部分内容来源网络,如有不适,请私聊。

Android之网络—第一篇(Http原理)
Android之网络—第二篇(Https原理)
Android之网络—第三篇(解读OkHttp)
Android之网络—第四篇(解读Retrofit)

什么是Http:

HyperText Transfer Tansfer Protocol 超文本传输协议,最开始是用来传输html的。

工作方式:

简单来说就是客户端发送请求,服务端响应的该请求的过程。


image.png

那客户端和服务端是如何通信的才能保证请求能够被响应的呢?那就必须有一个通信的规范了。请求报文和响应报文

报文格式:

请求报文格式(图片来源于网络)
image.png
响应报文格式(图片来源于网络)
image.png

其中:\r代表回车,\n代表换行

Request Methods(请求方法):

1、GET

获取URL指定的资源,这个请求方式是最简单的也是最常用的。使用GET 方法时,可以将请求参数和对应的值附加在 URI 后面,利用一个问号(“?”)将资源的URI和请求参数隔开,参数之间使用与符号(“&”)隔开。比如/index.jsp?username=holmofy&password=123123。无Body

2、POST

一般用于新增和修改资源。请求参数放到Body中,以键-值对的形式出现传输数据。

3、PUT

用于修改资源。请求参数放到Body中,以键-值对的形式出现传输数据。

4、DELETE

用于删除资源。无Body

5、HEAD

用法跟GET基本一致,只是服务端返回无Body。比如下载前使用HEAD发送请求,通过ContentLength响应字段,来了解网络资源的大小;或者通过LastModified响应字段来判断本地缓存资源是否要更新。

Status Code(状态码):

  • 1xx:指示信息--表示请求已接收,继续处理。
  • 2xx:成功--表示请求已被成功接收、理解、接受。
  • 3xx:客户端重定向。重定向状态码用于告诉客户端浏览器,它们访问的资源已被移动,并告诉客户端新的资源位置。客户端收到重定向会重新对新资源发起请求
  • 4xx:客户端错误--请求有语法错误或请求无法实现。
  • 5xx:服务器端错误--服务器未能实现合法的请求。

常见状态代码、状态描述的说明如下。

  • 200 OK:客户端请求成功。
  • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
  • 401 Unauthorized:Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
  • 403 Forbidden:服务器收到请求,但是拒绝提供服务。
  • 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
  • 500 Internal Server Error:服务器发生不可预期的错误。
  • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

Header:作为Http消息的元数据(属性)。下面说几个常用的属性

1、Host:服务器的主机地址。Host:hencoder.com
2、Content-Type:Body的类型,用于区分数据类型,如下是常见的类型
  • text/html:html文本,用于浏览器页面响应

  • application/x-www-form-urlencoded:普通表单,encoded URL格式: name=zhukai&nickName=rengwuxian


    image.png
  • multipart/form-data:多部分多媒体类型,一般用于传输包含二进制内容的数据。首先生成了一个 boundary 用于分割不同的字段,在请求实体里每个参数以------boundary开始,然后是附加信息和参数名,然后是空行,最后是参数内容。多个参数将会有多个boundary块。如果参数是文件会有特别的文件域。最后以------boundary–为结束标识。multipart/form-data支持文件上传的格式,一般需要上传文件的表单则用该类型。


    image.png
  • application/json:以“键-值”对的方式组织的数据。用于Api响应或者POST/PUT请求。


    image.png
  • image/jpeg或者application/zip:单文件传输,用于Api响应或者POST/PUT请求。

常见的类型:
text/html :HTML格式
text/plain :纯文本格式
text/xml :XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png :png图片格式
application/xml : XML数据格式
application/json : JSON数据格式
application/pdf : pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如文件下载)

3、Content-Length:Body的长度。实用场景:发送的二进制数据是否有换行,用长度可以避免数据被截断
4、Chunked Transfer Encoding:分块传输编码。header设置为:Transfer-Encoding: chunked
  • 背景问题:对于非持续连接,浏览器可以通过连接是否关闭来界定请求或响应实体的边界;而对于持续连接,这种方法显然不奏效。有时,尽管我已经发送完所有数据,但浏览器并不知道这一点,它无法得知这个打开的连接上是否还会有新数据进来,只能傻傻地等了。

  • 解决办法:用Content-length解决:计算实体长度,并通过头部告诉对方。浏览器可以通过 Content-Length 的长度信息,判断出响应实体已结束。但是由于 Content-Length 字段必须真实反映实体长度,但是对于动态生成的内容来说,在内容创建完之前,长度是不可知的。这时候要想准确获取长度,只能开一个足够大的 buffer,等内容全部生成好再计算。但这样做一方面需要更大的内存开销,另一方面也会让客户端等更久。

  • 新的解决办法:不依赖头部的长度信息,也能知道实体的边界——分块编码(Transfer-Encoding: chunked)数据分解成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小。

  • 目的:在服务端还未获取到完整的内容时,更快 的对客户端做出响应,减少客户等待。

  • Body的数据格式:

<length1>
<data1>
<length1>
<data1>
0(最后传输的0表示内容结束)

5、Cookie:保存服务器让客户端保存的内容。服务端可以通过响应报文的Set-Cookie告诉客户端。下次客户端发起请求时,在请求报文Cookie将数据提交给服务器,主要用于浏览器和web服务器之间身份识别。

cookie机制是因为HTTP协议是无状态的协议,但是有些场景下服务器需要知道用户的上一次状态。

cookie的属性:

  • Domain:域,表示当前cookie所属于哪个域或子域下面。
  • Path:表示cookie的所属路径。
  • Expire time/Max-age:表示了cookie的有效期,expire的值,是一个时间,过了这个时间,该cookie就失效了。或者是用max-age指定当前cookie是在多长时间之后而失效。
  • secure:表示该cookie只能用https传输。
  • httponly:表示此cookie必须用于http或https传输。

服务器发送cookie给客户端:对应的Set-Cookie。包括了对应的cookie的名称,值,以及各个属性。

  • Set-Cookie: lu=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Tue, 15 Jan 2013 21:47:38 GMT; Path=/; Domain=.169it.com; HttpOnly

客户端把cookie发送到服务器:不发送cookie的各个属性的,而只是发送对应的名称和值。

  • Cookie: name=value; name2=value2

cookie常用场景:

  • 管理登录(会话)状态,通常跟sessionID配合使用,这个sessionID是服务器本地创建一个MAP结构,专门以key-value(请求ID-会话内容)形式将每个request进行存储,记录每次会话信息状态。场景分析:如果用户在浏览器登录了,服务器会记录当前用户已登录,但是有个坏人拦截信息后在别的浏览器去请求,服务器会认为当前用户是合法,这就可能导致未登录用户拿到真正的用户信息。所以通过会话id来记录每次请求来保证是真的用户请求。

  • 个性化偏好管理

  • 追踪用户行为

5、Authorization:由于Cookie机制的一些问题,目前流行的登录授权的方式通常是通过Authorization实现的
  • 1、Basic Auth:基本认证,基本格式为 Authorization:Basic <username:password(Base64ed)> 。简单说明下<username:password(Base64ed)>是指用户名和密码是经过Base64后的密文形式放大Basic 字段后面,如果没有,或者用户密码不对,则返回http code 401页面给客户端,提示没有权限。但是这个有点信息被泄漏的风险。

  • 2、Bearer Auth:授权认证,基本格式为Authorization:Bearer <bearer token>。简单说明下<bearer token>是指别人授权给的信息。

OAuth2授权,常见的场景就是第三方登录。比如微信授权登录。
自家应用的自动登录,token登录

后序:关于Http原理篇主要是讲解Http请求报文和响应报文的格式及常用的报文格式的解析。后面文章会针对地做些拓展讲解。

如果觉得我的文章对你有帮助,请随意赞赏。您的支持将鼓励我继续创作!

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