Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele RESTin Perusperiaatteet | RESTful API
Spring Boot Backend

bookRESTin Perusperiaatteet

RESTin ydinperiaatteet muodostavat perustan tehokkaiden ja helposti skaalautuvien verkkopalveluiden luomiselle. Spring Bootissa niitä käytetään usein APIen toteuttamiseen.

Tarkastellaan, mitä nämä periaatteet ovat, miksi ne ovat tärkeitä, ja käydään läpi esimerkkejä niiden soveltamisesta Spring Bootissa.

RESTin ydinperiaatteet

REST (Representational State Transfer) on arkkitehtuurityyli, joka perustuu kuuteen keskeiseen periaatteeseen. Ne auttavat kehittäjiä rakentamaan yksinkertaisia, joustavia ja skaalautuvia API-rajapintoja. Nämä periaatteet kuvaavat, miten järjestelmien tulisi olla vuorovaikutuksessa pysyäkseen sopeutuvina ja ylläpidettävinä.

Asiakas-palvelin-arkkitehtuuri

REST APIn tulee erottaa vastuut asiakkaan ja palvelimen välillä. Asiakas vastaa käyttöliittymästä ja pyyntöjen tekemisestä, kun taas palvelin huolehtii datan tallennuksesta ja pyyntöjen käsittelystä.

REST API varmistaa selkeän eron asiakaspuolen ja palvelinpuolen välillä, jolloin ne voivat kehittyä itsenäisesti.

Asiakaspuoli voi olla esimerkiksi verkkoselain, mobiilisovellus tai muu asiakassovellus, kun taas palvelinpuoli voidaan toteuttaa millä tahansa ohjelmointikielellä.

Tilaton

Jokaisen asiakkaan tekemän pyynnön palvelimelle tulee sisältää kaikki tarvittavat tiedot kyseisen pyynnön käsittelemiseksi. Palvelin ei saa säilyttää tilaa pyyntöjen välillä, mikä varmistaa, että jokainen pyyntö on erillinen muista.

Esimerkiksi, jos sovellus palauttaa tuotelistan eri kielillä, asiakkaan tulee sisällyttää kielitieto jokaiseen pyyntöön, jotta palvelin tietää, mitä kieltä vastauksessa käytetään. Palvelin ei tallenna kielitietoa pyyntöjen välillä. Toteutetaan tämä esimerkki koodissa.

Main.java

Main.java

