JavaRush /Blog Java /Random-ES /La primavera no da miedo. Cookies y encabezados
Павел
Nivel 11

La primavera no da miedo. Cookies y encabezados

Publicado en el grupo Random-ES
CONTENIDOS DEL CICLO DE ARTÍCULOS ¡La repetición es la madre del aprendizaje! Por lo tanto, basándonos en artículos anteriores, creemos un nuevo proyecto web spring-boot: MobilePhonePayment Connect h2, Lombok. Cree una capa de entidad: BalancePhoneEntity Integer id; Número enteroTeléfono; Nombre de cadenaCliente; Saldo entero; Cree una capa de servicios con métodos: - Buscar todos los registros en la base de datos - Buscar un registro por identificación - Buscar un registro por número de teléfono - Buscar un registro por nombre de usuario (debe devolver una hoja de registros, los nombres pueden ser el mismo)
public List<BalanceEntity> findByNameCustomer(String nameCustomer){
    return balanceRepository.findAllByNameCustomer(nameCustomer);
}
- Agregar un registro a la base de datos - Eliminar un registro de la base de datos por identificación - Método comercial: recargar el saldo del teléfono: el método debe tomar un número de teléfono, una cantidad (tipo entero) y aumentar el saldo del número correspondiente en el especificado cantidad.
public void addingMoneyToBalance(Integer phoneNumber, Integer sum) {
    BalanceDto byPhoneNumber = findByPhoneNumber(phoneNumber);
    byPhoneNumber.setBalance(byPhoneNumber.getBalance() + sum);
    save(byPhoneNumber);//метод save() – добавление, реализован в сервисе
}
No olvide implementar el mapeo de DTO a Entidad y viceversa. Dto será similar a Entidad: BalancePhoneDto Integer id; Número enteroTeléfono; Nombre de cadenaCliente; Saldo entero; Cree una capa DTO, cree la clase InitiateUtils y complete la base de datos con datos: id 1, número de teléfono 555000, saldo 100, cliente Ivan id 2, número de teléfono 444000, saldo 250, cliente Marya id 3, número de teléfono 111000, saldo 60, cliente Ivan Create un controlador de descanso, pero no se apresure a llenarlo con métodos. Si sigue el artículo anterior, entonces el método para mostrar todos los registros debería haber resultado algo como esto (ahora recomiendo mirar los comentarios del artículo, específicamente el comentario de Vasily Babin):
//поиск записи по id - старая versión
@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);
}
Hay otra forma de utilizar ResponseEntity, sin utilizar un constructor. Seguiremos usándolo. ResponseEntity expone dos interfaces de generador anidadas: HeadersBuilder y su subinterfaz, BodyBuilder. Por lo tanto, podemos acceder a sus capacidades a través de los métodos estáticos de ResponseEntity. Puedes leer más en este artículo . Los métodos del controlador de descanso se pueden implementar de la siguiente manera: 1) Mostrar un registro por identificación
//поиск записи по 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);
}
Probamos en Postman (hablamos de ello en el artículo anterior, aquí tenéis otra pequeña guía sobre este programa ). Lanzamos, seleccionamos el tipo de solicitud GET, escribimos en la línea URL: http://localhost:8080/find-number-phoneById/1 – pasamos el parámetro id en la línea de consulta, en la salida recibiremos una entrada con id igual a 1. Después de agregar el nuevo código, no olvide reiniciar el proyecto😇 2) Mostrar registros por nombre
//поиск записи по имени пользователя
@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);
}
Creemos una nueva solicitud, seleccionemos el tipo de solicitud GET, escribamos en la línea URL: http://localhost:8080/ find-number-phoneByName/Ivan - pasamos el parámetro de nombre en la línea de consulta y en el resultado obtenga una lista de registros con nombreCliente igual a Iván. Quizás en el resultado obtendrá algo similar a esto: %D1%8D%D1%82%D0%BE%20%D0%BD%D0%B5%20%D0%BE%D1%88%D0%B8%D0 % B1%D0%BA%D0%B0 Esto no es un error: estas son características de la codificación de solicitudes, lea sobre esto . Y aquí está escrito cómo configurar Postman para que esto no suceda. 3) Salida de todos los registros:
//поиск всех записей
@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);
}
Creamos una nueva solicitud, seleccionamos el tipo de solicitud GET, escribimos en la línea URL: http://localhost:8080/findAll; no pasamos ningún parámetro aquí. 4) Agregar una nueva entrada:
//добавление новой записи
@PostMapping(value = "/entry")
public ResponseEntity<?> entryNumber(@RequestBody BalanceDto dto){
    balanceService.save(dto);
    return ResponseEntity.ok().body(HttpStatus.CREATED);
}
Creamos una nueva solicitud, seleccionamos el tipo de solicitud POST y escribimos en la línea URL: http://localhost:8080/entry. En esta solicitud necesitamos pasar un objeto en formato JSON. En la ventana de solicitud, vaya a la pestaña Cuerpo, establezca la bandera en sin formato, haga clic en la flecha junto a Texto y seleccione JSON. Copie el siguiente JSON en la ventana:
{
        "numberPhone": 767676,
        "nameCustomer": "Sasha",
        "balance": 100
}
Cuando hacemos clic en ejecutar la solicitud, el estado de la respuesta es CREADO. Ahora consulta findAll nuevamente y asegúrate de que aparezca una nueva entrada. 5) Eliminar una entrada por id.
//удаление записи по id
@DeleteMapping(value = "/delete-phoneById/{id}")
public ResponseEntity<?> delete(@PathVariable Integer id) {
    balanceService.delete(id);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Creamos una nueva solicitud, seleccionamos el tipo de solicitud ELIMINAR, escribimos en la línea URL: http://localhost:8080/delete-phoneById/4 – pasamos el parámetro id en la línea de solicitud, obtenemos el estado OK en la salida . Ahora haga otra solicitud para encontrarTodo y asegúrese de que Sasha no esté. 6) Cambiar el número por id.
//изменение номера телефона по id
@PutMapping(value = "/change")
public ResponseEntity<?> changeNumberPhone(
//можно добавлять несколько параметров в pedido
        @RequestParam(value = "id") Integer id, //добавo один параметр
        @RequestParam(value = "phoneNumber") Integer phoneNumber) //добавo второй параметр
 {
    BalanceDto byId = balanceService.findById(id);
    byId.setNumberPhone(phoneNumber);
    balanceService.save(byId);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Creamos una nueva solicitud, seleccionamos el tipo de solicitud PUT y escribimos en la línea URL: http://localhost:8080/change. Hay varios parámetros en esta solicitud y, como puede ver, no los pasamos en la línea de consulta como antes. La anotación @RequestParam se utiliza para los parámetros de un método. Para transferir parámetros a través de Postman, debe ir a la pestaña Parámetros en la ventana de solicitud, indicar el nombre del parámetro (id) en la columna Clave e indicar el valor (1) en la columna Valor. Hacemos lo mismo con el segundo parámetro, Key = phoneNumber, Value = 888000. Presta atención a la cadena de consulta, Postman la cambió para pasar los parámetros correctamente. La salida mostrará el estado OK. Ahora consulte findAll nuevamente y asegúrese de que el número de teléfono de la primera entrada haya cambiado. 7) Recarga el saldo de tu teléfono
@PutMapping(value = "/add")
public ResponseEntity<?> addingMoney(
        //можно добавлять несколько параемров в pedido
        @RequestParam(value = "phoneNumber") Integer phoneNumber,//добавo один параметр
        @RequestParam(value = "sum") Integer sum) //добавo второй параметр
{
    balanceService.addingMoneyToBalance(phoneNumber, sum);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Creamos una nueva solicitud, seleccionamos el tipo de solicitud PUT y escribimos en la línea URL: http://localhost:8080/add. Establecemos el valor de número de teléfono en 888000, la suma es 130. La salida mostrará el estado OK. Ahora ejecute la solicitud findAll nuevamente y asegúrese de que el saldo del primer registro haya cambiado. 8) PONER a través del cuerpo de la solicitud; es preferible hacer esto para no abrir los datos transmitidos
@PutMapping(value = "/add")
public ResponseEntity<?> addingMoney(@RequestBody BalanceDto dto){
    balanceService.addingMoneyToBalance(dto.getPhoneNumber, dto.getSum);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Enviamos JSON
{
        "numberPhone": 888000,
       //  "nameCustomer" можно вообще не указывать
        "balance": 130
}
Finalmente pasamos a Cookie. ¿ Qué es la galleta ? En pocas palabras: las cookies almacenan datos recibidos una vez por el navegador desde una aplicación, que luego pueden usarse repetidamente en el sitio. Necesitas saber dos cosas básicas: cómo escribir y cómo leer una Cookie. Cómo escribir: todo Spring Web MVC se implementa sobre la API de Servlet, que se basa en dos objetos: la solicitud del cliente se incluye en un HttpSerlvetRequest y la respuesta se genera a partir de HttpServletResponse completado con su código. Tener acceso a estos objetos le brinda control total sobre toda la sesión HTTP. Spring web le permite acceder a estos objetos directamente. Generalmente Cookie, creemos un método en el controlador.
//записать куки
 @GetMapping(value = "/set-cookie")
public ResponseEntity<?> setCookie(HttpServletResponse response) throws IOException {
     Cookie cookie = new Cookie("data", "Come_to_the_dark_side");//создаем un objeto Cookie,
     //в конструкторе указываем значения для name и value
     cookie.setPath("/");//устанавливаем путь
     cookie.setMaxAge(86400);//здесь устанавливается время жизни куки
     response.addCookie(cookie);//добавляем Cookie в pedido
     response.setContentType("text/plain");//устанавливаем контекст
     return ResponseEntity.ok().body(HttpStatus.OK);//получилось Cómo бы два раза статус ответа установo, выбирайте Cómoой вариант лучше
 }
Hagamos una solicitud GET en Postman en la dirección: http://localhost:8080/set-cookie y el resultado será correcto. Encima de la ventana, busque la inscripción Cookie(1), al hacer clic en ella verá las Cookies que le enviamos. Nombre: datos, valor: Come_to_the_dark_side. Información sobre las principales características de la clase Cookie en java. Cómo leer: aún más fácil de leer
//прочитать куки
@GetMapping(value = "/get-cookie")
public ResponseEntity<?> readCookie(@CookieValue(value = "data") String data) {
    return ResponseEntity.ok().body(data);
}
En @CookieValue indicamos el nombre de la Cookie cuyo valor leeremos, y mostramos el valor leído en la respuesta. Come_to_the_dark_side Ahora ha llegado el mejor momento Encabezado ( encabezados , no mires el artículo sobre PHP, es bastante útil leerlo): Primero, veamos cómo puedes leer los encabezados:
//прочитать заголовки
@GetMapping(value = "/get-headers")
public ResponseEntity<?> getHeaders(@RequestHeader Map<String, String> headers){//представляет заголовки ввиде мапы,
    //где ключ это наименование заголовка, а significado мапы - это significado заголовка
    return ResponseEntity.ok(headers);
}
El trabajo principal lo realiza @RequestHeader Map<String, String> , representa encabezados en forma de mapa, donde la clave es el nombre del encabezado y el valor del mapa es el valor del encabezado. Es más interesante probar este método usando un navegador, abrir el navegador, escribir http://localhost:8080/get-headers en la barra de búsqueda y, como resultado, obtenemos una lista extensa de encabezados. Busque en Google cada título para comprender por qué son necesarios. Wikipedia también ofrece una lista de títulos. "Si alguien lee algo, entonces alguien lo escribe", es un viejo dicho de programación. Anotemos el título.
//записать заголовок
@GetMapping(value = "/set-header")
public ResponseEntity<?> setHeader(){
    return ResponseEntity.ok().header("name-header","value-header").body(HttpStatus.OK);
}
Aquí hemos utilizado un método de encabezado especial de la clase ResponseEntity . Donde "nombre-encabezado" es el nombre del encabezado y "valor-encabezado" es el valor del encabezado. Hay otras opciones para trabajar con encabezados.
//еще варианты работы с заголовками
@GetMapping(value = "/set-headers")
public ResponseEntity<?> setHeaders() {
    HttpHeaders httpHeaders = new HttpHeaders();//создаем un objeto
    //который имплементирует мапу MultiValueMap<String, String>
    //наполняем ее парами ключ-significado
    //можно наполнить своими заголовками через метод add
    httpHeaders.add("customer-header", "value-header1");
    //HttpHeaders так же предлагает большой выбор стандартных заголовков
    //Посмотрите на них набрав в IDEA HttpHeaders.
    httpHeaders.add(HttpHeaders.FROM, "russia");
    //можно изменить существующий заголовок, вызвав для него сет-метод
    httpHeaders.setDate(0);
    //o получить significado конкретного заголовка
    Long date = httpHeaders.getDate();
    System.out.println(date);
    return ResponseEntity
            .ok().headers(httpHeaders)//здесь метод принимающий MultiValueMap<String, String>
            .body(HttpStatus.OK);
}
Aquí usamos otro método de la clase ResponseEntity, que toma un valor de tipo MultiValueMap<String, String> . También será más informativo comprobar cómo funciona en el navegador. Nos dirigimos a la dirección http://localhost:8080/set-headers, recibimos respuesta de que el estado es OK. Si eres genial y usas Google Chrome, entonces presiona la combinación de teclas Ctrl + Shift + I y ve a “Herramientas de desarrollador”, luego busca la pestaña Red en el panel superior , al hacer clic en ella busca la entrada: set-headers ( si no está allí, actualice la página) haga clic en él y en la ventana que se abre, seleccione la pestaña Encabezados y en ResponseHeaders vemos nuestros encabezados. Para familiarizarse con los titulares, esto es suficiente por ahora. Ahora lea: Estudiar ResponseEntity<!--?--> y deshacerse de él en los controladores Spring Con eso, déjame despedirme 🤓, nos vemos de nuevo...
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION