处理无效RESTAPI参数的内部Java代码最佳实践

处理无效RESTAPI参数的内部Java代码最佳实践,java,api,rest,null,exception,Java,Api,Rest,Null,Exception,我的同事写了以下问题: 这个问题似乎被误解了,我想找出答案,所以我开始这个新问题。。。希望更清楚一点 基本上,我们有一个RESTAPI。我们API的用户使用参数调用我们的方法。但有时用户使用错误的参数调用它们!!也许他们的代码有误,也许他们只是想和我们玩,也许他们想看看我们的反应,谁知道呢!我们使用HTTP状态错误代码进行响应,可能还包括XML响应中无效参数的详细描述 一切都很好。但在内部,我们通过抛出异常来处理这些无效参数。例如,如果某人通过向我们提供其配置文件id来查找Person对象,但

我的同事写了以下问题:

这个问题似乎被误解了,我想找出答案,所以我开始这个新问题。。。希望更清楚一点

基本上,我们有一个RESTAPI。我们API的用户使用参数调用我们的方法。但有时用户使用错误的参数调用它们!!也许他们的代码有误,也许他们只是想和我们玩,也许他们想看看我们的反应,谁知道呢!我们使用HTTP状态错误代码进行响应,可能还包括XML响应中无效参数的详细描述

一切都很好。但在内部,我们通过抛出异常来处理这些无效参数。例如,如果某人通过向我们提供其配置文件id来查找Person对象,但该配置文件id不存在。。。我们在查找时会抛出PersonInvalidException。然后,我们在API控制器中捕获此异常并发回HTTP 400状态错误代码

我们的问题是。。。对于这种用户错误,在内部抛出异常,这是最佳实践吗?这些异常永远不会传播回用户,这是一个RESTAPI。他们只会让我们的代码更干净。否则,我们可以在每个API控制器中使用验证方法,以确保所有参数都是合理的,但这似乎效率低下。我们可能要在数据库中查找两次。或者我们可以返回空值并检查它们,但那太糟糕了

您的想法是什么?

我认为当检测到请求参数错误时,在内部抛出(然后捕获)异常是完全正确的。我尝试过其他方法,但根据我的经验,这种方法效果最好

我的最新尝试是执行以下操作:

  • 定义一个名为
    RequestFailureException
    的(未选中的)异常,该异常将HTTP状态代码作为其属性之一
  • 为一些常见情况定义
    RequestFailureException
    的子类型
  • 在我的控制器基类中定义方法,以获取各种类型的可选和强制性请求参数。这些方法抛出上面的相关异常
  • 在控制器基类中定义一个静态
    handleException
    方法,该方法记录异常并将它们映射到HTTP状态代码
  • 在基类中,定义
    doRequest
    或任何捕获异常并使用
    handleException
    处理它们的内容
我认为,当检测到请求参数错误时,在内部抛出(然后捕获)异常是完全正确的。我尝试过其他方法,但根据我的经验,这种方法效果最好

我的最新尝试是执行以下操作:

  • 定义一个名为
    RequestFailureException
    的(未选中的)异常,该异常将HTTP状态代码作为其属性之一
  • 为一些常见情况定义
    RequestFailureException
    的子类型
  • 在我的控制器基类中定义方法,以获取各种类型的可选和强制性请求参数。这些方法抛出上面的相关异常
  • 在控制器基类中定义一个静态
    handleException
    方法,该方法记录异常并将它们映射到HTTP状态代码
  • 在基类中,定义
    doRequest
    或任何捕获异常并使用
    handleException
    处理它们的内容

    • 在我看来,这是对例外的合理使用;您不能期望代码从用户错误中恢复。关键是,您返回给用户的内容应该足够详细,以使他们能够理解(并纠正)错误的原因。仅仅返回HTTP 400或任何其他HTTP错误代码不足以让您的用户确定他们做错了什么;您不能期望代码从用户错误中恢复。关键是,您返回给用户的内容应该足够详细,以使他们能够理解(并纠正)错误的原因。仅仅返回HTTP 400或任何其他HTTP错误代码不足以让您的用户确定他们做错了什么。

      我在ColdFusion中实现了一个REST API,我使用的异常与您描述的完全相同。异常是摆脱当前执行状态并向用户传递一致错误消息的好方法


      在您给出的示例中,我希望返回404的状态代码。毕竟,人是一种资源,如果这个人不存在,那么对我来说就是404。

      我在ColdFusion中实现了一个REST API,我使用的异常与您描述的完全相同。异常是摆脱当前执行状态并向用户传递一致错误消息的好方法


      在您给出的示例中,我希望返回404的状态代码。毕竟,人是一种资源,如果这个人不存在,那对我来说就是404。

      我想你是对的。异常,当不向用户公开时,仍然困扰着我。。。但它们是针对API用户错误的…我想你是对的。异常,当不向用户公开时,仍然困扰着我。。。但它们是针对API用户错误的……404错误代码的一个优点是,400背后的想法是,只有在创建人员时才创建概要文件id。您不会搜索配置文件ID。。。所以,如果你查找一个不存在的配置文件id,那就没有意义了。您的代码中有一个bug,或者不正确地使用了我们的API。404错误代码的优点是,400背后的想法是,只有在创建人员时才会创建配置文件id。您不会搜索配置文件ID。。。所以,如果你查找一个不存在的配置文件id,那就没有意义了。你