【问题标题】:How to validate RestTemplate response?如何验证 RestTemplate 响应?
【发布时间】:2018-02-06 00:40:39
【问题描述】:

Spring 在控制器级别支持基于注解的验证。

(1) 是否有必要在 RestTemplate 级别对来自 REST 调用的响应进行此类验证?

如果答案是肯定的: (2) RestTemplate 是否会支持这一点,以在未来某个时候验证来自休息调用的响应?

如果答案是否定的: (3) 为什么?

【问题讨论】:

  • 澄清:我的问题不是关于验证请求。我的问题是关于“验证来自其他服务的响应”。

标签: rest validation spring-boot bean-validation resttemplate


【解决方案1】:

现在是 2020 年,我仍然没有看到要求的功能。

@Valid 很适合自动验证,例如已发布的 RequestBody。

但是为了验证通过RestTemplate 获取的ResponseEntity 的主体,我看不到任何花哨的等价物。

所以我知道的唯一选择是自己做taken from hereInput 是您的 RequestEntitys 主体的类。 input 是身体本身。

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<Input>> violations = validator.validate(input);
if (!violations.isEmpty()) {
  throw new ConstraintViolationException(violations);
}

所以回答你的问题:

  1. 是的,我会验证回复!
  2. 未来(2020)没有带来你我想念的功能
  3. 对于这个缺失的原因,我也没有答案。

【讨论】:

    【解决方案2】:

    对我来说,问题很大。 :)。据我了解,您想询问Spring可以支持的REST服务中的验证。

    1.是否有必要在 RestTemplate 级别对来自 REST 调用的响应进行此类验证?

    实际上,这取决于您的应用或您的业务。您可以在 Controller 中进行,也可以在 Service Level 中进行,甚至可以进行自定义验证。对我来说,没有人强迫你做任何事情。

    但是,根据我的经验,我们确实应该进行验证。所以我的答案是YES。

    2. RestTemplate 是否会支持这一点,以在未来某个时候验证来自休息调用的响应?

    我假设您想要验证的详细信息?!正确的? Spring 支持许多事情来进行验证。简单的方法可以使用PathVariableRequestParameter。例如:

    @GetMapping("/test/{name}")
        private String test(@PathVariable(value = "name", required = true) String name){
            //...
        }
    

    Spring 将验证所有请求,并在所需参数丢失或类型错误时以 400 Bad Request 响应...

    Spring 还支持 JSR 303 Bean 验证:http://beanvalidation.org/1.0/spec/ 例如这里:

    public class MessageBean {
        @NotNull
        private String title;
        @NotNull
        private String message;
     
        // getters/setters/etc
    }
    

    或者您想要执行自定义用户响应,例如:

    @ExceptionHandler
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ErrorResponse handleException(MethodArgumentNotValidException exception) {
        //....
        return ErrorResponse.builder().message(errorMsg).build();
    }
    

    更多细节在这里:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-validation

    因此,这取决于需要我们在任何级别进行验证的业务。

    3.如果答案是否定的:(3) 为什么?

    这个不用回答了。 :)

    希望有帮助

    【讨论】:

    • 感谢您的回答,但这不是我想要的。可能我的问题还不够清楚。我可以根据技术业务需求在任何层验证“请求”。我的问题是关于验证请求的NOT。我的问题是关于“验证来自其他服务的响应”。
    • 我想你没听懂题主的意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 2018-10-28
    • 2018-02-23
    • 2018-03-11
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多