---
# System prepended metadata

title: Automated Layouts Backend - API Research

---

# Automated Layouts Backend - API Research

# RMM - Richardson (REST) Maturity Model

![](https://i.imgur.com/fCLNpKT.png)
---
# Level 0: The Swamp of POX

* Single endpoint
* No HTTP verbs
* No reponse statuses
* Just transferring documents (xml, json, whatever) with request details

###### POX - Plain Old XML
---
# Level 1: Resources

* Introducing resources
* Dedicated endpoints for specific resources

---
# Level 2: HTTP Verbs

* Resource-specific endpoints
* Using different HTTP request types
* Responses with proper statuses

---
# Level 3: Hypermedia Controls (HATEOAS)

* Api is hypermedia-controller - user might figure out what to do next just from first response
* additional `link` object provided along with every resource shows what's possible to do
* `rel` property shows relation to current resource
* `href` property shows what endpoind is responsible for resource
```
"links": [
    {
        "href": "https://api.foo.com/v1/customer/users/ALT-JFWXHGUV7VI",
        "rel": "self",
        
    },
    {
        "href": "https://api.foo.com/v1/customer/users/ALT-JFWXHGUV7VI",
        "rel": "delete",
        "method": "DELETE"
    },
    {
        "href": "https://api.foo.com/v1/customer/users/ALT-JFWXHGUV7VI",
        "rel": "replace",
        "method": "PUT"
    },
    {
        "href": "https://api.foo.com/v1/customer/users/ALT-JFWXHGUV7VI",
        "rel": "edit",
        "method": "PATCH"
    }
]
```

###### HATEOAS - Hypermedia As The Engine Of Application State
---

# Conclusion

### Level 2 is enough :)

### Worth discussing:
* Namespaces - per module (ex. `/namespace/users/:id`)
* Versioning - global/namespace/controller level
* One guidelines to rule them all - it's nice to have one source of truth in case if something become `kwestio sporno`
* No more responses with status `200` and `success: false`

---

docs:
[PayPal Api standard](https://github.com/paypal/api-standards/blob/master/api-style-guide.md)
[OpenAPI](https://github.com/nestjs/swagger)
[Haufe API Style Guide](http://work.haufegroup.io/api-style-guide/)
[HAL spec](http://stateless.co/hal_specification.html)
[jsonapi docs](https://jsonapi.org/)
[Microsoft API best practices](https://docs.microsoft.com/en-us/azure/architecture/best-practices/api-design)
[API Richardson Maturity Level](https://martinfowler.com/articles/richardsonMaturityModel.html)