如何在伪装客户端上验证请求参数

时间:2019-09-05 18:47:52

标签: validation feign

有没有一种方法可以向伪装的客户端添加请求参数的验证。

例如:

@FeignClient
public interface ZipCodeClient {
    @GetMapping("/zipcodes/{zipCode}")
    Optional<ZipCodeView> findByZipCode(@PathVariable("zipCode") String zipCode);
}

在将HTTP调用发送到服务器之前,最好验证邮政编码是否为空并且具有一定的长度等。

2 个答案:

答案 0 :(得分:1)

如果您的验证很简单,仅适用于标头和查询字符串参数,则可以为此使用RequestInterceptor,因为它为您提供了在将RequestTemplate发送到邮件之前进行检查的机会。 Client

public class ValidatingRequestInterceptor implements RequestInterceptor {
   public void apply(RequestTemplate requestTemplate) {
      // use the methods on the request template to check the query and values.
      // throw an exception if the request is not valid.
   }
}

如果您需要验证请求正文,则可以使用自定义Encoder

public class ValidatingEncoder implements Encoder {
   public void encode(Object object, Type type, RequestTemplate template) {
      // validate the object
      // throw an exception if the request is not valid.
   }
}

最后,如果要验证单个参数,则可以为参数提供自定义Expander并在那里进行验证。您可以查看此答案,以获取有关如何创建可与Spring Cloud一起使用的自定义扩展器的完整说明。

How to custom @FeignClient Expander to convert param?

为完整起见,我提供了一个示例,说明如何使用香草Feign做到这一点。

public class ZipCodeExpander implements Expander {
   public String expand(Object value) {
      // validate the object
      // throw an exception if the request is not valid.
   }
}

public interface ZipCodeClient {
    @RequestLine("GET /zipcodes/{zipCode}")
    Optional<ZipCodeView> findByZipCode(@Param(expander = ZipCodeExpander.class) ("zipCode") String zipCode);
}

答案 1 :(得分:0)

正如this comment中指出的那样,使用Bean验证API的解决方案将是不错的选择。确实,我在Spring Boot项目中发现,仅在接口上放置@org.springframework.validation.annotation.Validated就足以启用Bean验证。

例如:

@FeignClient
@Validated
public interface ZipCodeClient {
    @GetMapping("/zipcodes/{zipCode}")
    Optional<ZipCodeView> findByZipCode(@PathVariable("zipCode") @NotEmpty String zipCode);
}

在违反情况下触发ConstraintViolationException

任何标准Bean验证功能都可以在这里使用。

UDPATE 注意,此解决方案似乎有一个potential issue,可能需要设置Hibernate Validator配置属性,例如:hibernate.validator.allow_parallel_method_parameter_constraint=true