JavaRush /Blog Java /Random-FR /Le printemps ne fait pas peur. Cookies et en-têtes
Павел
Niveau 11

Le printemps ne fait pas peur. Cookies et en-têtes

Publié dans le groupe Random-FR
CONTENU DU CYCLE D'ARTICLES La répétition est mère de l'apprentissage ! Par conséquent, sur la base des articles précédents, créons un nouveau projet Web Spring-Boot : MobilePhonePayment Connect h2, Lombok. Créez une couche d'entité : BalancePhoneEntity Identifiant entier ; Numéro entierTéléphone ; Nom de chaîneClient ; Solde entier ; Créez une couche de services avec les méthodes : - Rechercher tous les enregistrements dans la base de données - Rechercher un enregistrement par identifiant - Rechercher un enregistrement par numéro de téléphone - Rechercher un enregistrement par nom d'utilisateur (doit renvoyer une feuille d'enregistrements, les noms peuvent être le même)
public List<BalanceEntity> findByNameCustomer(String nameCustomer){
    return balanceRepository.findAllByNameCustomer(nameCustomer);
}
- Ajout d'un enregistrement à la base de données - Suppression d'un enregistrement de la base de données par identifiant - Méthode commerciale : recharger le solde du téléphone - la méthode doit prendre un numéro de téléphone, un montant (type entier) et augmenter le solde du numéro correspondant du spécifié montant.
public void addingMoneyToBalance(Integer phoneNumber, Integer sum) {
    BalanceDto byPhoneNumber = findByPhoneNumber(phoneNumber);
    byPhoneNumber.setBalance(byPhoneNumber.getBalance() + sum);
    save(byPhoneNumber);//метод save() – добавление, реализован в сервисе
}
N'oubliez pas d'implémenter le mappage de DTO à Entity et inversement. Dto sera similaire à Entity : BalancePhoneDto Identifiant entier ; Numéro entierTéléphone ; Nom de chaîneClient ; Solde entier ; Créez une couche DTO, créez la classe InitiateUtils et remplissez la base de données avec les données : identifiant 1, numéro de téléphone 555000, solde 100, client Ivan id 2, numéro de téléphone 444000, solde 250, client Marya id 3, numéro de téléphone 111000, solde 60, client Ivan Create. un contrôleur de repos, mais ne vous précipitez pas pour le remplir de méthodes. Si vous suivez l'article précédent, la méthode d'affichage de tous les enregistrements aurait dû ressembler à ceci (je recommande maintenant de regarder dans les commentaires de l'article - en particulier le commentaire de Vasily Babin) :
//поиск записи по id - старая version
@GetMapping(value = "/find-phone/{id}")
public ResponseEntity<BalanceDto> findPhone(@PathVariable Integer id) {
    BalanceDto balanceDto = balanceService.findById(id);
    return balanceDto != null
            ? new ResponseEntity<>(balanceDto, HttpStatus.OK)
            : new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
Il existe une autre façon d'utiliser ResponseEntity, sans utiliser de constructeur. Nous continuerons à l'utiliser. ResponseEntity expose deux interfaces de générateur imbriquées : HeadersBuilder et sa sous-interface, BodyBuilder. Par conséquent, nous pouvons accéder à leurs capacités via les méthodes statiques de ResponseEntity. Vous pouvez en savoir plus dans cet article . Les autres méthodes du contrôleur peuvent être implémentées comme suit : 1) Afficher un enregistrement par identifiant
//поиск записи по id
@GetMapping(value = "/find-number-phoneById/{id}")
public ResponseEntity<?> findNumberPhoneById(@PathVariable Integer id) {
    BalanceDto balanceDto = balanceService.findById(id);
    return balanceDto != null
            ? ResponseEntity.ok(balanceDto)
            : ResponseEntity.ok().body(HttpStatus.NOT_FOUND);
}
On teste dans Postman (Nous en avons parlé dans l'article précédent, voici un autre petit guide sur ce programme ). Nous lançons, sélectionnons le type de requête GET, écrivons dans la ligne URL : http://localhost:8080/find-number-phoneById/1 – nous avons passé le paramètre id dans la ligne de requête, dans la sortie nous recevrons une entrée avec id égal à 1. Après avoir ajouté le nouveau code, n'oubliez pas de redémarrer le projet😇 2) Afficher les enregistrements par nom
//поиск записи по имени пользователя
@GetMapping(value = "/find-number-phoneByName/{name}")
public ResponseEntity<?> findNumberPhone(@PathVariable String name) {
    List<BalanceDto> balanceDto = balanceService.findByNameCustomer(name);
    return balanceDto != null &&  !balanceDto.isEmpty()
            ? ResponseEntity.ok(balanceDto)
            : ResponseEntity.ok().body(HttpStatus.NOT_FOUND);
}
Créons une nouvelle requête, sélectionnons le type de requête GET, écrivons dans la ligne URL : http://localhost:8080/ find-number-phoneByName/Ivan - nous avons passé le paramètre name dans la ligne de requête, et dans la sortie nous le ferons obtenir une liste d'enregistrements avec le nom Customer égal à Ivan. Peut-être que dans le résultat, vous obtiendrez quelque chose de similaire à ceci : %D1%8D%D1%82%D0%BE%20%D0%BD%D0%B5%20%D0%BE%D1%88%D0%B8%D0 % B1%D0%BA%D0%B0 Ce n'est pas une erreur - ce sont des fonctionnalités de codage de requête, lisez à ce sujet . Et ici, il est écrit comment configurer Postman pour que cela ne se produise pas. 3) Sortie de tous les enregistrements :
//поиск всех записей
@GetMapping(value = "/findAll")
public ResponseEntity<?> findAll() {
    List<BalanceDto> balanceDto = balanceService.findAll();
    return balanceDto != null &&  !balanceDto.isEmpty()
            ? ResponseEntity.ok(balanceDto)
            : ResponseEntity.ok().body(HttpStatus.NOT_FOUND);
}
Nous créons une nouvelle requête, sélectionnons le type de requête GET, écrivons dans la ligne URL : http://localhost:8080/findAll - nous ne transmettons aucun paramètre ici. 4) Ajout d'une nouvelle entrée :
//добавление новой записи
@PostMapping(value = "/entry")
public ResponseEntity<?> entryNumber(@RequestBody BalanceDto dto){
    balanceService.save(dto);
    return ResponseEntity.ok().body(HttpStatus.CREATED);
}
Nous créons une nouvelle requête, sélectionnons le type de requête POST et écrivons dans la ligne URL : http://localhost:8080/entry. Dans cette requête, nous devons transmettre un objet au format JSON. Dans la fenêtre de requête, accédez à l'onglet Corps, définissez l'indicateur sur brut, cliquez sur la flèche à côté de Texte et sélectionnez JSON. Copiez le JSON suivant dans la fenêtre :
{
        "numberPhone": 767676,
        "nameCustomer": "Sasha",
        "balance": 100
}
Lorsque nous cliquons sur exécuter la demande, le statut de la réponse est CRÉÉ. Maintenant, interrogez à nouveau findAll et assurez-vous qu'une nouvelle entrée apparaît. 5) Supprimer une entrée par identifiant
//удаление записи по id
@DeleteMapping(value = "/delete-phoneById/{id}")
public ResponseEntity<?> delete(@PathVariable Integer id) {
    balanceService.delete(id);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Nous créons une nouvelle requête, sélectionnons le type de requête DELETE, écrivons dans la ligne URL : http://localhost:8080/delete-phoneById/4 – nous avons passé le paramètre id dans la ligne de requête, nous obtenons le statut OK dans la sortie . Faites maintenant une autre demande pour findAll et assurez-vous que Sasha a disparu. 6) Changer le numéro par identifiant
//изменение номера телефона по id
@PutMapping(value = "/change")
public ResponseEntity<?> changeNumberPhone(
//можно добавлять несколько параметров в request
        @RequestParam(value = "id") Integer id, //добавor один параметр
        @RequestParam(value = "phoneNumber") Integer phoneNumber) //добавor второй параметр
 {
    BalanceDto byId = balanceService.findById(id);
    byId.setNumberPhone(phoneNumber);
    balanceService.save(byId);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Nous créons une nouvelle requête, sélectionnons le type de requête PUT et écrivons dans la ligne URL : http://localhost:8080/change. Il y a plusieurs paramètres dans cette requête, et comme vous pouvez le constater, nous ne les transmettons pas dans la ligne de requête comme avant. L'annotation @RequestParam est utilisée pour les paramètres d'une méthode. Pour transférer des paramètres via Postman, vous devez vous rendre dans l'onglet Params de la fenêtre de requête, indiquer le nom du paramètre (id) dans la colonne Clé, et indiquer la valeur (1) dans la colonne Valeur. Nous faisons la même chose avec le deuxième paramètre, Key = phoneNumber, Value = 888000. Faites attention à la chaîne de requête, Postman l'a modifiée pour transmettre correctement les paramètres. La sortie affichera l'état OK. Maintenant, interrogez à nouveau findAll et assurez-vous que le numéro de téléphone de la première entrée a changé. 7) Rechargez le solde de votre téléphone
@PutMapping(value = "/add")
public ResponseEntity<?> addingMoney(
        //можно добавлять несколько параемров в request
        @RequestParam(value = "phoneNumber") Integer phoneNumber,//добавor один параметр
        @RequestParam(value = "sum") Integer sum) //добавor второй параметр
{
    balanceService.addingMoneyToBalance(phoneNumber, sum);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Nous créons une nouvelle requête, sélectionnons le type de requête PUT et écrivons dans la ligne URL : http://localhost:8080/add. Nous définissons la valeur phoneNumber sur 888000, la somme étant égale à 130. La sortie affichera l'état OK. Exécutez maintenant à nouveau la requête findAll et assurez-vous que le solde du premier enregistrement a changé. 8) PUT via le corps de la requête - il est préférable de le faire afin de ne pas ouvrir les données transmises
@PutMapping(value = "/add")
public ResponseEntity<?> addingMoney(@RequestBody BalanceDto dto){
    balanceService.addingMoneyToBalance(dto.getPhoneNumber, dto.getSum);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Nous envoyons du JSON
{
        "numberPhone": 888000,
       //  "nameCustomer" можно вообще не указывать
        "balance": 130
}
Enfin, nous passons à Cookie. Qu'est-ce qu'un cookie ? En termes simples : les cookies stockent les données reçues une fois par le navigateur à partir d'une application, qui peuvent ensuite être utilisées à plusieurs reprises sur le site. Vous devez savoir deux choses fondamentales : comment écrire et comment lire un cookie. Comment écrire : L'ensemble de Spring Web MVC est implémenté au-dessus de l'API Servlet, qui est construite autour de deux objets : la demande du client est enveloppée dans un HttpSerlvetRequest et la réponse est générée à partir du HttpServletResponse rempli avec votre code. Avoir accès à ces objets vous donne un contrôle total sur l'ensemble de la session HTTP. Spring Web vous permet d'accéder directement à ces objets. Habituellement Cookie, créons une méthode dans le contrôleur
//записать куки
 @GetMapping(value = "/set-cookie")
public ResponseEntity<?> setCookie(HttpServletResponse response) throws IOException {
     Cookie cookie = new Cookie("data", "Come_to_the_dark_side");//создаем an object Cookie,
     //в конструкторе указываем значения для name и value
     cookie.setPath("/");//устанавливаем путь
     cookie.setMaxAge(86400);//здесь устанавливается время жизни куки
     response.addCookie(cookie);//добавляем Cookie в request
     response.setContentType("text/plain");//устанавливаем контекст
     return ResponseEntity.ok().body(HttpStatus.OK);//получилось How бы два раза статус ответа установor, выбирайте Howой вариант лучше
 }
Faisons une requête GET dans Postman à l'adresse : http://localhost:8080/set-cookie et le résultat sera OK. Au dessus de la fenêtre, trouvez l'inscription Cookie(1), en cliquant dessus vous verrez les Cookies que nous avons envoyés. Nom : données, valeur : Come_to_the_dark_side. Informations sur les principales fonctionnalités de la classe Cookie en Java. Comment lire : Encore plus facile à lire
//прочитать куки
@GetMapping(value = "/get-cookie")
public ResponseEntity<?> readCookie(@CookieValue(value = "data") String data) {
    return ResponseEntity.ok().body(data);
}
Dans @CookieValue nous indiquons le nom du Cookie dont nous allons lire la valeur, et affichons la valeur lue dans la réponse. Come_to_the_dark_side Maintenant, l'heure la plus belle est venue Header ( headers , ne regardez pas l'article sur PHP, c'est assez utile à lire) : Voyons d'abord comment lire les en-têtes :
//прочитать заголовки
@GetMapping(value = "/get-headers")
public ResponseEntity<?> getHeaders(@RequestHeader Map<String, String> headers){//представляет заголовки ввиде мапы,
    //где ключ это наименование заголовка, а meaning мапы - это meaning заголовка
    return ResponseEntity.ok(headers);
}
Le travail principal est effectué par @RequestHeader Map<String, String> , il représente les en-têtes sous la forme d'une carte, où la clé est le nom de l'en-tête et la valeur de la carte est la valeur de l'en-tête. Il est plus intéressant de tester cette méthode à l'aide d'un navigateur, ouvrez le navigateur, tapez http://localhost:8080/get-headers dans la barre de recherche, et nous obtenons ainsi une liste complète d'en-têtes. Recherchez chaque titre sur Google pour comprendre pourquoi ils sont nécessaires. Wikipédia propose également une liste de titres. « Si quelqu’un lit quelque chose, alors quelqu’un l’écrit » est un vieux dicton en programmation. Écrivons le titre
//записать заголовок
@GetMapping(value = "/set-header")
public ResponseEntity<?> setHeader(){
    return ResponseEntity.ok().header("name-header","value-header").body(HttpStatus.OK);
}
Ici, nous avons utilisé une méthode d'en-tête spéciale de la classe ResponseEntity . Où "name-header" est le nom de l'en-tête et "value-header" est la valeur de l'en-tête. Il existe d'autres options pour travailler avec les en-têtes
//еще варианты работы с заголовками
@GetMapping(value = "/set-headers")
public ResponseEntity<?> setHeaders() {
    HttpHeaders httpHeaders = new HttpHeaders();//создаем an object
    //который имплементирует мапу MultiValueMap<String, String>
    //наполняем ее парами ключ-meaning
    //можно наполнить своими заголовками через метод add
    httpHeaders.add("customer-header", "value-header1");
    //HttpHeaders так же предлагает большой выбор стандартных заголовков
    //Посмотрите на них набрав в IDEA HttpHeaders.
    httpHeaders.add(HttpHeaders.FROM, "russia");
    //можно изменить существующий заголовок, вызвав для него сет-метод
    httpHeaders.setDate(0);
    //or получить meaning конкретного заголовка
    Long date = httpHeaders.getDate();
    System.out.println(date);
    return ResponseEntity
            .ok().headers(httpHeaders)//здесь метод принимающий MultiValueMap<String, String>
            .body(HttpStatus.OK);
}
Nous utilisons ici une autre méthode de la classe ResponseEntity, qui prend une valeur de type MultiValueMap<String, String> . Il sera également plus informatif de vérifier son fonctionnement dans le navigateur. Nous allons à l'adresse http://localhost:8080/set-headers, nous recevons une réponse indiquant que le statut est OK. Si vous êtes génial et utilisez Google Chrome, appuyez sur la combinaison de touches Ctrl + Shift + I et allez dans « Outils de développement », puis recherchez l' onglet Réseau dans le panneau supérieur , en cliquant dessus, recherchez l'entrée : set-headers ( si ce n'est pas là, actualisez la page) cliquez dessus et dans la fenêtre qui s'ouvre, sélectionnez l' onglet En-têtes et dans ResponseHeaders nous voyons nos en-têtes. Pour se familiariser avec les gros titres, cela suffit pour l'instant. Maintenant, lisez : Étudier ResponseEntity<!--?--> et s'en débarrasser dans les contrôleurs Spring. Sur ce, permettez-moi de prendre congé 🤓, à bientôt...
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION