Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Grunnleggende Prinsipper for REST | RESTful Api
Spring Boot Backend

bookGrunnleggende Prinsipper for REST

Kjerneprinsippene for REST utgjør grunnlaget for å lage effektive og lett skalerbare webtjenester. I Spring Boot brukes de ofte for å implementere API-er.

La oss se nærmere på hva disse prinsippene er, hvorfor de er viktige, og undersøke eksempler på deres bruk i Spring Boot.

Kjerneprinsipper for REST

REST (Representational State Transfer) er en arkitekturstil basert på seks sentrale prinsipper som hjelper utviklere med å bygge enkle, fleksible og skalerbare API-er. Disse prinsippene beskriver hvordan systemer bør samhandle for å forbli tilpasningsdyktige og vedlikeholdbare.

Klient-server-arkitektur

En REST API bør skille ansvarsområder mellom klient og server. Klienten har ansvar for brukergrensesnittet og å sende forespørsler, mens serveren håndterer databehandling og forespørselsprosessering.

REST API sikrer et tydelig skille mellom klientsiden og serversiden av applikasjonen, noe som gjør det mulig for dem å utvikles uavhengig.

Klientsiden kan være en nettleser, mobilapp eller en annen klientapplikasjon, mens serversiden kan implementeres i et hvilket som helst programmeringsspråk.

Tilstands­løs

Hver forespørsel fra klienten til serveren må inneholde all informasjon som trengs for å behandle den forespørselen. Serveren skal ikke beholde noen tilstand mellom forespørsler, noe som sikrer at hver forespørsel er isolert fra andre.

For eksempel, tenk deg at vi har en applikasjon som returnerer en liste over produkter på forskjellige språk. Klienten må inkludere språkinformasjon i hver forespørsel slik at serveren vet hvilket språk som skal brukes for svaret. Serveren lagrer ikke språkinformasjon mellom forespørsler. La oss implementere dette eksempelet i kode.

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(); } } }

Denne koden representerer en REST-kontroller som håndterer HTTP GET-forespørsler/products-endepunktet. getProducts()-metoden tar en lang-parameter, som angir språket klienten ønsker å motta dataene på.

Basert på denne parameteren returnerer metoden en liste over produkter på det spesifiserte språket eller på standardspråket.

Enhetlig grensesnitt

For at et REST API skal være lett å bruke, bør det ha en enkel og organisert struktur. Dette innebærer at alle endepunkter må følge noen grunnleggende retningslinjer. Her er de viktigste prinsippene:

Bruk substantiv for å representere ressurser i stedet for verb. For eksempel, i stedet for å bruke GET /createProduct, er det bedre å bruke POST /products, hvor products er ressursen.

GET /productsHenter en liste over produkter;

POST /productsOppretter et nytt produkt;

PUT /products/{id}Oppdaterer informasjon om et spesifikt produkt, hvor {id} er den unike identifikatoren til produktet;

DELETE /products/{id}Sletter produktet med den spesifiserte identifikatoren.

Beskrivelse av en Spring REST-kontroller som håndterer produkter ved å implementere ulike HTTP-metoder for oppretting, henting, oppdatering og sletting av produktdata, samtidig som beste praksis for en brukervennlig API-struktur følges.

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); } }

Annotasjonen @RequestMapping("/products") angir at basis-URL-en /products automatisk vil bli prefikset til alle ruter i denne kontrolleren.

I dette eksemplet håndterer kontrolleren operasjoner relatert til Product-entiteten (Product-klassen), så basis-URL-en er /products. Denne tilnærmingen unngår gjentakelse av /products for hver metode. I stedet spesifiseres kun HTTP-metodene (GET, POST, PUT, DELETE), som vil bli anvendt på denne basis-URL-en.

GET /productsHenter en liste over produkter;

POST /productsOppretter et nytt produkt.

Vi kan ha flere endepunkter med samme URL, men forskjellige HTTP-metoder. For eksempel deler GET /products og POST /products samme URL, men de bruker forskjellige HTTP-metoder. Klienten angir HTTP-metoden i forespørselsheaderen, som indikerer hvilken handling som skal utføres.

Hurtiglager (Caching)

For å forbedre ytelsen kan serveren instruere klienten om når data skal lagres i hurtiglager. Dette reduserer belastningen på serveren og øker hastigheten på forespørselsbehandlingen.

Dette betyr at når metoden kalles med de samme parameterne, vil resultatet hentes fra hurtiglageret i stedet for å kjøre metoden på nytt. Dette kan forbedre ytelsen ved å redusere belastningen på tjenesten.

I Spring Boot kan hurtiglager av svar håndteres ved hjelp av annotasjoner eller HTTP-headere. Her er et eksempel på hurtiglager av data:

