有没有一种方法可以向伪装的客户端添加请求参数的验证。
例如:
@FeignClient
public interface ZipCodeClient {
@GetMapping("/zipcodes/{zipCode}")
Optional<ZipCodeView> findByZipCode(@PathVariable("zipCode") String zipCode);
}
在将HTTP调用发送到服务器之前,最好验证邮政编码是否为空并且具有一定的长度等。
答案 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