copy
12345678910111213141516
@RestController @RequestMapping("/products") public class ProductController { @GetMapping public List<Product> getProducts(@RequestParam("lang") String language) { // Check the language requested by the client if ("en".equals(language)) { return productService.getProductsInEnglish(); } else if ("es".equals(language)) { return productService.getProductsInSpanish(); } else { return productService.getProductsInDefaultLanguage(); } } }

Tämä koodi edustaa REST-ohjainta, joka käsittelee HTTP GET pyyntöjä polussa /products. getProducts() metodi ottaa vastaan lang-parametrin, joka ilmaisee, millä kielellä asiakas haluaa vastauksen tiedot.

Tämän parametrin perusteella metodi palauttaa tuotelistan määritetyllä kielellä tai oletuskielellä.

Yhtenäinen rajapinta

Jotta REST API olisi helppokäyttöinen, sen tulee olla yksinkertainen ja järjestelmällinen. Tämä tarkoittaa, että kaikkien päätepisteiden tulee noudattaa tiettyjä perusohjeita. Tässä ovat keskeiset periaatteet:

Käytä substantiiveja resurssien ilmaisemiseen verbien sijaan. Esimerkiksi, GET /createProduct sijaan on parempi käyttää POST /products, jossa products on resurssi.

GET /productsPalauttaa listan tuotteista;

POST /productsLuo uuden tuotteen;

PUT /products/{id}Päivittää tietyn tuotteen tiedot, missä {id} on tuotteen yksilöllinen tunniste;

DELETE /products/{id}Poistaa tuotteen annetulla tunnisteella.

Kuvataan Spring REST -kontrolleri, joka hallinnoi tuotteita toteuttamalla erilaisia HTTP-menetelmiä luomiseen, hakemiseen, päivittämiseen ja poistamiseen tuotteen tiedoille, noudattaen parhaita käytäntöjä käyttäjäystävällisen API-rakenteen saavuttamiseksi.

Main.java

Main.java

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
@RestController @RequestMapping("/products") public class ProductController { // Example of applying the client-server architecture principle private final ProductService productService; // Constructor injection ensures productService is provided by Spring public ProductController(ProductService productService) { this.productService = productService; } // Uniform interface principle: GET request to retrieve all products @GetMapping public List<Product> getAllProducts() { // Calls the service to return a list of all products return productService.getAllProducts(); } // Uniform interface principle: POST request to create a new product @PostMapping public Product createProduct(@RequestBody Product product) { // Calls the service to create a new product based on the provided request body return productService.createProduct(product); } // Uniform interface principle: GET request to retrieve a product by its ID @GetMapping("/{id}") public Product getProductById(@PathVariable Long id) { // Calls the service to find and return the product with the given ID return productService.getProductById(id); } // Uniform interface principle: PUT request to update a product by its ID @PutMapping("/{id}") public Product updateProduct(@PathVariable Long id, @RequestBody Product product) { // Calls the service to update the product details based on the provided request body and ID return productService.updateProduct(id, product); } // Uniform interface principle: DELETE request to remove a product by its ID @DeleteMapping("/{id}") public void deleteProduct(@PathVariable Long id) { // Calls the service to delete the product with the specified ID productService.deleteProduct(id); } }

@RequestMapping("/products") -annotaatio määrittää, että perus-URL /products liitetään automaattisesti kaikkiin tämän kontrollerin reitteihin.

Tässä esimerkissä kontrolleri käsittelee Product-entiteettiin (Product-luokka) liittyviä toimintoja, joten perus-URL on /products. Tämä lähestymistapa ehkäisee /products-osoitteen toistamisen jokaisessa metodissa. Sen sijaan määritellään vain HTTP-metodit (GET, POST, PUT, DELETE), jotka kohdistuvat tähän perus-URL-osoitteeseen.

GET /productsHakee tuotteiden listan;

POST /productsLuo uuden tuotteen.

Voimme käyttää useita päätepisteitä samalla URL-osoitteella, mutta eri HTTP-menetelmillä. Esimerkiksi GET /products ja POST /products käyttävät samaa URL-osoitetta, mutta eri HTTP-menetelmiä. Asiakas määrittää HTTP-menetelmän pyynnön otsikossa, mikä osoittaa, mikä toiminto suoritetaan.

Välimuisti

Suorituskyvyn parantamiseksi palvelin voi ohjeistaa asiakasta tallentamaan tietoja välimuistiin. Tämä vähentää palvelimen kuormitusta ja nopeuttaa pyyntöjen käsittelyä.

Tämä tarkoittaa, että kun menetelmää kutsutaan samoilla parametreilla, tulos haetaan välimuistista sen sijaan, että menetelmä suoritettaisiin uudelleen. Tämä voi parantaa suorituskykyä vähentämällä palvelun kuormitusta.

Spring Bootissa vastausten välimuistia voidaan hallita annotaatioilla tai HTTP-otsikoilla. Tässä on esimerkki datan välimuistista:

Main.java

Main.java

copy
12345
@Cacheable("products") @GetMapping public List<Product> getAllProducts() { return productService.getAllProducts(); }

Tässä esimerkissä @Cacheable annotaatiota käytetään tallentamaan välimuistiin getAllProducts() metodin tulos.

@Cacheable("products") annotaatio osoittaa, että getAllProducts() metodin tulos tallennetaan välimuistiin nimellä products. Kun metodia kutsutaan uudelleen samoilla parametreilla, Spring etsii tuloksen products välimuistista sen sijaan, että suorittaisi metodin uudelleen.

Kerroksellinen järjestelmä

Kerrostetun järjestelmän periaate REST API:ssa tarkoittaa, että asiakas ei kommunikoi vain yhden palvelimen kanssa, vaan toimii useiden tasojen kautta. Tätä voidaan havainnollistaa käyttämällä kolmitasoista arkkitehtuuria Spring Bootissa.

Kun asiakas lähettää pyynnön, se kulkee kaikkien kolmen tason läpi: kontrollerista palveluun, sitten tietovarastoon ja takaisin. Tämä erottelu auttaa pitämään järjestelmän järjestyksessä ja tekee koodin ylläpidosta helpompaa.

Code on Demand

Vaikka harvemmin käytetty, REST API voi palauttaa suoritettavaa koodia asiakkaalle ajettavaksi heidän puolellaan. Tätä periaatetta sovelletaan harvoin ja se vaatii lisäturvatoimia.

Esimerkiksi API voi palauttaa JavaScript-koodia, joka suoritetaan asiakkaan selaimessa datan käsittelyyn tai muihin tehtäviin. Tämä voi olla hyödyllistä dynaamisesti ladattavien toimintojen, kuten lomakkeiden käsittelyn tai asiakaspään datan validoinnin yhteydessä.

Yhteenveto

RESTin perusperiaatteet ovat olennaisia ohjeita joustavien ja ylläpidettävien API-rajapintojen luomiseen. Spring Bootissa nämä periaatteet toteutetaan annotaatioilla kuten @RestController, @Cacheable, jotka helpottavat hyvin rakenteellisten ja tehokkaiden järjestelmien kehittämistä asiakasrajapintoja varten.

1. Mikä REST-periaate mahdollistaa asiakkaan vuorovaikutuksen resurssin kanssa käyttämällä standardoituja HTTP-menetelmiä?

2. Mitä tilaton periaate tarkoittaa REST:ssä?

question mark

Mikä REST-periaate mahdollistaa asiakkaan vuorovaikutuksen resurssin kanssa käyttämällä standardoituja HTTP-menetelmiä?

Select the correct answer

question mark

Mitä tilaton periaate tarkoittaa REST:ssä?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 2

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Awesome!

Completion rate improved to 3.45

bookRESTin Perusperiaatteet

Pyyhkäise näyttääksesi valikon

RESTin ydinperiaatteet muodostavat perustan tehokkaiden ja helposti skaalautuvien verkkopalveluiden luomiselle. Spring Bootissa niitä käytetään usein APIen toteuttamiseen.

Tarkastellaan, mitä nämä periaatteet ovat, miksi ne ovat tärkeitä, ja käydään läpi esimerkkejä niiden soveltamisesta Spring Bootissa.

RESTin ydinperiaatteet

REST (Representational State Transfer) on arkkitehtuurityyli, joka perustuu kuuteen keskeiseen periaatteeseen. Ne auttavat kehittäjiä rakentamaan yksinkertaisia, joustavia ja skaalautuvia API-rajapintoja. Nämä periaatteet kuvaavat, miten järjestelmien tulisi olla vuorovaikutuksessa pysyäkseen sopeutuvina ja ylläpidettävinä.

Asiakas-palvelin-arkkitehtuuri

REST APIn tulee erottaa vastuut asiakkaan ja palvelimen välillä. Asiakas vastaa käyttöliittymästä ja pyyntöjen tekemisestä, kun taas palvelin huolehtii datan tallennuksesta ja pyyntöjen käsittelystä.

REST API varmistaa selkeän eron asiakaspuolen ja palvelinpuolen välillä, jolloin ne voivat kehittyä itsenäisesti.

Asiakaspuoli voi olla esimerkiksi verkkoselain, mobiilisovellus tai muu asiakassovellus, kun taas palvelinpuoli voidaan toteuttaa millä tahansa ohjelmointikielellä.

Tilaton

Jokaisen asiakkaan tekemän pyynnön palvelimelle tulee sisältää kaikki tarvittavat tiedot kyseisen pyynnön käsittelemiseksi. Palvelin ei saa säilyttää tilaa pyyntöjen välillä, mikä varmistaa, että jokainen pyyntö on erillinen muista.

Esimerkiksi, jos sovellus palauttaa tuotelistan eri kielillä, asiakkaan tulee sisällyttää kielitieto jokaiseen pyyntöön, jotta palvelin tietää, mitä kieltä vastauksessa käytetään. Palvelin ei tallenna kielitietoa pyyntöjen välillä. Toteutetaan tämä esimerkki koodissa.

Main.java

Main.java

copy
12345678910111213141516
@RestController @RequestMapping("/products") public class ProductController { @GetMapping public List<Product> getProducts(@RequestParam("lang") String language) { // Check the language requested by the client if ("en".equals(language)) { return productService.getProductsInEnglish(); } else if ("es".equals(language)) { return productService.getProductsInSpanish(); } else { return productService.getProductsInDefaultLanguage(); } } }

Tämä koodi edustaa REST-ohjainta, joka käsittelee HTTP GET pyyntöjä polussa /products. getProducts() metodi ottaa vastaan lang-parametrin, joka ilmaisee, millä kielellä asiakas haluaa vastauksen tiedot.

Tämän parametrin perusteella metodi palauttaa tuotelistan määritetyllä kielellä tai oletuskielellä.

Yhtenäinen rajapinta

Jotta REST API olisi helppokäyttöinen, sen tulee olla yksinkertainen ja järjestelmällinen. Tämä tarkoittaa, että kaikkien päätepisteiden tulee noudattaa tiettyjä perusohjeita. Tässä ovat keskeiset periaatteet:

Käytä substantiiveja resurssien ilmaisemiseen verbien sijaan. Esimerkiksi, GET /createProduct sijaan on parempi käyttää POST /products, jossa products on resurssi.

GET /productsPalauttaa listan tuotteista;

POST /productsLuo uuden tuotteen;

PUT /products/{id}Päivittää tietyn tuotteen tiedot, missä {id} on tuotteen yksilöllinen tunniste;

DELETE /products/{id}Poistaa tuotteen annetulla tunnisteella.

Kuvataan Spring REST -kontrolleri, joka hallinnoi tuotteita toteuttamalla erilaisia HTTP-menetelmiä luomiseen, hakemiseen, päivittämiseen ja poistamiseen tuotteen tiedoille, noudattaen parhaita käytäntöjä käyttäjäystävällisen API-rakenteen saavuttamiseksi.

Main.java

Main.java

copy
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
@RestController @RequestMapping("/products") public class ProductController { // Example of applying the client-server architecture principle private final ProductService productService; // Constructor injection ensures productService is provided by Spring public ProductController(ProductService productService) { this.productService = productService; } // Uniform interface principle: GET request to retrieve all products @GetMapping public List<Product> getAllProducts() { // Calls the service to return a list of all products return productService.getAllProducts(); } // Uniform interface principle: POST request to create a new product @PostMapping public Product createProduct(@RequestBody Product product) { // Calls the service to create a new product based on the provided request body return productService.createProduct(product); } // Uniform interface principle: GET request to retrieve a product by its ID @GetMapping("/{id}") public Product getProductById(@PathVariable Long id) { // Calls the service to find and return the product with the given ID return productService.getProductById(id); } // Uniform interface principle: PUT request to update a product by its ID @PutMapping("/{id}") public Product updateProduct(@PathVariable Long id, @RequestBody Product product) { // Calls the service to update the product details based on the provided request body and ID return productService.updateProduct(id, product); } // Uniform interface principle: DELETE request to remove a product by its ID @DeleteMapping("/{id}") public void deleteProduct(@PathVariable Long id) { // Calls the service to delete the product with the specified ID productService.deleteProduct(id); } }

@RequestMapping("/products") -annotaatio määrittää, että perus-URL /products liitetään automaattisesti kaikkiin tämän kontrollerin reitteihin.

Tässä esimerkissä kontrolleri käsittelee Product-entiteettiin (Product-luokka) liittyviä toimintoja, joten perus-URL on /products. Tämä lähestymistapa ehkäisee /products-osoitteen toistamisen jokaisessa metodissa. Sen sijaan määritellään vain HTTP-metodit (GET, POST, PUT, DELETE), jotka kohdistuvat tähän perus-URL-osoitteeseen.

GET /productsHakee tuotteiden listan;

POST /productsLuo uuden tuotteen.

Voimme käyttää useita päätepisteitä samalla URL-osoitteella, mutta eri HTTP-menetelmillä. Esimerkiksi GET /products ja POST /products käyttävät samaa URL-osoitetta, mutta eri HTTP-menetelmiä. Asiakas määrittää HTTP-menetelmän pyynnön otsikossa, mikä osoittaa, mikä toiminto suoritetaan.

Välimuisti

Suorituskyvyn parantamiseksi palvelin voi ohjeistaa asiakasta tallentamaan tietoja välimuistiin. Tämä vähentää palvelimen kuormitusta ja nopeuttaa pyyntöjen käsittelyä.

Tämä tarkoittaa, että kun menetelmää kutsutaan samoilla parametreilla, tulos haetaan välimuistista sen sijaan, että menetelmä suoritettaisiin uudelleen. Tämä voi parantaa suorituskykyä vähentämällä palvelun kuormitusta.

Spring Bootissa vastausten välimuistia voidaan hallita annotaatioilla tai HTTP-otsikoilla. Tässä on esimerkki datan välimuistista:

Main.java

Main.java

copy
12345
@Cacheable("products") @GetMapping public List<Product> getAllProducts() { return productService.getAllProducts(); }

Tässä esimerkissä @Cacheable annotaatiota käytetään tallentamaan välimuistiin getAllProducts() metodin tulos.

@Cacheable("products") annotaatio osoittaa, että getAllProducts() metodin tulos tallennetaan välimuistiin nimellä products. Kun metodia kutsutaan uudelleen samoilla parametreilla, Spring etsii tuloksen products välimuistista sen sijaan, että suorittaisi metodin uudelleen.

Kerroksellinen järjestelmä

Kerrostetun järjestelmän periaate REST API:ssa tarkoittaa, että asiakas ei kommunikoi vain yhden palvelimen kanssa, vaan toimii useiden tasojen kautta. Tätä voidaan havainnollistaa käyttämällä kolmitasoista arkkitehtuuria Spring Bootissa.

Kun asiakas lähettää pyynnön, se kulkee kaikkien kolmen tason läpi: kontrollerista palveluun, sitten tietovarastoon ja takaisin. Tämä erottelu auttaa pitämään järjestelmän järjestyksessä ja tekee koodin ylläpidosta helpompaa.

Code on Demand

Vaikka harvemmin käytetty, REST API voi palauttaa suoritettavaa koodia asiakkaalle ajettavaksi heidän puolellaan. Tätä periaatetta sovelletaan harvoin ja se vaatii lisäturvatoimia.

Esimerkiksi API voi palauttaa JavaScript-koodia, joka suoritetaan asiakkaan selaimessa datan käsittelyyn tai muihin tehtäviin. Tämä voi olla hyödyllistä dynaamisesti ladattavien toimintojen, kuten lomakkeiden käsittelyn tai asiakaspään datan validoinnin yhteydessä.

Yhteenveto

RESTin perusperiaatteet ovat olennaisia ohjeita joustavien ja ylläpidettävien API-rajapintojen luomiseen. Spring Bootissa nämä periaatteet toteutetaan annotaatioilla kuten @RestController, @Cacheable, jotka helpottavat hyvin rakenteellisten ja tehokkaiden järjestelmien kehittämistä asiakasrajapintoja varten.

1. Mikä REST-periaate mahdollistaa asiakkaan vuorovaikutuksen resurssin kanssa käyttämällä standardoituja HTTP-menetelmiä?

2. Mitä tilaton periaate tarkoittaa REST:ssä?

question mark

Mikä REST-periaate mahdollistaa asiakkaan vuorovaikutuksen resurssin kanssa käyttämällä standardoituja HTTP-menetelmiä?

Select the correct answer

question mark

Mitä tilaton periaate tarkoittaa REST:ssä?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 3. Luku 2
some-alt