前言:这篇网络系列的初衷是分享下网络相关的知识,文章属于个人的学习总结博客。部分内容来源网络,如有不适,请私聊。
Android之网络—第一篇(Http原理)
Android之网络—第二篇(Https原理)
Android之网络—第三篇(解读OkHttp)
Android之网络—第四篇(解读Retrofit)
什么是Http:
HyperText Transfer Tansfer Protocol 超文本传输协议,最开始是用来传输html的。
工作方式:
简单来说就是客户端发送请求,服务端响应的该请求的过程。
那客户端和服务端是如何通信的才能保证请求能够被响应的呢?那就必须有一个通信的规范了。请求报文和响应报文
报文格式:
请求报文格式(图片来源于网络)
响应报文格式(图片来源于网络)
其中:\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
-
multipart/form-data:多部分多媒体类型,一般用于传输包含二进制内容的数据。首先生成了一个 boundary 用于分割不同的字段,在请求实体里每个参数以------boundary开始,然后是附加信息和参数名,然后是空行,最后是参数内容。多个参数将会有多个boundary块。如果参数是文件会有特别的文件域。最后以------boundary–为结束标识。multipart/form-data支持文件上传的格式,一般需要上传文件的表单则用该类型。
-
application/json:以“键-值”对的方式组织的数据。用于Api响应或者POST/PUT请求。
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请求报文和响应报文的格式及常用的报文格式的解析。后面文章会针对地做些拓展讲解。
如果觉得我的文章对你有帮助,请随意赞赏。您的支持将鼓励我继续创作!