HTTP协议:无状态,有连接和短连接
http请求和响应
RESTful api
cookie和session、token

CS和BS

  • CS:Client/Server(客户端/服务器结构),客户端、服务端之间需要使用Socket,约定协议、版本(往往使用的协议是TCP或者UDP),指定地址和端口进行通讯,双方还可以约定一定的数据格式
  • BS:Browser/Server(浏览器/服务器结构)
    • Browser浏览器,一种特殊的客户端,支持HTTP(s)协议,能够通过URL向服务端发起请求,等待服务端返回HTML等数据,并在浏览器内可视化展示的程序
    • Server,支持HTTP(s)协议,能够接受众多客户端发起的HTTP协议请求,经过处理,将HTML等数据返回给浏览器
      本质上来说,BS是一种特殊的CS,即客户端必须是一种支持HTTP协议且能解析并渲染HTML的软件,服务端必须是能够接收多客户端HTTP访问的服务器软件

可进一步参看BS和CS的区别有哪些?

HTTP协议

HTTP协议底层基于TCP协议实现

无状态、有连接和短连接

  • 无状态:指服务器无法知道2次请求之间的联系,即使是前后2次同一个浏览器也没有任何数据能够判断出是同一个浏览器的请求。后来可以通过cookie、session来判断
  • 有连接:是因为它基于TCP协议,是面向连接的,需要3次握手、4次断开
  • 短连接:Http 1.1之前,都是一个请求一个连接,而Tcp的连接创建销毁成本高,对服务器有很大的影响;自Http 1.1开始,支持keep-alive,默认也开启,一个连接打开后,会保持一段时间(可设置),浏览器再访问该服务器就使用这个Tcp连接,减轻了服务器压力,提高了效率

URL

  • Uniform Resource Locator 统一资源定位符,每一个链接指向一个资源供客户端访问
schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]
  • 更多关于URL可参看我之前的文章认识URL

HTTP消息

消息分为Request、Response

Request

浏览器向服务器发起的请求

  • 请求报文由Header消息报头、Body消息正文组成(可选)

    • 请求报文第一行称为请求行
  • 每一行使用回车和换行符作为结尾

  • 请求方法Method:主要为如下几种

    • get:获取资源,请求获取URL对应的资源,GET方法使用Query String
    • post:创建新的资源,提交数据至服务器端,请求时提交的数据是在请求报文的正文Body部分
    • head:和GET类似,不过不返回响应报文的正文
    • put:更新资源
    • patch:部分更新资源
    • delete:删除资源

Response

服务器对客户端请求的响应

  • 响应报文由Header消息报头、Body消息正文组成(可选)

    • 响应报头第一行称为状态行:(响应消息行)协议版本 状态码 消息描述CRLF
  • 每一行使用回车和换行符作为结尾

  • status code状态码

1xx 提示信息,表示请求已被成功接收,继续处理

2xx 表示正常响应
    200 正常返回了网页内容

3xx 重定向
    301 页面永久性移走,永久重定向。返回新的URL,浏览器会根据返回的url发起新的request请求
    302 临时重定向
    304 资源未修改,浏览器使用本地缓存

4xx 客户端请求错误
    404 Not Found,网页找不到,客户端请求的资源有错
    400 请求语法错误
    401 请求要求身份验证
    403 服务器拒绝请求

5xx 服务器端错误
    500 服务器内部错误
    502 上游服务器错误,例如nginx反向代理时

详细状态码可参考Status Code Definitions

RESTFul api

  • RESTFul:REST(Representational State Transfer),表现层状态转移
  • 表现层是资源的表现层,对于网络中的资源就需要URI(Uniform Resource Identifier)来指向
  • 通过请求方法(动作)和URI来使资源发生状态转移
  • Restful的核心是资源,URL应该指向资源,所以应该是使用名称表达,而不是动词表达
  • GET方法只是获取资源,而不是改变资源状态。改变资源请使用POST、PUT、DELETE等方法

使用名词

  • 举例
