我正在考虑构建后端rest api的最佳方法。我有以下要求:
- 客户端发出post请求,添加一个包含ID和元信息的资源
- 在我将此资源添加到数据库之前,我需要使用提供的ID向第三方API发出GET请求以获取相关数据。
- 然后将原始资源及其相关数据保存到数据库
目前在AddAsync
方法中的Repository
中,在我将资源持久化到数据库之前,我调用第三方API以基于ID获取有关资源的详细信息,然后在模型上执行SaveChangesAsync
,该模型的其余属性由GET请求填充。
然而,这感觉不对,因为我从我的客户端发出POST
请求,然后在后端服务器上发出GET
请求。有更好的解决方法吗?
IAccountRepository:
public async Task<SupervisorResult> AddAsync(Account newAccount, CancellationToken ct = default)
{
// GetAccountDataAsync fetches order data that I need to save whenever new Account is added
SupervisorResult result = await GetAccountDataAsync(newAccount, ct);
if(result.Succeeded == false)
{
_logger.Here().Debug("Failed to get new account data.");
return result;
}
Account freshAccount = (Account)result.Value;
_dbContext.Accounts.Add(freshAccount);
await _dbContext.SaveChangesAsync(ct);
result.Succeeded = true;
result.Value = freshAccount;
return result;
}
从我的角度来看,我不认为在这种情况下做GET调用是一个问题。也许最好的方法应该是管理来自GetAccountDataAsync
的可能的异常。
如果用户发送了所有正确的数据,但您的外部系统在创建帐户时出现了一些问题,您的用户不负责"重试";这个过程。
这种改进可能代价高昂,但在用户体验方面应该会更好。
我认为David描述的方法(提升一层)是正确的,所以我更倾向于将与外部系统通信的责任分离到应用程序/逻辑层。
在部分完成保存过程的情况下,用户(Account)应该处于某种等待状态。