JavaRush /Java Blog /Random-TL /Ang tagsibol ay hindi nakakatakot. Cookies at Header

Ang tagsibol ay hindi nakakatakot. Cookies at Header

Nai-publish sa grupo
NILALAMAN NG CYCLE NG ARTIKULO Ang pag-uulit ay ang ina ng pag-aaral! Samakatuwid, batay sa mga nakaraang artikulo, gumawa tayo ng bagong web spring-boot project: MobilePhonePayment Connect h2, Lombok. Gumawa ng layer ng entity: BalancePhoneEntity Integer id; Integer na numeroTelepono; String nameCustomer; balanse ng integer; Lumikha ng isang layer ng mga serbisyo na may mga pamamaraan: - Maghanap para sa lahat ng mga tala sa database - Maghanap para sa isang tala sa pamamagitan ng id - Maghanap para sa isang talaan sa pamamagitan ng numero ng telepono - Maghanap para sa isang talaan sa pamamagitan ng user name (dapat magbalik ng isang sheet ng mga talaan, ang mga pangalan ay maaaring maging pareho)
public List<BalanceEntity> findByNameCustomer(String nameCustomer){
    return balanceRepository.findAllByNameCustomer(nameCustomer);
}
- Pagdaragdag ng record sa database - Pag-alis ng record mula sa database sa pamamagitan ng id - Paraan ng negosyo: Top up ang balanse ng telepono - ang paraan ay dapat kumuha ng numero ng telepono, isang halaga (Integer type) at dagdagan ang balanse ng kaukulang numero ayon sa tinukoy halaga.
public void addingMoneyToBalance(Integer phoneNumber, Integer sum) {
    BalanceDto byPhoneNumber = findByPhoneNumber(phoneNumber);
    byPhoneNumber.setBalance(byPhoneNumber.getBalance() + sum);
    save(byPhoneNumber);//метод save() – добавление, реализован в сервисе
}
Huwag kalimutang ipatupad ang pagmamapa mula DTO hanggang Entity at pabalik. Ang Dto ay magiging katulad ng Entity: BalancePhoneDto Integer id; Integer na numeroTelepono; String nameCustomer; balanse ng integer; Lumikha ng layer ng DTO, lumikha ng klase ng InitiateUtils at punan ang database ng data: id 1, numeroTelepono 555000, balanse 100, customer Ivan id 2, numeroTelepono 444000, balanse 250, customer Marya id 3, numeroTelepono 111000, balanse 60, customer Ivan Gumawa isang rest controller, ngunit huwag magmadali upang punan ito ng mga pamamaraan. Kung susundin mo ang nakaraang artikulo, kung gayon ang pamamaraan para sa pagpapakita ng lahat ng mga rekord ay dapat na naging ganito (inirerekumenda ko na tingnan ngayon ang mga komento sa artikulo - partikular sa komento ni 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);
}
May isa pang paraan para magamit ang ResponseEntity, nang hindi gumagamit ng constructor. Patuloy naming gagamitin ito. Inilalantad ng ResponseEntity ang dalawang nested na interface ng tagabuo: HeadersBuilder at ang subinterface nito, BodyBuilder. Samakatuwid, maa-access natin ang kanilang mga kakayahan sa pamamagitan ng mga static na pamamaraan ng ResponseEntity. Maaari mong basahin ang higit pa sa artikulong ito . Ang natitirang mga pamamaraan ng controller ay maaaring ipatupad tulad ng sumusunod: 1) Pagpapakita ng isang tala sa pamamagitan ng id
//поиск записи по 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);
}
Sinusubukan namin sa Postman (Napag-usapan namin ito sa nakaraang artikulo, narito ang isa pang maliit na gabay sa programang ito ). Inilunsad namin, piliin ang uri ng kahilingan na GET, isulat sa linya ng URL: http://localhost:8080/find-number-phoneById/1 – ipinasa namin ang parameter ng id sa linya ng query, sa output makakatanggap kami ng entry na may id na katumbas ng 1. Pagkatapos magdagdag ng bagong code, huwag kalimutang i-restart ang proyekto😇 2) Ipakita ang mga tala sa pamamagitan ng pangalan
//поиск записи по имени пользователя
@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);
}
Создадим новый request, выбираем тип requestа GET, в строке URL пишем: http://localhost:8080/ find-number-phoneByName/Ivan – параметр name мы передали в строке requestа, на выводе получим лист записей с nameCustomer равным Ivan. Возможно на выводе вы получите что то похожее на это: %D1%8D%D1%82%D0%BE%20%D0%BD%D0%B5%20%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0 Это не ошибка — это особенности codeировки requestов, почитайте об этом. А вот тут написано How настроить Postman что бы этого не происходило. 3) Вывод всех записей:
//поиск всех записей
@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);
}
Создаем новый request, выбираем тип requestа GET, в строке URL пишем: http://localhost:8080/findAll – параметров тут ни Howих не передаем. 4) Добавления новой записи:
//добавление новой записи
@PostMapping(value = "/entry")
public ResponseEntity<?> entryNumber(@RequestBody BalanceDto dto){
    balanceService.save(dto);
    return ResponseEntity.ok().body(HttpStatus.CREATED);
}
Создаем новый request, выбираем тип requestа POST, в строке URL пишем: http://localhost:8080/entry. В этом requestе нам необходимо передать an object в формате JSON. В окне requestа переходим на вкладку Body, устанавливаем флаг на raw, рядом с Text нажимаем стрелочку и выбираем JSON. В окно копируем следующий JSON:
{
        "numberPhone": 767676,
        "nameCustomer": "Sasha",
        "balance": 100
}
Нажимаем выполнить request в ответе приходит статус CREATED. Теперь сделайте еще раз request на findAll и убедитесь, что появилась новая запись. 5) Удаления записи по id
//удаление записи по id
@DeleteMapping(value = "/delete-phoneById/{id}")
public ResponseEntity<?> delete(@PathVariable Integer id) {
    balanceService.delete(id);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Создаем новый request, выбираем тип requestа DELETE, в строке URL пишем: http://localhost:8080/delete-phoneById/4 – параметр id мы передали в строке requestа, На выводе получим статус OK. Теперь сделайте еще раз request на findAll и убедитесь, что Саша пропал. 6) Изменение номера по id
//изменение номера телефона по 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);
}
Создаем новый request, выбираем тип requestа PUT, в строке URL пишем: http://localhost:8080/change . В этом requestе несколько параметров, и мы их How видите не передаем в строке requestа How раньше. Для параметров в методе используется annotation @RequestParam. What бы передать параметры через Postman, необходимо в окне requestа перейти на вкладку Params, в колонке Key указываем наименование параметра (id), в колонке Value указываем meaning (1). Со вторым параметром поступаем так же, Key = phoneNumber, Value = 888000. Обратите внимание на строку requestа, Postman изменил ее что бы передать параметры правильно. На выводе получим статус OK. Теперь сделайте еще раз request на findAll и убедитесь, что номер телефона у первой записи изменился. 7) Пополнение баланса телефона
@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);
}
Создаем новый request, выбираем тип requestа PUT, в строке URL пишем: http://localhost:8080/add. Значение phoneNumber ставим равным 888000, sum равным 130. На выводе получим статус OK. Теперь сделайте еще раз request на findAll и убедитесь, что баланс у первой записи изменился. 8) PUT через тело requestа - так делать предпочтительнее, что бы не открывать передаваемые данные
@PutMapping(value = "/add")
public ResponseEntity<?> addingMoney(@RequestBody BalanceDto dto){
    balanceService.addingMoneyToBalance(dto.getPhoneNumber, dto.getSum);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Передаем JSON
{
        "numberPhone": 888000,
       //  "nameCustomer" можно вообще не указывать
        "balance": 130
}
Наконец-то переходим к Cookie. What такое Cookie. Просто говоря: Cookie хранят данные, полученные один раз браузером от applications, которые потом можно многократно использовать на сайте. Нужно знать две базовые вещи: How записать и How прочитать Cookie. Как записать: Весь Spring Web MVC реализован поверх Servlet API, которое построено вокруг двух an objectов — request от клиента оборачивается в HttpSerlvetRequest, а ответ формируется из заполненного вашим codeом HttpServletResponse. Имея доступ к этим an objectм, вы получаете полный контроль над всей HTTP сессией. Spring web позволяет обращаться к этим an objectм напрямую. Обычно Cookie, создадим в контроллере метод
//записать куки
 @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ой вариант лучше
 }
