今天围观隔壁前后端对接调试接口,发现一个有趣的url接口定义,/users/getInfoByUserId,看url定义能够理解是根据用户id获取用户信息,然而小猫熊觉得还是有改进的地方。
标准restful的定义采用/users/{userid}的方式,但是一般对于外部用户,应该采取token而不是在url中填入userid,否则不满足安全设计,那么自然会考虑采用动宾结构的形如getxxxbyxxx的方式。
然而,根据restful的风格约定,并不建议在url中出现动词。其实我们知道,绝对的restful风格WebAPI接口是很难满足实际业务需求的,比如同样对于user资源,编辑基本信息和绑定手机号都是可以归纳到对user资源做patch操作,那么这时候一个put接口是否就能满足开发需求呢?是否应该针对各个接口涉及到字段域的修改,分别做if/else或者switch/case的分支处理呢?
往往会在url中增加动词作为折中处理,正如香农的信息论中所阐述的,信息量的增加是为了消除不确定性,如果有限的名词组合不能精确、无二义性的表述接口定义,那么就会想到通过增加动词去修饰接口。
其实,采用/users/me/info,然后配合token,可以以更简明的方式,表达同样的接口意义。
于是可以推导一下常规webapi的四种形式和定义模板。
第一,外部用户,采用资源/me/子资源的方式,请求头嵌入token,例如/users/me/info。
第二,内部用户在用户管理模块中,采用资源/{userid}/info,请求头嵌入token。
第三,开放平台访问资源,可以采用appid,appkey的方式生成token后访问资源。
第四,匿名登录。随意,但要后台处理同源接口限制。