Préparation à la certification professionnelle du printemps. Repos de printemps

L'article d'aujourd'hui couvrira les questions de base sur REST au printemps. Il sera particulièrement utile pour les programmeurs débutants.


Le guide officiel de Pivotal, qui parle des sujets de préparation.



Table des matières
  1. Injection de dépendance, conteneur, IoC, haricots
  2. AOP (programmation orientée aspect)
  3. JDBC, transactions, JPA, données de printemps
  4. Botte de printemps
  5. Spring mvc
  6. Sécurité printanière
  7. REPOS
  8. Test



Spring REST fait partie de Spring MVC. Par conséquent, une grande partie de Spring MVC sera utilisée dans REST et vice versa. Pour un examen plus approfondi de Spring MVC, lisez cet article .


Pourquoi REST a-t-il été créé?

Pour comprendre le concept de REST, vous devez analyser l'acronyme dans ses composants:


  • Représentation - les ressources dans REST peuvent être représentées sous n'importe quelle forme - JSON, XML, texte ou même HTML - dépend des données qui conviennent le mieux au consommateur
  • État - lorsque vous travaillez avec REST, vous devez vous concentrer sur l'état de la ressource, et non sur les actions avec la ressource
  • Transfert - REST comprend le transfert de données de ressources, sous n'importe quelle forme présentée, d'une application à une autre.

REST est le transfert des états des ressources entre un serveur et un client.


Qu'est-ce qu'une ressource?

Une ressource dans REST est tout ce qui peut être transféré entre un client et un serveur.
Voici quelques exemples de ressources:


  • Actualités
  • Température à Saint-Pétersbourg le lundi à 4 heures du matin
  • Salaire des employés
  • Sélection de la base de données
  • Résultat de la recherche

Que signifie CRUD?

Les actions dans REST sont déterminées par les méthodes http.
Get , Post , Put , Delete , Patch et autres.


Les plus couramment utilisés sont désignés par l'acronyme CRUD:


  • Créer - POST
  • Lire - GET
  • Mise à jour - PUT
  • Supprimer - DELETE

REST est-il sûr? Comment pouvez-vous le protéger?

Par défaut, REST n'est pas sécurisé.


Vous pouvez configurer la sécurité avec Basic Auth, JWT, OAuth2

.
Qu'est-ce que les opérations de sauvegarde?

Ce sont des opérations qui ne modifient pas les ressources. En voici une liste:


  • Obtenez
  • TETE
  • OPTIONS

Qu'est-ce qu'une opération idempotente? Pourquoi l'idempotence est-elle importante?

Les méthodes idempotentes sont des méthodes à chaque invocation dont le résultat sera le même.


Autrement dit, le résultat après 1 appel d'une telle méthode sera le même que le résultat après 10 appels de cette méthode.


Ceci est important pour une API tolérante aux pannes. Supposons qu'un client souhaite mettre à jour une ressource à l'aide d'une demande POST? Si POST n'est pas une méthode idempotente, un appel multiple provoquera des mises à jour inattendues des ressources. En utilisant des méthodes idempotentes, vous vous protégez de nombreuses erreurs.


REST évolue-t-il bien?

Oui REST évolue bien car il ne stocke pas l'état.


Cela signifie qu'il ne stocke pas les informations de session utilisateur sur le serveur.


Les informations client ne doivent pas être stockées côté serveur, mais doivent être transmises à chaque fois là où elles sont nécessaires. C'est ce que ST signifie dans REST, State Transfer. Vous passez l'état, pas le stockez sur le serveur.


REST est également interopérable - cela signifie que différents programmes écrits dans différentes langues peuvent interagir avec. Cela vient de 2 facteurs:


  • Clients HTTP interopérables. Différents clients doivent envoyer les mêmes requêtes http.
  • Interopérabilité au niveau des types de supports. Différents clients doivent envoyer et recevoir correctement les mêmes ressources.

Qu'est-ce qu'un HttpMessageConverter?

HttpMessageConverter convertit la demande en objet et vice versa.


Spring a plusieurs implémentations de cette interface, et vous pouvez créer la vôtre.


Dans ce cas, DispatcherServlet n'utilise pas Model and View.


Dans REST, le modèle et la vue n'existent pas du tout. Il n'y a que les données fournies par le contrôleur et la représentation de la ressource lorsque le message est converti d'un type de média (json, xml ...) en objet.


Liste des convertisseurs:


BufferedImageHttpMessageConverter - Convertit un BufferedImage en (à partir de) le code image.


Jaxb2RootElementHttpMessageConverter - convertit le xml en (depuis) ​​un objet marqué avec des annotations jaxb2. Enregistrez-vous si jaxb2 est dans le chemin de classe.


MappingJackson2HttpMessageConverter - convertit JSON en (depuis) ​​un objet. Inscrivez-vous si Jackson 2 est dans le chemin de classe.


StringHttpMessageConverter - convertit tous les fichiers multimédias en texte / simple.


Comment fonctionne l'annotation @RestController?

@RestController est placé sur la classe de contrôleur au lieu de @Controller . Elle souligne que cette classe ne fonctionne pas sur des modèles, mais sur des données. Il se compose d' @RequestBody @Controller et @RequestBody .


 @Controller @ResponseBody public interface RestController 

