This project is an attempt to gather the foundations of three common API Styles –REST, gRPC and GraphQL. It also works as a guide on how each one of these styles tackles some everyday usage cases.
| Usage | REST | GraphQL | gRPC | 
|---|---|---|---|
| Contract | HATEOAS or OpenAPI | GraphQL Schema Language: operations | Protocol Buffers: rpc | 
| Schema definition | Resource oriented. HTTP response headers, Media Type and JSON Schema  | 
Graph oriented. GraphQL Schema Language  | 
Resource and Action oriented. Protocol Buffers: messages  | 
| Standard methods | GET, POST, PUT, PATCH, DELETE | 
query and mutation | 
Through rpc operations | 
| Get | GET | 
query | 
Get rpc operation | 
| Get (representation) | ✔️ Content Negotiation | ✘ Only JSON | ✘ only one. Default: Protocol Buffers | 
| Get (custom) | Sparse fieldsets. Embedded resources | Native support | FieldMask | 
| List | GET. Custom pagination, sorting and filtering | 
query. Standard pagination and sorting | 
List and Search rpc operations | 
| Create | POST or PUT | 
mutation | 
Create rpc operation | 
| Update | PUT | 
mutation | 
Update rpc operation (unrecommended) | 
| Partial update | PATCH | 
✘ Workarounds | Update rpc operation with FieldMask | 
| Delete | DELETE | 
mutation | 
Delete rpc operation | 
| Custom methods | HATEOAS or POST | 
pure functions: query, other: mutation | 
Custom rpc operation | 
| Long-requests | Resource operation | 
Interface Operation | 
|
| Error handling | Native in HTTP. Extensible | errors property. Extensible | 
Standard errors. Google Error Model | 
| Security | HTTP: Bearer, OAuth, CORS, API Keys | HTTP: Bearer, OAuth, CORS, API Keys | TLS, ALTS, token-based (Google), custom | 
| Subscriptions | Unsupported. WebHook and HTTP streaming | subscription | 
HTTP/2 streaming | 
| Caching | HTTP, application and local cache | GET, application and local cache | 
Application and local cache | 
| Discoverability | HATEOAS and OPTIONS or OpenAPI | 
Native introspection | ✘ autogenerated client code | 
This project was born as a Master's Dissertation. You can check: