【问题标题】:Is it a bad idea for a WebAPI to return different types depending on some condition?Web API 根据某些条件返回不同类型是不是一个坏主意?
【发布时间】:2021-10-17 14:52:11
【问题描述】:

我有这段代码根据条件返回不同的类型:

[HttpGet("{questionId:int}/specific")]
public async Task<IActionResult> GetSpecificByQuestionIdAsync(int questionId)
{
    IActionResult result = Ok();

    try
    {
        var question = await _questionService.GetQuestionByIdAsync(questionId);
        if (question != null)
        {
            if (question.TypeName == "TypeA")
            {
                var typeA = await _questionService.GetTypeAQuestionAsync(questionId);
                result = Ok(typeA);
            }
            else if (question.TypeName == "TypeB")
            {
                var typeB = await _questionService.GetTypeBQuestionAsync(questionId);
                result = Ok(typeB);
            }
        }
    }
    catch (Exception ex)
    {
        result = StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
    }

    return result;
}

我想问这是不是一个坏主意,或者这会导致一些问题。我尝试搜索但无法获得有关返回不同类型的 REST API 的任何信息。还是只进行 2 个单独的调用会更好?

【问题讨论】:

    标签: asp.net asp.net-web-api


    【解决方案1】:

    我不希望从同一个 URL 返回不同的类型。这将使使用您的 API 变得更加困难,因为您可以为相同的响应代码 (200) 返回不同类型的响应正文。但是如果 TypeA 和 TypeB 从同一个基本类型中继承,并且您认为您的消费者处理与 TypeA 和 TypeB 的差异不会有问题,也许这应该不是问题。

    我使用过一些支付 API,它们的属性根据用户使用的支付方式而具有不同的类型。在这种情况下,很容易处理,因为根对象总是相同的,只有一个属性可能完全不同,而且我可以根据根对象的 paymentType 属性知道我需要进行的类型转换。

    如果您查看一些 API 指南,您可能不会看到有人说这是一种不好的做法。但是你总是会看到在同一个 url 上的模式总是返回相同类型的响应。 有时这种不同的结果是可以接受的,有时则不是。要回答您的问题,您应该思考:
    这个 API 的使用者处理这些不同的对象有多难?

    一些好的 api 良好实践参考是:

    我在您的代码中看到的一个问题是您在 500 错误结果中写入异常消息。这是一个很大的风险,因为有时异常消息可能会显示您的应用程序的潜在安全风险。

    【讨论】:

      猜你喜欢
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 2011-02-03
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 2013-01-06
      相关资源
      最近更新 更多