REST API

Το Representational State Transfer(REST) είναι ένα στυλ αρχιτεκτονικής λογισμικού, το οποίο ορίζει ένα σύνολο από περιορισμούς, για την δημιουργία web services. Παρουσιάστηκε και ορίστηκε από το Roy Fielding το 2000. Τα web services, τα οποίο συμμορφώνονται με αυτόυς τους περιορισμούς, ονομάζονται RESTful web services και παρέχουν διαλειτουργικότητα μεταξύ υπολογιστικών συστημάτων στο διαδίκτυο.

Τα Restful web services επιτρέπουν στα αιτούμενα συστήματα, να έχουν πρόσβαση και να χειρίζονται κειμενικές αναπαραστάσεις των web resources, χρησιμοποιώντας ένα uniform και ένα προκαθορισμένο σύνολο από stateless λειτουργίες.

Οι περιορισμοί που ορίζει το REST
Resources

Για το REST, πολύ σημαντική έννοια είναι το resource. Resource είναι οτιδήποτε μπορεί, να ονομαστεί. Παραδείγματα από resources είναι χρήστες, προιόντα, βίντεο και συνήθως σχετίζονται μεταξύ τους. Κάθε resource έχει ένα URI ως αναγνωριστικο. Θα πρέπει, να χρησιμοποιούμε ουσιαστικά, για να αναπαριστάμε resources.

URI Περιγραφή Resource
https://api.example/products Αναπαριστά μια συλλογή από προιόντα resources.
https://api.example/products/2 Αναπαριστά ένα προιόν resource με το αναγνωριστικό 2.
Επικοινωνία μεταξύ client και server

Στην αρχιτεκτονική REST, ο client στέλνει ένα αίτημα, για να πάρει ή να τροποποιήσει ένα resource και ο server στέλνει απαντήσεις σε αυτά τα αιτήματα. ΤΟ υποκείμενο πρωτόκολλο του REST είναι το HTTP, το οποίο είναι το βασικό πρωτόκολλο του διαδικτύου. Ένα αίτημα αποτελείται από :

HTTP Verbs

Υπάρχουν 4 βάσικα HTTP ρήματα, τα οποία χρησιμοποιούμε, για να αλληλεπιδράσουμε με τα resources.

Verb Λειτουργία
GET Ανακτούμε ένα resource ή μια συλλογή από resources.
POST Δημιουργούμε ένα καινούριο resource.
PUT Ενημερώνουμε ένα καινούριο resource.
DELETE Διαγράφουμε ένα καινούριο resource.
Αναπαράσταση των Resources

Τα RESTful resources είναι αφηρημένες οντότητες. O server πριν στείλει την απάντηση στον client, πρέπει να κάνει serialize τα δεδομένα της απάντησης στην κατάλληλη αναπαράσταση. Οι πιο συνηθισμένες μορφές αναπαράστασης των resources είναι το JSON και η XML . Ένα προιόν resource μπορεί, να αναπαρασταθεί σε JSON ως εξής:

                
                {
                      "id" : 10,
                      "name" : "iPhone-7",
                      "price" : 1200
                }
                
            

Το ίδιο resource, μπορεί να αναπαρασταθεί σε XML μορφή ως εξής:

                
                <product>
                  <id>10</id>
                  <name>iPhone-7</name>
                  <price>1200</price>
                </product>
                
            
Status Codes

Κάθε απάντηση του server περιέχει και ένα status code, ο οποίο ενημερώνει τον client, σχετικά με την επιτυχία της λειτουργίας. Τα πιο συγκεκριμένα περιγράφονται παρακάτω.

Status code Περιγραφή
200 (ΟΚ) Είναι η τυπική απάντηση για τα επιτυχημένα HTTP requests.
201 (CREATED) Είναι η τυπική απάντηση, όταν ένα HTTP request, είχε ως αποτέλεσμα τη δημιουργία ενός resource.
204 (NO CONTENT) Είναι η τυπική απάντηση για τα επιτυχημένα HTTP requests, τα οποία έχουν κενό response body.
400 (BAD REQUEST) Το αίτημα δεν μπορεί, να επεξεργαστεί λόγω κακής σύνταξης του αιτήματος ή κάποιου σφάλματος του client.
403 (FORBIDDEN) Ο client δεν έχει άδεια πρόσβασης, σε αυτό το resource.
404 (NOT FOUND) Το resource δεν βρέθηκε. Μπορεί, να διαγράφηκε ή να μην έχει δημιουργηθεί ακόμα.
500 (INTERNAL SERVER ERROR) Είναι μια γενική απάντηση, για κάποια αναπάνταχη αποτυχία του server, όταν δεν υπάρχουν πιο συγκεκριμένες πληροφορίες.

Παρακάτω, δίνεται ένα παράδειγμα, ο server βρίσκει ένα συγκεκριμένο προιόν resource, σύμφωνα με το id και επιστρέφει το προιόν και το status code 200 (OK).

                
                        @GetMapping("/products/{id}")
                        public  ResponseEntity<?> getProduct(@PathVariable int id){
                            Product product = productService.findById(id);
                            return new ResponseEntity<Product>( product, HttpStatus.OK);
                        } 
                
            
Πηγές