Pourquoi @ResponseBody?

L' @ResponseBody est placée sur des méthodes qui fonctionnent avec des données, pas avec des modèles. Il n'est pas nécessaire de le spécifier explicitement si @RestController utilisé.


Les méthodes régulières renvoient Model et les méthodes @ResponseBody annotées renvoient des objets qui sont convertis en fichiers multimédias à l'aide de HttpMessageConverter .


Que fait l'annotation @RequestMapping?

Cette annotation est utilisée pour mapper les demandes aux classes et méthodes de contrôleur.
Auparavant, il était utilisé pour les méthodes de classe pour indiquer l'URI, la méthode http, le type de données envoyées, etc. Dans les versions plus récentes de Spring, il a été remplacé par des annotations @GetMapping , @PostMapping , etc.


Maintenant, il est utilisé uniquement pour indiquer l'URI à la classe de contrôleur.


Que sont les annotations @GetMapping, @PostMapping, @DeleteMapping et autres?

Ce sont des annotations plus étroites pour le mappage des méthodes http.


  • @GetMapping - Gère les requêtes
  • @PostMapping - Gère les demandes de publication
  • @DeleteMapping - Gère les demandes de suppression
  • @PutMapping - Gère les demandes de mise
  • @PatchMapping - Gère les demandes de correctifs

Tout ce qui est écrit ci-dessous est également caractéristique d'autres annotations.


Annotation @GetMapping est simplement une annotation qui contient @RequestMapping (méthode = RequestMethod.GET) .
Il vous permet également d'affiner la méthode du gestionnaire.
Ses paramètres (ils sont convertis en paramètres @RequestMapping similaires):


  • path - URI
  • headers -têtes - en-têtes
  • name - nom du gestionnaire
  • params - paramètres
  • produces - type de données retournées (JSON, XML, texte). Utilisé dans REST
  • consumes - type de données reçues. Utilisé dans REST


    Par défaut, l'annotation prend le chemin de la méthode.
    @GetMapping("managers") = @GetMapping(path = "managers")



Pourquoi utiliser l'annotation @RequestParam?

Cette annotation est utilisée pour que les méthodes de gestionnaire puissent obtenir des paramètres à partir d'une requête http.


Une demande avec des paramètres: http://localhost:8080/getByName/name=Ivan .
Le code suivant mettra la chaîne Ivan dans le name la variable.


 @GetMapping("getByName") public User getUserByName(@RequestParam("name") String name) { //some logic } 

Pourquoi utiliser l'annotation @PathVariable?

Cette annotation obtient une partie spécifique de l'URI.


URI: http://localhost:8080/getById/23


Le code suivant mettra 23 dans la variable id .


 @GetMapping("getById/{id}") public User getUserById(@PathVariable("id") String id) { //some logic } 

Que signifient les différents codes pour les réponses http?

OBTENIR - 200 OK


POST - 200 OK, 201 créé, 204 sans contenu


PUT - 200 OK, 201 créé, 204 sans contenu


SUPPRIMER - 204 Pas de contenu, 202 accepté


Pourquoi ai-je besoin d'une annotation @ResponseStatus?

Il vous permet de définir un code de réponse. En règle générale, Spring lui-même définit le code de réponse souhaité, mais il y a des moments où vous devez le remplacer.


 @PostMapping @ResponseStatus(HttpStatus.CREATED) public void add(...) {...} 

Au lieu d'utiliser des annotations, vous pouvez renvoyer une ResponseEntity et définir manuellement le code de réponse.


L' @ReponseStatus conjointe de ResponseEntity et @ReponseStatus n'est pas recommandée.


Qu'est-ce qu'une ResponseEntity?

Il s'agit d'une classe spéciale qui représente une réponse http. Il contient le corps de la réponse, le code d'état, les en-têtes. Nous pouvons l'utiliser pour affiner la réponse http.


C'est un type universel, et n'importe quel objet peut être utilisé comme corps:


 @GetMapping("/hello") ResponseEntity hello() { return new ResponseEntity("Hello World!", HttpStatus.OK); } 

Pourquoi @RequestBody?

Vous pouvez utiliser l'annotation @RequestBody sur un paramètre de méthode pour que le corps de la demande soit converti en ce paramètre.


 @PostMapping("accounts") //,   JSON    Account public void handle(@RequestBody Account account) {...} 

Vous pouvez utiliser @Validated avec @RequestBody pour vérifier une demande.


Qu'est-ce qu'un RestTemplate? Quels sont ses avantages?

RestTemplate est un client spécial au printemps pour l'envoi de requêtes http. Il fournit des API pratiques pour appeler facilement des points de terminaison REST sur une seule ligne.


 RestTemplate restTemplate = new RestTemplate(); String fooResourceUrl = "http://localhost:8080/spring-rest/foos"; ResponseEntity response = restTemplate.getForEntity(fooResourceUrl + "/1", String.class); 

Vous pouvez en savoir plus sur l'utilisation dans cet article .

Source: https://habr.com/ru/post/fr471140/


All Articles