项目中遇到了一个API的设计问题,我们是核心支付团队,其中有个API是用来验证这个支付订单的合法性的,输入为一个支付订单,包括支付方式,购买物品,商户号以及支付订单号等,输出为一个包含Violation的支付订单对象。可以理解是对支付订单做装饰。如果按照REST的动词来理解,PUT是传入一个完整的对象,如果这个对象不存在就创建,如果存在就把输入的对象替换为数据库里的对象,POST是创建一个新的对象。
从行为来判断,用PUT或者POST都可以,传入为对象,API path是/<resources>/validation
。但如果用POST那就不应该在path里出现/<resource>/validation/{id}
这种东西,因为这相当于知道这个对象已经存在,那么更新就应该是UPDATE了。
当然这是纯粹从理论的角度出发,如果已有的系统里已经有了这种设计,那么建议按照已有的风格继续,否则出现不一致会严重的影响整体代码的可读性并且增加维护难度。
最后对于POST /<resource>
和 POST /<resource>/validation
,input最好要用防腐层进行隔离,不要把这两个input为了图省事,都用一个对象,因为一旦一个地方做了修改,可能对另一个地方没有意义,而且这样也隔离了变化,是更好的设计。