Main.java

Main.java

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

I dette eksemplet brukes @Cacheable-annotasjonen for å bufre resultatet av getAllProducts()-metoden.

@Cacheable("products")-annotasjonen indikerer at resultatet av getAllProducts()-metoden vil bli lagret i cachen under navnet products. Når metoden kalles på nytt med de samme parameterne, vil Spring lete etter resultatet i products-cachen i stedet for å kjøre metoden på nytt.

Lagdelt system

Prinsippet om lagdelt system i REST API innebærer at klienten ikke kommuniserer med kun én server; i stedet opererer den gjennom flere nivåer. Dette kan forklares ved hjelp av trelagsarkitekturen i Spring Boot.

Når klienten sender en forespørsel, går den gjennom alle tre nivåer: fra controller til service, deretter til repository, og tilbake. Denne oppdelingen bidrar til å holde systemet organisert og gjør det enklere å vedlikeholde koden.

Code on Demand

Selv om det brukes sjeldnere, kan et REST API returnere kjørbar kode til klienten for utførelse på deres side. Dette prinsippet benyttes sjelden og krever ytterligere sikkerhetstiltak.

For eksempel kan et API returnere JavaScript-kode som kjøres i klientens nettleser for å behandle data eller utføre andre oppgaver. Dette kan være nyttig for dynamisk lasting av funksjonalitet basert på forespørsler, som håndtering av skjemaer eller klientside datavalidering.

Oppsummering

De grunnleggende prinsippene for REST er viktige retningslinjer for å lage fleksible og vedlikeholdbare API-er. I Spring Boot implementeres disse prinsippene ved hjelp av annotasjoner som @RestController, @Cacheable, som legger til rette for utvikling av godt strukturerte og effektive systemer for samhandling med klienter.

1. Hvilket REST-prinsipp gjør det mulig for klienten å samhandle med en ressurs ved å bruke standard HTTP-metoder?

2. Hva betyr det statsløse prinsippet i REST?

question mark

Hvilket REST-prinsipp gjør det mulig for klienten å samhandle med en ressurs ved å bruke standard HTTP-metoder?

Select the correct answer

question mark

Hva betyr det statsløse prinsippet i REST?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 2

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Suggested prompts:

Can you explain each of the six REST principles in more detail?

How does Spring Boot help implement these REST principles?

Can you provide more examples of RESTful endpoints in Spring Boot?

Awesome!

Completion rate improved to 3.45

bookGrunnleggende Prinsipper for REST

Sveip for å vise menyen

Kjerneprinsippene for REST utgjør grunnlaget for å lage effektive og lett skalerbare webtjenester. I Spring Boot brukes de ofte for å implementere API-er.

La oss se nærmere på hva disse prinsippene er, hvorfor de er viktige, og undersøke eksempler på deres bruk i Spring Boot.

Kjerneprinsipper for REST

REST (Representational State Transfer) er en arkitekturstil basert på seks sentrale prinsipper som hjelper utviklere med å bygge enkle, fleksible og skalerbare API-er. Disse prinsippene beskriver hvordan systemer bør samhandle for å forbli tilpasningsdyktige og vedlikeholdbare.

Klient-server-arkitektur

En REST API bør skille ansvarsområder mellom klient og server. Klienten har ansvar for brukergrensesnittet og å sende forespørsler, mens serveren håndterer databehandling og forespørselsprosessering.

REST API sikrer et tydelig skille mellom klientsiden og serversiden av applikasjonen, noe som gjør det mulig for dem å utvikles uavhengig.

Klientsiden kan være en nettleser, mobilapp eller en annen klientapplikasjon, mens serversiden kan implementeres i et hvilket som helst programmeringsspråk.

Tilstands­løs

Hver forespørsel fra klienten til serveren må inneholde all informasjon som trengs for å behandle den forespørselen. Serveren skal ikke beholde noen tilstand mellom forespørsler, noe som sikrer at hver forespørsel er isolert fra andre.

For eksempel, tenk deg at vi har en applikasjon som returnerer en liste over produkter på forskjellige språk. Klienten må inkludere språkinformasjon i hver forespørsel slik at serveren vet hvilket språk som skal brukes for svaret. Serveren lagrer ikke språkinformasjon mellom forespørsler. La oss implementere dette eksempelet i kode.

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(); } } }

Denne koden representerer en REST-kontroller som håndterer HTTP GET-forespørsler/products-endepunktet. getProducts()-metoden tar en lang-parameter, som angir språket klienten ønsker å motta dataene på.

Basert på denne parameteren returnerer metoden en liste over produkter på det spesifiserte språket eller på standardspråket.

