使用tinyvalidator實現伺服器端驗證 -Yuri Mednikov

banq發表於2020-07-10

向您演示一個小的tinyvalidator庫,tinyvalidator庫是執行驗證流程的小型簡單解決方案,該庫可以在處理程式級別用於驗證輸入。

定義資料模型
驗證從所需資料及其引數的定義開始。tinyvalidator使用基於註釋的方法。

public class AuthRequest {

    @Email
    private String email;

    @Size(min = 8)
    private String password;

    // getters, setters
}


在此程式碼段中,我們使用了兩個註釋:@Email和@Size。第一個檢查欄位是否包含有效的電子郵件地址(儘管這適用於format。您需要實施電子郵件確認流程來檢查此電子郵件確實存在)。第二個斷言password字串的長度不小於8。
您的API中可能還需要使用許多其他有用的內建驗證器註釋:
  • @NotNull –檢查欄位是否為空
  • @HttpUrl –檢查欄位是否包含有效的網址
  • @Pattern –接受與定義的常規表示式匹配的欄位


構建驗證流程的第二部分實際上是呼叫驗證器元件,該元件根據定義的規則對bean進行斷言:

public void login(Context context) {
    Validator validator = new Validator();
    AuthRequest request = context.bodyAsClass(AuthRequest.class);
    List<ConstraintViolation> violations = validator.validate(request);
    if (!violations.isEmpty()) {
        String message = violations.stream()
            .map(v -> v.getName().concat(": ").concat(v.getMessage()))
            .collect(Collectors.joining(", "));
        throw new BadRequestResponse(message);
    }
    AuthResponse result = service.login(request);
    context.json(result);
}

public void signup (Context context){
    AuthRequest request = context.bodyAsClass(AuthRequest.class);
    Validator validator = new Validator();
    List<ConstraintViolation> violations = validator.validate(request);
    if (!violations.isEmpty()) {
        String message = violations.stream()
            .map(v -> v.getName().concat(": ").concat(v.getMessage()))
            .collect(Collectors.joining(", "));
        throw new BadRequestResponse(message);
    }
    AuthResponse result = service.signup(request);
    context.json(result);
}


首先,我們在該方法中需要建立一個新validator例項:

Validator validator = new Validator();


然後,我們需要將bean傳遞給驗證器。在我們的例子中,bean代表一個登入/註冊請求(AuthRequest實體):

List<ConstraintViolation> violations = validator.validate(request);


這種方法基本上返回一個包含驗證不透過的Collection。如果bean有效,則此Collection為空。否則,我們將獲得沒有透過驗證的欄位。在這種情況下,我們需要中斷帶有BadRequest響應的處理程式流,然後是有關錯誤訊息。

您可以在github儲存庫中找到此文章的完整原始碼。
 

相關文章