Сделаем GET request в Postman по addressу: http://localhost:8080/set-cookie на выходе получим OK. Над океем найдите надпись Cookie(1), перейдя по ней вы увидите те Cookie что мы передали. Name: data , meaning: Come_to_the_dark_side. Информация по основным возможностям класса Cookie в java. Как прочитать: Прочитать еще легче
//прочитать куки
@GetMapping(value = "/get-cookie")
public ResponseEntity<?> readCookie(@CookieValue(value = "data") String data) {
    return ResponseEntity.ok().body(data);
}
В @ CookieValue указываем Name Cookie, meaning которых будем считывать, и выводим прочитанное meaning в ответе. Come_to_the_dark_side Теперь настал звездный час Header (заголовков, не смотрите что статья про PHP), почитать довольно полезно ): Для начала посмотрим, How можно прочитать заголовки:
//прочитать заголовки
@GetMapping(value = "/get-headers")
public ResponseEntity<?> getHeaders(@RequestHeader Map<String, String> headers){//представляет заголовки ввиде мапы,
    //где ключ это наименование заголовка, а meaning мапы - это meaning заголовка
    return ResponseEntity.ok(headers);
}
Основную работу берет на себя @RequestHeader Map<String, String>, он представляет заголовки в виде мапы, где ключ это наименование заголовка, а meaning мапы - это meaning заголовка. Тестировать этот метод интересней с помощью браузера, открываем браузер, набираем в поисковой строке http://localhost:8080/get-headers, на выходе получаем обширный список заголовков. Погуглите про каждый заголовок, чтобы понять зачем они нужны. Википедия тоже предлагает список заголовков. «Если кто-то что-то прочитал, значит это кто-то записал» - старинная программистская поговорка. Давайте запишем заголовок
//записать заголовок
@GetMapping(value = "/set-header")
public ResponseEntity<?> setHeader(){
    return ResponseEntity.ok().header("name-header","value-header").body(HttpStatus.OK);
}
Здесь мы использовали специальный метод header класса ResponseEntity. Где "name-header" – это наименование заголовка, а "value-header" – это meaning заголовка. Есть и другие варианты работы с заголовками
//еще варианты работы с заголовками
@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);
}
Здесь используется уже другой метод класса ResponseEntity, который принимает meaning типа MultiValueMap<String, String>. Проверить How это работает, тоже информативнее будет в браузере. Переходим по addressу http://localhost:8080/set-headers, получаем ответ, что статус ОК. Если вы молодец и используете гугл хром, то жмите сочетание клавиш Ctrl + Shift + I и переходите в «Инструменты разработчика», далее ищите в верхней панели вкладку Network, нажав ее ищите запись: set-headers (если ее нет обновите page) нажимаем на нее и в открывшемся окне выбираем вкладку Headers и в ResponseHeaders видим наши заголовки. Для знакомства с заголовками, пока достаточно. А теперь прочтите: Изучаем ResponseEntity<!--?--> и избавляемся от него в контроллерах Spring На этом разрешите откланяться 🤓, до новых встреч…
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION