无效输入请求的 REST 服务异常
Exception for REST services for invalid input requests
我目前正在开发 REST
服务并为以下所有内容投掷 BadRequestException
,
1. Path parameter is invalid
2. Query parameter is invalid
4. Input request object has missing attributes
每种情况是否有任何特定的例外情况,例如 InvalidParameterException 等等……?是否有任何文档可用于了解在什么情况下应抛出哪些异常?
我相信通常您会根据您希望如何处理这些错误来创建单独的案例。例如,您将有 3 个不同的异常来表示您的错误。
然后大多数框架允许您安装 ExceptionMappers。这些将您的异常映射到 HTTP 响应代码。这些已记录在案,您应该遵循它们:
例如:http://www.restapitutorial.com/httpstatuscodes.html
例如,在您的情况下,我会为所有这 3 种情况抛出 IllegalArgumentExceptions 并安装一个映射器,将其映射到 400 响应代码,其中可能包含一些信息。
例如,这可能很重要,因为使用您的服务的客户端无论如何都不会收到您的异常,而是分析请求的响应代码。使用 400,用户将知道请求无效并且不会重试。你可以有各种类似的案例。
阅读异常映射器,例如在球衣的帮助下:
https://jersey.java.net/documentation/latest/representations.html
所以对于你的问题:
不,我认为没有关于从您的应用程序中抛出哪些异常的最佳实践。通常 REST 框架没有特定的异常映射器,除了会 return 500(内部服务器错误)
的全能映射器
然而,对于特定用例应 return 编辑 REST 和 HTTP 的文档。您应该尝试设计您的 REST 端点以符合这些标准,以实现最大的可重用性和可理解性。
希望对你有所帮助,
阿图尔
所有 3 个错误听起来都像是客户端错误,因为客户端未能遵守合同 - 所以我会 return HTTP 400 Bad Request - 也许有一个回复正文中的解释。
我认为这是个人决定,答案将取决于您是否需要更详细的例外情况。
有两种方法可以使用 JAX-RS 处理错误:
投掷 WebApplicationException
这就是您正在使用的方法,它允许您将扩展 WebApplicationException
的异常映射到 HTTP 错误响应。
我认为抛出 BadRequestException
对于您问题中提到的所有情况都很好。只需记住添加一条详细消息来解释问题所在。
如果您需要更具体的例外,您可以考虑扩展 BadRequestException
或者 ClientErrorException
。新的异常可以封装解释请求问题的消息。就看你的需求了。
有关 JAX-RS API 提供的异常的更多详细信息,请查看 javax.ws.rs
package documentation。如果它们不符合您的需求,只需扩展它们并创建您的特定例外。
使用 ExceptionMapper
在其他情况下,抛出扩展 WebApplicationException
的 WebApplicationException
或 类 的实例可能不合适,而将现有异常映射到回复。对于这种情况,可以使用自定义异常映射提供程序。
例如,考虑一下,您决定将 IllegalArgumentException
whenever you received an inapropriate value for your query or path parameters. You can create an ExceptionMapper
to map the IllegalArgumentException
抛给具有 400
状态代码的响应:
@Provider
public class IllegalArgumentExceptionMapper
implements ExceptionMapper<IllegalArgumentException> {
@Override
public Response toResponse(IllegalArgumentException exception) {
return Response.status(400).entity(exception.getMessage())
.type("text/plain").build();
}
}
有关更多详细信息,请查看球衣 documentation。
我目前正在开发 REST
服务并为以下所有内容投掷 BadRequestException
,
1. Path parameter is invalid
2. Query parameter is invalid
4. Input request object has missing attributes
每种情况是否有任何特定的例外情况,例如 InvalidParameterException 等等……?是否有任何文档可用于了解在什么情况下应抛出哪些异常?
我相信通常您会根据您希望如何处理这些错误来创建单独的案例。例如,您将有 3 个不同的异常来表示您的错误。
然后大多数框架允许您安装 ExceptionMappers。这些将您的异常映射到 HTTP 响应代码。这些已记录在案,您应该遵循它们:
例如:http://www.restapitutorial.com/httpstatuscodes.html
例如,在您的情况下,我会为所有这 3 种情况抛出 IllegalArgumentExceptions 并安装一个映射器,将其映射到 400 响应代码,其中可能包含一些信息。 例如,这可能很重要,因为使用您的服务的客户端无论如何都不会收到您的异常,而是分析请求的响应代码。使用 400,用户将知道请求无效并且不会重试。你可以有各种类似的案例。
阅读异常映射器,例如在球衣的帮助下:
https://jersey.java.net/documentation/latest/representations.html
所以对于你的问题: 不,我认为没有关于从您的应用程序中抛出哪些异常的最佳实践。通常 REST 框架没有特定的异常映射器,除了会 return 500(内部服务器错误)
的全能映射器然而,对于特定用例应 return 编辑 REST 和 HTTP 的文档。您应该尝试设计您的 REST 端点以符合这些标准,以实现最大的可重用性和可理解性。
希望对你有所帮助,
阿图尔
所有 3 个错误听起来都像是客户端错误,因为客户端未能遵守合同 - 所以我会 return HTTP 400 Bad Request - 也许有一个回复正文中的解释。
我认为这是个人决定,答案将取决于您是否需要更详细的例外情况。
有两种方法可以使用 JAX-RS 处理错误:
投掷 WebApplicationException
这就是您正在使用的方法,它允许您将扩展 WebApplicationException
的异常映射到 HTTP 错误响应。
我认为抛出 BadRequestException
对于您问题中提到的所有情况都很好。只需记住添加一条详细消息来解释问题所在。
如果您需要更具体的例外,您可以考虑扩展 BadRequestException
或者 ClientErrorException
。新的异常可以封装解释请求问题的消息。就看你的需求了。
有关 JAX-RS API 提供的异常的更多详细信息,请查看 javax.ws.rs
package documentation。如果它们不符合您的需求,只需扩展它们并创建您的特定例外。
使用 ExceptionMapper
在其他情况下,抛出扩展 WebApplicationException
的 WebApplicationException
或 类 的实例可能不合适,而将现有异常映射到回复。对于这种情况,可以使用自定义异常映射提供程序。
例如,考虑一下,您决定将 IllegalArgumentException
whenever you received an inapropriate value for your query or path parameters. You can create an ExceptionMapper
to map the IllegalArgumentException
抛给具有 400
状态代码的响应:
@Provider
public class IllegalArgumentExceptionMapper
implements ExceptionMapper<IllegalArgumentException> {
@Override
public Response toResponse(IllegalArgumentException exception) {
return Response.status(400).entity(exception.getMessage())
.type("text/plain").build();
}
}
有关更多详细信息,请查看球衣 documentation。