方法 路径 说明
GET /posts 返回所有文章
GET /posts/10 返回id为10的文章
POST /posts 创建新的文章
PUT /posts/10 更新id为10的文章
DELETE /posts/10 删除id为10的文章
PATCH /posts/10 部分更新id为10的文章数据

集合功能

  • 过滤filter
    • 指定过滤条件如GET /posts?tag=python
  • 排序sort
    • 指定排序条件,有多种设计风格,如用+表示asc,-表示desc:GET /posts?sort=+title,-idGET/posts?sort=title_asc,id_desc
  • 分页page
    • 如:GET /posts?page=5&size=20

错误处理

有时候单单从状态码中无法详尽描述错误的信息
如:

{
    "code":10056,
    "message":"Invalid ID",
    "description":"More details":
}

版本

  • 版本号使用简单数字如v1:https://monkeyjerry.top/api/v1/posts/10

返回结果

  • 返回数据一律采用JSON格式

Cookie

当服务器收到HTTP请求时,服务器可以在响应头里面添加一个Set-Cookie键值对。浏览器收到响应后通常会保存这些Cookie,之后对该服务器每一次请求中都通过Cookie请求头部将Cookie信息发送给服务器

  • 键值对信息
  • 是一种客户端、服务器端传递数据的技术
  • 一般来说cookie信息是在服务器端生成,返回给浏览器端的
  • 浏览器端可以保持这些值,浏览器对同一域发起每一请求时,都会把Cookie信息发给服务器端
  • 服务端收到浏览器端发过来的Cookie,处理这些信息,可以用来判断这次请求是否和之前的请求有关联
  • Cookie的过期时间、域、路径、有效期、适用站点都可以根据需要来指定

详情可进一步参考RESTful 架构详解深入理解什么是RESTful API ?

cookie

cookie中的几个键值

  • expires:Cookie可以设定过期终止时间,过期后将被浏览器清除。如果缺省,Cookie不会持久化,浏览器关闭Cookie消失,称为会话级Cookie
  • domain:域确定有哪些域可以存取这个Cookie。缺省设置属性值为当前主机
  • Path:确定哪些目录及子目录访问可以使用该Cookie
  • Secure:表示Cookie随着HTTPS加密过得请求发送给服务端有些浏览器已经不允许http协议使用Secure了,因为这个Secure不能保证Cookie是安全的,因此Cookie中不要传输敏感信息
  • HttpOnly:将Cookie设置此标记,就不能被JavaScript访问,只能发给服务器端

关于cookie

  • Cookie一般明文传输(Secure是加密传输)
  • 有4kB大小限制
  • Cookie 由服务器生成,发送给浏览器,浏览器把 cookie 以 kv 形式保存到某个目录下的文本文件内,下一次请求同一网站时会把该 cookie 发送给服务器
  • 每次请求中都会发送Cookie,增加了流量

Session

  • 服务端会为每一次浏览器端第一次访问生成一个SessionID,用来唯一标识该浏览器,通过Set-Cookie发送到浏览器端。浏览器端收到之后并不永久保持这个Cookie,只是会话级的。浏览器访问服务端时,会使用Cookie,也会带上这个SessionID的Cookie值
  • session保存在服务端,服务端会维持这个SessionID一段时间,如果超时,会清理这些超时没有人访问的SessionID。如果浏览器端发来的SessionID无法在服务端找到,就会自动再次分配新的SessionID,并通过Set-Cookie发送到浏览器端以覆盖原有的存在浏览器中的会话级的SessionID
  • 如果 Web 服务器做了负载均衡,如果请求到了另一台服务器的时候 session 会丢失

token

  • token 主要用于验证身份和权限
  • token 是跨端的,既可以在移动端,也可以用浏览器或命令行,还可以在多个场景下验证用户身份与权限
  • token可以有过期机制,如果每次更新 token,那么它其实已经接近于 session 的作用了
  • token也可以不需要过期机制,即token可以长期有效

关于cookie、seesion和token可进一步参看彻底理解cookie、seesion和token