假定一种场景,外卖员给顾客送餐,送达时需要点确定收货,并且上传三张照片作为凭证。但是由于网络限制,导致上传图片会失败,这时候如何处理这个问题?
告诉服务器外卖已经送达,只需要一个单号和外卖员身份识别的sign,这个数据对于送达这个动作来说是必要但不充分的。因为没有凭证,不能充分说明送达。但是送达了,外卖员提交了这个订单号的动作是必要的。但是当客户不提出异议的时候,这个必要条件是可信的。所以我们应该最少提交这些数据。
本来,我们可以暂存这些要提交的数据,包括订单号和凭据,在网络条件允许的情况下再提交。但是本地App可能被误删,导致数据丢失,所以尽最大努力,我们应该至少提交这些必要数据,而在网络允许的情况下,再提交充分必要的数据。
所以充分和必要性分离的一种接口设计的步骤如下。
1.发起充分必要性请求/order/deliver?orderId=xxx&receipt=[images]&sign=xxx
2.请求失败,发起必要性请求/order/deliver/weak?orderId=xxx&sign=xxx
服务端可以先将这些数据单独存放在一张临时表里
3.本地暂存这些订单的完备数据。成功上传图片了的可以存URL,没有上传成功的,还是要存图片数据。
4.网络状况好转,在暂存区继续发起充分必要请求,失败则停止。这里应该经常提醒骑手,应该及时提交这些数据,要不然你的工作并不完全被接受。
5.成功,则服务端从临时表删除对应记录,客户端本地从暂存区删除记录。
6.超时机制。用户没有在规定时限内提出异议,则临时表数据移动到正式表。
7.骑手超时后发起充分必要请求,则完善正式表内该记录。
从以上的流程看,可以通过放弃接口的充分必要性,只使用一个接口和一张表存储充分必要数据或者必要数据。但是就失去了接口的校验能力,从业务上讲并不合适,客户端应该努力交付充分必要的数据,而接受必要的数据则是超时后,必要数据变得充分的结果。