This is a hobby project(6) to learn Java-Spring Boot and RESTful-API's conforming to the standards of HATEOS by creating Payroll+Orders app
.
I built REST API's using Spring MVC + Spring HATEOAS app with HAL representations of each resource. This project is based on Building REST services with Spring course
Java + Spring Boot
Create a nonREST API's — Simple Spring MVC app with no hypermedia
Make the API's RESTful — Spring MVC + Spring HATEOAS app with HAL representations of each resource
Introduce backward compactability — REST app where a field is evolved but old data is retained for backward compatibility
Add conditional link in responses. — REST app where conditional links are used to signal valid state changes to clients
$ git clone https://github.com/rasi5050/Spring-RESTfulApisWith-HATEOS-HAL
$ cd Spring-RESTfulApisWith-HATEOS-HAL
$ ./mvnw clean spring-boot:run
{
"timestamp": "2023-07-04T17:58:07.991+00:00",
"status": 404,
"error": "Not Found",
"path": "/employees/76"
}
{
"_embedded": {
"employeeList": [
{
"id": 1,
"firstName": "Bilbo",
"lastName": "Baggins",
"role": "burglar",
"name": "Bilbo Baggins",
"_links": {
"self": {
"href": "http://localhost:8080/employees/1"
},
"employees": {
"href": "http://localhost:8080/employees"
}
}
},
{
"id": 2,
"firstName": "Frodo",
"lastName": "Baggins",
"role": "thief",
"name": "Frodo Baggins",
"_links": {
"self": {
"href": "http://localhost:8080/employees/2"
},
"employees": {
"href": "http://localhost:8080/employees"
}
}
}
]
},
"_links": {
"self": {
"href": "http://localhost:8080/employees"
}
}
}
{
"id": 1,
"firstName": "Bilbo",
"lastName": "Baggins",
"role": "burglar",
"name": "Bilbo Baggins",
"_links": {
"self": {
"href": "http://localhost:8080/employees/1"
},
"employees": {
"href": "http://localhost:8080/employees"
}
}
}
{
"name": "Alfred Hitchcock",
"role": "filmmaker"
}
{
"id": 3,
"firstName": "Alfred",
"lastName": "Hitchcock",
"role": "filmmaker",
"name": "Alfred Hitchcock",
"_links": {
"self": {
"href": "http://localhost:8080/employees/3"
},
"employees": {
"href": "http://localhost:8080/employees"
}
}
}
{
"name": "Samwise Gamgee",
"role": "ring bearer"
}
{
"id": 3,
"firstName": "Samwise",
"lastName": "Gamgee",
"role": "ring bearer",
"name": "Samwise Gamgee",
"_links": {
"self": {
"href": "http://localhost:8080/employees/3"
},
"employees": {
"href": "http://localhost:8080/employees"
}
}
}
204 No Content
{
"_embedded": {
"orderList": [
{
"id": 1,
"description": "MacBook Pro",
"status": "COMPLETED",
"_links": {
"self": {
"href": "http://localhost:8080/orders/1"
},
"orders": {
"href": "http://localhost:8080/orders"
}
}
},
{
"id": 2,
"description": "iPhone",
"status": "IN_PROGRESS",
"_links": {
"self": {
"href": "http://localhost:8080/orders/2"
},
"orders": {
"href": "http://localhost:8080/orders"
},
"cancel": {
"href": "http://localhost:8080/orders/2/cancel"
},
"complete": {
"href": "http://localhost:8080/orders/2/complete"
}
}
}
]
},
"_links": {
"self": {
"href": "http://localhost:8080/orders"
}
}
}
{
"id": 2,
"description": "iPhone",
"status": "CANCELLED",
"_links": {
"self": {
"href": "http://localhost:8080/orders/2"
},
"orders": {
"href": "http://localhost:8080/orders"
}
}
}
{
"title": "Method not allowed",
"detail": "You can't cancel an order that is in CANCELLED status"
}
{
"id": 2,
"description": "iPhone",
"status": "COMPLETED",
"_links": {
"self": {
"href": "http://localhost:8080/orders/2"
},
"orders": {
"href": "http://localhost:8080/orders"
}
}
}
{
"title": "Method not allowed",
"detail": "You cant complete an order that is in CANCELLED status"
}
![Screenshot 2023-07-04 at 14 40 57](https://private-user-images.githubusercontent.com/12760472/250972964-7a419af3-03c8-42d5-9bb2-028fa682c143.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjMzNDY2NDMsIm5iZiI6MTcyMzM0NjM0MywicGF0aCI6Ii8xMjc2MDQ3Mi8yNTA5NzI5NjQtN2E0MTlhZjMtMDNjOC00MmQ1LTliYjItMDI4ZmE2ODJjMTQzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODExVDAzMTkwM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTY1YzY3NmFjYTcxMmY0Nzg3Y2NlYjBiNjQ2ZWQ2YzdmOWZjNTIzMzc2MWRiMmI4ZTdhYTIzZDZiYTZmZDljNTkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.X2N3xZB8zaTfIrPFf1ywrOauUSG5lpjpSAFjcRB1E4w)
![Screenshot 2023-07-04 at 14 43 40](https://private-user-images.githubusercontent.com/12760472/250973260-02b9f87f-d19a-40ab-b6b7-7a534d602c74.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjMzNDY2NDMsIm5iZiI6MTcyMzM0NjM0MywicGF0aCI6Ii8xMjc2MDQ3Mi8yNTA5NzMyNjAtMDJiOWY4N2YtZDE5YS00MGFiLWI2YjctN2E1MzRkNjAyYzc0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MTElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODExVDAzMTkwM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTU5OGRkMWUxZmRmOTM4ZDg2Zjc1OTJmMjgxNmQzMzA4ZTBhOGRlMTBkY2RhZWE5MzQ2Y2UwYjk1NjljYzI0MjcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.BChFAiekLwe4z8Io1jbotJghF5688dR0cGLlVLrl74c)