HTTP && RESTful
HTTP && RESTful
HTTP 协议是一个基于TCP/IP协议的应用词层协议,设计之初只是为了传输HTML,当然从HTTP1.0加入了MIME后就可以传输更多的数据流,比如音视频流。
HTTP 发展历程
- HTTP/0.9 -> 1991年
- HTTP/1.0 -> 1996年5月(rfc:https://tools.ietf.org/html/rfc1945)
- HTTP/1.1 -> 1999年6月(rfc:https://tools.ietf.org/html/rfc2616)
- HTTP/2.0 -> 2015年5月(rfc:https://tools.ietf.org/html/rfc7540)
又一个比我年龄还大东西
HTTP/0.9
只接受GET一种请求方法,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。
HTTP/1.0
- 加入POST,HEAD,DELETE,PUT,LINK,UNLINK请求方法
- 开始在请求行里面加入HTTP版本
- 由于加入了请求头,多了大量的功能,比如Content-Type,gzip
HTTP/1.1
- 加入OPTIONS,TRACE,CONNECT请求方法
- 默认开启长链接
- 支持分片传输数据及
Transfer-Encoding: chunked
这个响应头 - 为了保证安全请求头Host域为必须的
- 完善了对缓存的处理
是目前使用时间最长和广泛的一个版本
由于HTTP本身是明文方式传输数据,消息内容很容易被捕获(比如小米路由篡改HTTP错误码弹广告,国内的运营商在网页加入广告,弹窗),于是引入了HTTPS(rfc: https://tools.ietf.org/html/rfc281)
即使作为最为广泛的协议,也存在一些存在比较严重的问题,比如即使默认开启了长链接也仅仅是为了避免频繁请求导致的建立过多的链接,避免链接建立时需要花费过多的时间。但是要想主动向浏览器端发送数据也只能依靠长轮询,或者是websocket
。
HTTP/2.0
- Frame
- 多路复用
- 服务端推送
HTTP/2.0 通过在TCP/IP(传输层)和HTTP(应用层)添加了一个Frame的层而使得在不改变原有的协议实现了Server Push,和流量控制等。这里不得不感谢Google在其中作的贡献 -> SPDY
了解HTTP协议后对编码带来的好处
HTTP 本身就是一个很完善的协议,但由于每种语言提供的Server对协议实现的完整程度不同,有时候会有一些比较微小的变化,比如 tornado 实现了HTTP/1.1没有考虑HTTP/1.0的兼容。导致在处理路由上的差异,或则是对UTF-8的支付
HTTP常见用途
- 上网,看视频
- SAOP
- 服务端使用http给客户端提供接口
- 使用Http协议作服务提供的SDK,实现跨平台
RESTful(用URL定位资源,用HTTP方法操作)
RESTful架构风格最初由Roy T. Fielding(HTTP/1.1协议专家组负责人)在其2000年的博士学位论文中提出。
REST即Representational State Transfer的缩写,可译为”表现层状态转化”。REST最大的几个特点为:资源、统一接口、URI和无状态。
资源
- URI (Union Resource Identifier) 统一资源标记符 (张三)
- URL(Union Resource Location) 统一资源定位符 (XX省XX市XX区XX路XX号XX单元XX 张三)
统一接口
- GET(SELECT):从服务器取出资源(一项或多项)。
- POST(CREATE):在服务器新建一个资源。
- PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
- DELETE(DELETE):从服务器删除资源。
Example
- GET /zoos:列出所有动物园
- POST /zoos:新建一个动物园
- GET /zoos/ID:获取某个指定动物园的信息
- PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
- DELETE /zoos/ID:删除某个动物园
- GET /zoos/ID/animals:列出某个指定动物园的所有动物
- DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物
状态码
- 200 Ok - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
- 201 Created - [POST/PUT/PATCH]:用户新建或修改数据成功。
- 204 No Content - [DELETE]:用户删除数据成功。
- 400 Bad Request - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
- 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
- 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
- 404 Not Found - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
- 409 Conflict 重复提交请求
- 500 Internal Server Error - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
无状态
- 来自客户的每一个请求必须包含服务器处理该请求所需的所有信息。换句话说,服务器端不能存储来自某个客户的某个请求中的信息,并在该客户的其他请求中使用。
超媒体处理
返回结果中提供链接,不直接将流字节流写回给客户端。及尽量使用 RESTful 返回字符流数据。
看Url就知道要什么,看http method就知道干什么,看http status code就知道结果如何
常见Web优化方式
- 图片合并
- 内容镶嵌
- 文件合并
- 域名分片
- 对字符流开启gzip
- 合理使用缓存
- ….
参考链接
转载请注明作者和出处,并添加本页链接。
原文链接:
//xiaochun.zrlog.com/http-and-restful.html