分布式通讯协议--http、https
概述
¶客户端和服务器端
¶资源
- 文本(html)
- word
- 视频
- 音频
- 其他资源
¶媒体类型(MIME类型)
- text/html
- image/jpeg
- application/json
- application/xml
- …等等
¶URI 和 URL
URI: web服务器资源的名字。比如:index.html
URL: 统一资源定位符。http://www.baidu.com/index.html?query#location 这是个完整的URL
URL组成:
- schema: http/https/ftp
- host: web服务器的ip地址或者域名
- port: 服务端端口, http默认访问的端口是80
- path: 资源访问路径
- query: 查询参数
- location 锚点
¶请求方法
- GET
- PUT
- DELETE
- POST
- HEAD
报文
¶request
request消息结构包含三部分: (起始行、首部字段、主体)
起始行:METHOD /path http/version-number
首部字段:headerName: value
主体:request body
¶response
http/version-number status code message
header-name:value
body
状态码
http/1.1版本的协议里面定义了五种类型的状态码
- 1XX 提示信息
- 2XX 成功
- 3XX 重定向
- 4XX 客户端错误
- 5XX 服务器端的错误
缓存
HTTP协议的特点
- 无状态(多个请求之间没有任何关系,通过cookie + session实现有状态)
- 多次请求(比如,html中包含其他js/css资源,还会去请求)
- 基于TCP协议
HTTPS
在http的基础上多了 SSL/TLS 加密
¶原理、升级
¶使用对称加解密
密钥是公开的,所有的客户端都可以拿到
¶不同的客户端使用不同的密钥
问题:协商过程是没有加密的,所以还会出现被截断的问题
¶使用非对称加密
非对称:公钥和私钥,通过一定的算法生成不同的秘钥,公钥(每个都不一样)给到客户端,私钥自己保留【公钥加密,私钥极米 、 公钥解密,私钥加密】
问题: 客户端如何拿到公钥
服务器端把公钥发送给每一个客户端。(普遍用法)
坏叔叔依旧可以拦截这个请求,并且使用新的公钥重新生成新的请求内容,发送到服务器服务器端把公钥放到远程服务器,客户端可以请求到。(不建议)
还要开放证书请求服务,造成服务器不必要的开销让浏览器保存所有的公钥(不现实,银行除外)
¶以上几种方式总结
按照上面的所有方案,公钥被调包或替换的问题按照上面的方案,永远存在。
¶使用第三方机构解决
通过第三方机构,使用第三方机构的私钥对我们【需要传输的公钥】进行加密
¶数字证书
数字证里面包含的内容:
- 公司信息
- 网站信息
- 数字证书的算法
- 公钥
¶请求流程
RESTful
REST:表述性状态转移,使用WEB标准来做一些准则和约束。
##基本概念
- 在REST中,一切的内容都被认为是一种资源
- 每个资源都由URI唯一标识
- 使用统一的接口处理资源请求(POST/GET/PUT/DELETE/HEAD)
- 无状态
¶资源和URI
- / 表示自愿的层级关系
- ? 过滤自愿
- 使用 _ 或者 - , 让uri的可读性更好
¶统一接口
- GET 获取某个资源,幂等
- POST 创建一个新的资源
- PUT 替换某个已有的资源(更新操作),理论上应该不是幂等的,但是实际情况根据具体的设计
- PATCH 更新部分资源
- DELETE 删除某个资源,理论上应该不是幂等的,但是实际情况根据具体的设计
¶资源表述
- MIME类型
- request: Accept 例如:text/html、image/jpeg等等
- response: Content-type 告诉客户端资源的表述形式
¶资源链接
超媒体即应用状态引擎
¶状态转移
服务器端不应该保存客户端状态和应用状态
¶restful最佳设计
¶域名需要有针对性
http://api.xxx.com
http://xxx.com/api
¶版本
http://api.xxx.com/v2/getUser/xxx
header 里面维护版本
¶路径要有意义
http://xxx.com/api/user_list // 获取用户列表
http://xxx.com/api/goods-list // 获取商品列表
¶过滤信息(参数)
http://xxx.com/api/user_list?pageNum=1&pageSize=10