0

我正在尝试一种构建后端rest api的最佳方法。我有以下要求:

  1. 客户端发出发布请求以添加包含 ID 和元信息的资源
  2. 在我将此资源添加到数据库之前,我需要使用提供的 ID 向第三方 API 发出 GET 请求以获取相关数据。
  3. 然后将原始资源及其相关数据保存到数据库中

目前在方法Repository内部AddAsync,在将资源持久化到数据库之前,我调用第三方 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;
        }
4

1 回答 1

1

从我的角度来看,我认为在这种情况下进行 GET 调用不是问题。可能最好的方法应该是管理来自GetAccountDataAsync.

如果用户发送了所有正确的数据,但您的外部系统在创建帐户时出现问题,则您的用户不负责“重试”该过程。
这种改进可能代价高昂,但在用户体验方面应该会更好。

我认为 David 描述的方法(提高一层)是正确的,所以我更喜欢将与外部系统通信的责任分离到应用程序/逻辑层。

在保存过程部分完成的情况下,用户(帐户)应该处于一种等待状态

于 2021-08-17T16:39:31.697 回答