**1**.Request和Response
RESTful API的开发和使用,无非是客户端向服务器发请求(request),以及服务器对客户端作出回应(response)。客户端会给予GET方法向服务器发送请求获取资源,基于PUT或PATCH方法向服务器发送更新数据的请求,服务API设置时也应该要按照相应规范来处理对应的请求,这点现在应该成为所有RESTful API的开发者的共识。这里我们来简单说一下常见的响应码:
当GET、PUT和PATCH请求成功时,要返回对应的数据,及状态码200,即SUCCESS;
当POST创建数据成功时,要返回创建成功的数据,及状态码201,即CREATED;
当DELETE删除数据成功时,不返回数据,状态码要返回204.即NO CONTENT;
当GET不到数据时,状态码要返回404,即NOT FOUND;
任何时候,如果请求有问题,如检验请求数据时发现错误,要返回状态码400,即BAD REQUEST
当API请求需要用户认证时,如果request中的认证信息不正确,要返回状态码401,即NOT AUTHORIZED;
当API请求需要验证用户权限时,如果当前用户无相应权限,要返回状态码403,即FORBIDDEN
最后,关于Request和Response,不要忽略了HTTP header中的Content-Type。以json为例,如果API要求客户端发送json数据,则服务端仅做好json数据的获取和解析即可,但如果服务端支持多种类型数据的传入,如果同时支持json和form-data,则需要根据客户端发送请求时header中的Content-Type,对于不同类型是数据分别实现获取和解析;如果API响应客户端请求后返回的json数据,需要在header中添加Content-Type=application/json。
**2**.序列化和反序列化
**Serialization**和**Deserialization**即序列化和反序列化,RESTful API以规范统一的格式作为数据的载体,常用的格式有json或xml。以json格式为例,当客户端向服务器发请求时,或者服务器响应客户端的请求,向客户端返回数据时,都是传输json格式的文本,但是在服务器内部,数据处理时基本不采用json格式的字符串,而是native类型的数据,即本地化数据(类的实例object,即对象)。json只是在服务端与客户端通信时在网络上传输数据的格式,服务端和客户端内部均存在将json转化为native类型和将native类型数据转化为json格式,其中,将native数据转化为json即为序列化,将json转化为native数据即为反序列化。
虽然有的语言中的数据类型能轻易的实现序列化和反序列化,但对于复杂的API,内部实现时总是以object作为数据的载体。因此,数列化与反序列话方法的实现,是开发RESTful API最重要的一步准备工作。
**3**.Validation
Validation即数据校验,是开发健壮RESTful API中另一个重要的一环。仍然用json举例,当客户端向服务端发送GET、POST和PATCH请求时,通常会同时给服务器发送json格式的相关数据,服务器在做数据处理之前,先做数据校验,是最合理且最安全的前后端交互方式,当前端发送的数据不正确或不合理时,服务端经过校验后直接向客户端返回400错误及相应的数据错误。
**·**数据类型校验,如字段数据类型为int,那么给字符串的值则报错
**·**数据格式校验,如果字符串类型为邮箱或密码,则赋值必须满足相应的正则表达式,才是正确的输入数据
**·**数据逻辑校验,如数据包含出生日期和年龄两个字段,需要核对两个数据之间的严谨性,不一致则返回错误信息
**4**.Authentication和Permission
Authentication指的是用户认证,Permission指的是权限机制,这两点使得RESTful API强大、灵活和安全的保证。
常用的认证机制是BASIC Auth和OAuth,除非API极为简单,且没有潜在的安全性问题,否则认证机制是都要实现的并应用到API中去。BASIC Auth非常简单,很多框架都集成了BASIC Auth的实现,自己都能写一个。如今OAuth已经成了企业级服务的标配,其相关的开源实现方案非常丰富。
权限机制是对API请求更进一步的限制,只有通过认证的用户符合权限要求,才能访问API。权限机制的实现依赖于系统的业务逻辑和应用场景,一般来说,常用的权限机制包括全局型的和对象型的,全局型的权限机制主要指,为用户赋予权限或者为用户赋予角色或划分到用户组,然后为角色或角色组赋予权限的方式来实现权限控制。对象性的权限机制主要指,权限控制的颗粒度在object上,用户对某个具体对象的访问、修改、删除或其他行为,要单独在该对象上为用户赋予相关权限来实现权限控制。
总的来说,全局性的权限控制容易理解,实现也简单,有很多开源库可做备选方案;对象性的权限控制相对复杂一点,但也有很多典型的应用场景,如多人博客系统中,作者对自己文章的编辑权限即为对象性的权限控制,其对应的开源库也有很多。
有疑问加站长微信联系(非本文作者))