Validating Request Data

1. Implementing Schema Validation

ToolUse
JSON Schema (Draft 2020-12)Standard schema validation
OpenAPI 3.1Inherits JSON Schema 2020-12
Bean Validation (Java)Annotation-based: @NotNull, @Size, @Email
Zod / Joi (Node)Programmatic schemas
Pydantic (Python)Type-hint validation

2. Validating Required Fields

Example: Bean Validation (Java)

public class CreateUserRequest {
    @NotBlank(message = "Name is required")
    private String name;

    @NotBlank @Email
    private String email;

    @NotNull @Min(18) @Max(120)
    private Integer age;
}

3. Validating Data Types

JSON TypeValidation
stringtype: string, minLength, maxLength, pattern
integer / numberminimum, maximum, multipleOf
booleantype: boolean (no "true" string)
arrayminItems, maxItems, uniqueItems, items
objectrequired, properties, additionalProperties

4. Validating String Formats

FormatPattern / Example
emailRFC 5322
uriRFC 3986
uuidRFC 4122
date2026-05-15
date-time2026-05-15T10:30:00Z
ipv4 / ipv6RFC 2673
hostnameRFC 1034

5. Validating Number Ranges

ConstraintJSON SchemaBean Validation
Min (inclusive)minimum: 0@Min(0)
Min (exclusive)exclusiveMinimum: 0@DecimalMin(value="0", inclusive=false)
Maxmaximum: 100@Max(100)
Multiple ofmultipleOf: 0.01@Digits(integer=10, fraction=2)

6. Validating String Length

ConstraintJSON SchemaBean Validation
Min lengthminLength: 1@Size(min=1)
Max lengthmaxLength: 255@Size(max=255)
Exact lengthminLength=maxLength=N@Size(min=N, max=N)
Regexpattern: "^[A-Z]{3}$"@Pattern(regexp="^[A-Z]{3}$")

7. Validating Array Items

Example: Array Validation (JSON Schema)

{
  "type": "array",
  "minItems": 1,
  "maxItems": 10,
  "uniqueItems": true,
  "items": {
    "type": "string",
    "format": "email"
  }
}

8. Implementing Custom Validation Rules

Example: Custom Cross-Field Validator (Java)

@Constraint(validatedBy = DateRangeValidator.class)
@Target(TYPE) @Retention(RUNTIME)
public @interface ValidDateRange {
    String message() default "End date must be after start date";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

public class DateRangeValidator implements ConstraintValidator<ValidDateRange, BookingRequest> {
    public boolean isValid(BookingRequest req, ConstraintValidatorContext ctx) {
        return req.getEndDate().isAfter(req.getStartDate());
    }
}

9. Returning Validation Errors

StatusUse Case
400 Bad RequestMalformed JSON, syntax error
422 Unprocessable EntityValid JSON, business rule violation

10. Providing Field-Level Error Messages

Example: Field-Level Error Response

{
  "type": "https://example.com/errors/validation",
  "title": "Validation Failed",
  "status": 422,
  "errors": [
    {"field": "email",    "code": "INVALID_FORMAT", "message": "Must be valid email"},
    {"field": "age",      "code": "OUT_OF_RANGE",   "message": "Must be 18-120"},
    {"field": "tags[2]",  "code": "TOO_LONG",       "message": "Max 20 characters"}
  ]
}