Skip to content

JsonApi

Follows the JSON:API specification. Same path-based routing as REST, but uses the JSON:API envelope format with data, relationships, and included sections.

  • Spec: jsonapi.org
  • MIME: application/vnd.api+json
  • Serializer: JsonApiSerializer
  • Routing: Path-based (/models, /models/:id)
import crate.protocols.jsonApi.policy;
auto crateRouter = router.crateSetup!JsonApi;
crateRouter.add(userCrate);

The six standard CRUD endpoints, plus relationship management:

MethodPathOperationStatus
GET/usersList all200
GET/users/:idGet one200
POST/usersCreate201
PUT/users/:idReplace200
PATCH/users/:idUpdate fields200
DELETE/users/:idDelete204
GET/users/:id/relationships/:relGet relationship200
PATCH/users/:id/relationships/:relUpdate relationship200
POST/users/:id/relationships/:relAdd to relationship200
DELETE/users/:id/relationships/:relRemove from relationship200

Creates return 201 with a Location header pointing to the new resource.

Clients must send Accept: application/vnd.api+json.

{
"data": {
"type": "users",
"id": "abc123",
"attributes": {
"name": "Alice",
"email": "alice@example.com"
},
"relationships": {
"team": {
"data": { "type": "teams", "id": "xyz789" }
}
}
}
}
  • Sparse fieldsets (?fields[type]=field1,field2)
  • Compound documents / inclusion (?include=relationship)
  • Pagination (?page[number]=X&page[size]=Y) with first, last, prev, next links
  • Sorting (?sort=field,-otherField) — prefix with - for descending
  • Relationship endpoints (GET/PATCH/POST/DELETE)
  • Proper resource identifier format (type, id, attributes, relationships)
  • ETag / If-None-Match conditional requests (304 Not Modified)
  • Query parameter validation — unknown parameters are rejected
  • Filtering: No ?filter parameter (use middleware)
  • Bulk operations: No batch operations
  • JSON:API extensions: No extension mechanism
auto crateRouter = router.crateSetup!(JsonApiPolicy!(PolicyConfig("/api/v1")));