Enhetlig grensesnitt

For at et REST API skal være lett å bruke, bør det ha en enkel og organisert struktur. Dette innebærer at alle endepunkter må følge noen grunnleggende retningslinjer. Her er de viktigste prinsippene:

Bruk substantiv for å representere ressurser i stedet for verb. For eksempel, i stedet for å bruke GET /createProduct, er det bedre å bruke POST /products, hvor products er ressursen.

GET /productsHenter en liste over produkter;

POST /productsOppretter et nytt produkt;

PUT /products/{id}Oppdaterer informasjon om et spesifikt produkt, hvor {id} er den unike identifikatoren til produktet;

DELETE /products/{id}Sletter produktet med den spesifiserte identifikatoren.

Beskrivelse av en Spring REST-kontroller som håndterer produkter ved å implementere ulike HTTP-metoder for oppretting, henting, oppdatering og sletting av produktdata, samtidig som beste praksis for en brukervennlig API-struktur følges.

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); } }

Annotasjonen @RequestMapping("/products") angir at basis-URL-en /products automatisk vil bli prefikset til alle ruter i denne kontrolleren.

I dette eksemplet håndterer kontrolleren operasjoner relatert til Product-entiteten (Product-klassen), så basis-URL-en er /products. Denne tilnærmingen unngår gjentakelse av /products for hver metode. I stedet spesifiseres kun HTTP-metodene (GET, POST, PUT, DELETE), som vil bli anvendt på denne basis-URL-en.

GET /productsHenter en liste over produkter;

POST /productsOppretter et nytt produkt.

Vi kan ha flere endepunkter med samme URL, men forskjellige HTTP-metoder. For eksempel deler GET /products og POST /products samme URL, men de bruker forskjellige HTTP-metoder. Klienten angir HTTP-metoden i forespørselsheaderen, som indikerer hvilken handling som skal utføres.

Hurtiglager (Caching)

For å forbedre ytelsen kan serveren instruere klienten om når data skal lagres i hurtiglager. Dette reduserer belastningen på serveren og øker hastigheten på forespørselsbehandlingen.

Dette betyr at når metoden kalles med de samme parameterne, vil resultatet hentes fra hurtiglageret i stedet for å kjøre metoden på nytt. Dette kan forbedre ytelsen ved å redusere belastningen på tjenesten.

I Spring Boot kan hurtiglager av svar håndteres ved hjelp av annotasjoner eller HTTP-headere. Her er et eksempel på hurtiglager av data:

Main.java

Main.java

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

I dette eksemplet brukes @Cacheable-annotasjonen for å bufre resultatet av getAllProducts()-metoden.

@Cacheable("products")-annotasjonen indikerer at resultatet av getAllProducts()-metoden vil bli lagret i cachen under navnet products. Når metoden kalles på nytt med de samme parameterne, vil Spring lete etter resultatet i products-cachen i stedet for å kjøre metoden på nytt.

Lagdelt system

Prinsippet om lagdelt system i REST API innebærer at klienten ikke kommuniserer med kun én server; i stedet opererer den gjennom flere nivåer. Dette kan forklares ved hjelp av trelagsarkitekturen i Spring Boot.

Når klienten sender en forespørsel, går den gjennom alle tre nivåer: fra controller til service, deretter til repository, og tilbake. Denne oppdelingen bidrar til å holde systemet organisert og gjør det enklere å vedlikeholde koden.

Code on Demand

Selv om det brukes sjeldnere, kan et REST API returnere kjørbar kode til klienten for utførelse på deres side. Dette prinsippet benyttes sjelden og krever ytterligere sikkerhetstiltak.

For eksempel kan et API returnere JavaScript-kode som kjøres i klientens nettleser for å behandle data eller utføre andre oppgaver. Dette kan være nyttig for dynamisk lasting av funksjonalitet basert på forespørsler, som håndtering av skjemaer eller klientside datavalidering.

Oppsummering

De grunnleggende prinsippene for REST er viktige retningslinjer for å lage fleksible og vedlikeholdbare API-er. I Spring Boot implementeres disse prinsippene ved hjelp av annotasjoner som @RestController, @Cacheable, som legger til rette for utvikling av godt strukturerte og effektive systemer for samhandling med klienter.

1. Hvilket REST-prinsipp gjør det mulig for klienten å samhandle med en ressurs ved å bruke standard HTTP-metoder?

2. Hva betyr det statsløse prinsippet i REST?

question mark

Hvilket REST-prinsipp gjør det mulig for klienten å samhandle med en ressurs ved å bruke standard HTTP-metoder?

Select the correct answer

question mark

Hva betyr det statsløse prinsippet i REST?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 2
some-alt