JavaRush /Blogue Java /Random-PT /A primavera não é assustadora. Cookies e cabeçalhos
Павел
Nível 11

A primavera não é assustadora. Cookies e cabeçalhos

Publicado no grupo Random-PT
CONTEÚDO DO CICLO DE ARTIGOS A repetição é a mãe da aprendizagem! Portanto, com base em artigos anteriores, vamos criar um novo projeto web spring-boot: MobilePhonePayment Connect h2, Lombok. Crie uma camada de entidade: BalancePhoneEntity Integer id; Número inteiroTelefone; String nomeCliente; Saldo inteiro; Crie uma camada de serviços com métodos: - Pesquisar todos os registros no banco de dados - Pesquisar um registro por id - Pesquisar um registro por número de telefone - Pesquisar um registro por nome de usuário (deve retornar uma planilha de registros, os nomes podem ser o mesmo)
public List<BalanceEntity> findByNameCustomer(String nameCustomer){
    return balanceRepository.findAllByNameCustomer(nameCustomer);
}
- Adicionar um registro ao banco de dados - Remover um registro do banco de dados por id - Método de negócio: Recarregar saldo telefônico - o método deve pegar um número de telefone, um valor (tipo inteiro) e aumentar o saldo do número correspondente pelo especificado quantia.
public void addingMoneyToBalance(Integer phoneNumber, Integer sum) {
    BalanceDto byPhoneNumber = findByPhoneNumber(phoneNumber);
    byPhoneNumber.setBalance(byPhoneNumber.getBalance() + sum);
    save(byPhoneNumber);//метод save() – добавление, реализован в сервисе
}
Não se esqueça de implementar o mapeamento de DTO para Entidade e vice-versa. Dto será semelhante a Entity: BalancePhoneDto Integer id; Número inteiroTelefone; String nomeCliente; Saldo inteiro; Crie uma camada DTO, crie a classe InitiateUtils e preencha o banco de dados com os dados: id 1, númeroTelefone 555000, saldo 100, cliente Ivan id 2, númeroTelefone 444000, saldo 250, cliente Marya id 3, númeroTelefone 111000, saldo 60, cliente Ivan Criar um controlador de descanso, mas não se apresse em preenchê-lo com métodos. Se você seguir o artigo anterior, o método para exibir todos os registros deveria ser algo assim (recomendo agora olhar nos comentários do artigo - especificamente no comentário 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);
}
Existe outra maneira de usar ResponseEntity, sem usar um construtor. Continuaremos a usá-lo. ResponseEntity expõe duas interfaces de construtor aninhadas: HeadersBuilder e sua subinterface, BodyBuilder. Portanto, podemos acessar seus recursos através dos métodos estáticos do ResponseEntity. Você pode ler mais neste artigo . Os métodos restantes do controlador podem ser implementados da seguinte forma: 1) Exibindo um registro por 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);
}
Testamos no Postman (falamos sobre isso no artigo anterior, aqui está outro pequeno guia sobre este programa ). Lançamos, selecionamos o tipo de solicitação GET, escrevemos na linha URL: http://localhost:8080/find-number-phoneById/1 – passamos o parâmetro id na linha de consulta, na saída receberemos uma entrada com id igual a 1. Após adicionar o novo código, não esqueça de reiniciar o projeto😇 2) Exibir registros por nome
//поиск записи по имени пользователя
@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);
}
Vamos criar uma nova requisição, selecionar o tipo de requisição GET, escrever na linha da URL: http://localhost:8080/ find-number-phoneByName/Ivan - passamos o parâmetro name na linha de consulta, e na saída iremos obtenha uma lista de registros com nomeCliente igual a Ivan. Talvez na saída você obtenha algo semelhante a isto: %D1%8D%D1%82%D0%BE%20%D0%BD%D0%B5%20%D0%BE%D1%88%D0%B8%D0 % B1%D0%BA%D0%B0 Isso não é um erro - são recursos de codificação de solicitação, leia sobre isso . E aqui está escrito como configurar o Postman para que isso não aconteça. 3) Saída de todos os 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);
}
Criamos uma nova solicitação, selecionamos o tipo de solicitação GET, escrevemos na linha da URL: http://localhost:8080/findAll - não passamos nenhum parâmetro aqui. 4) Adicionando uma nova entrada:
//добавление новой записи
@PostMapping(value = "/entry")
public ResponseEntity<?> entryNumber(@RequestBody BalanceDto dto){
    balanceService.save(dto);
    return ResponseEntity.ok().body(HttpStatus.CREATED);
}
Criamos uma nova solicitação, selecionamos o tipo de solicitação POST e escrevemos na linha da URL: http://localhost:8080/entry. Nesta requisição precisamos passar um objeto no formato JSON. Na janela de solicitação, vá para a guia Corpo, defina o sinalizador como bruto, clique na seta ao lado de Texto e selecione JSON. Copie o seguinte JSON na janela:
{
        "numberPhone": 767676,
        "nameCustomer": "Sasha",
        "balance": 100
}
Quando clicamos em executar a solicitação, o status da resposta é CRIADO. Agora consulte findAll novamente e certifique-se de que uma nova entrada apareça. 5) Excluindo uma entrada por id
//удаление записи по id
@DeleteMapping(value = "/delete-phoneById/{id}")
public ResponseEntity<?> delete(@PathVariable Integer id) {
    balanceService.delete(id);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Criamos uma nova solicitação, selecionamos o tipo de solicitação DELETE, escrevemos na linha da URL: http://localhost:8080/delete-phoneById/4 – passamos o parâmetro id na linha de solicitação, obtemos o status OK na saída . Agora faça outra solicitação para findAll e certifique-se de que Sasha esteja faltando. 6) Alterando o número por 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);
}
Criamos uma nova solicitação, selecionamos o tipo de solicitação PUT e escrevemos na linha da URL: http://localhost:8080/change. Existem vários parâmetros nesta requisição, e como você pode ver, não os passamos na linha de consulta como antes. A anotação @RequestParam é usada para parâmetros em um método. Para transferir parâmetros via Postman, você precisa ir até a aba Params na janela de solicitação, indicar o nome do parâmetro (id) na coluna Chave e indicar o valor (1) na coluna Valor. Fazemos o mesmo com o segundo parâmetro, Key = phoneNumber, Value = 888000. Preste atenção na string de consulta, o Postman a alterou para passar os parâmetros corretamente. A saída mostrará o status OK. Agora consulte findAll novamente e certifique-se de que o número de telefone da primeira entrada foi alterado. 7) Recarregue o saldo do seu telefone
@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);
}
Criamos uma nova solicitação, selecionamos o tipo de solicitação PUT e escrevemos na linha da URL: http://localhost:8080/add. Definimos o valor phoneNumber como 888000 e somamos 130. A saída mostrará o status OK. Agora execute a solicitação findAll novamente e certifique-se de que o saldo do primeiro registro foi alterado. 8) PUT através do corpo da solicitação - é preferível fazer isso para não abrir os dados 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 passamos para o Cookie. O que é biscoito ? Simplificando: os cookies armazenam dados recebidos uma vez pelo navegador de um aplicativo, que podem então ser usados ​​repetidamente no site. Você precisa saber duas coisas básicas: como escrever e como ler um Cookie. Como escrever: Todo o Spring Web MVC é implementado sobre a API Servlet, que é construída em torno de dois objetos - a solicitação do cliente é envolvida em um HttpSerlvetRequest e a resposta é gerada a partir do HttpServletResponse preenchido com seu código. Ao ter acesso a esses objetos, você tem controle total sobre toda a sessão HTTP. Spring web permite que você acesse esses objetos diretamente. Normalmente Cookie, vamos criar um método no controlador
//записать куки
 @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ой вариант лучше
 }
Vamos fazer uma solicitação GET no Postman no endereço: http://localhost:8080/set-cookie e a saída será OK. Acima da janela, encontre a inscrição Cookie(1), clicando nela você verá os Cookies que enviamos. Nome: dados, valor: Come_to_the_dark_side. Informações sobre as principais funcionalidades da classe Cookie em java. Como ler: ainda mais fácil de ler
//прочитать куки
@GetMapping(value = "/get-cookie")
public ResponseEntity<?> readCookie(@CookieValue(value = "data") String data) {
    return ResponseEntity.ok().body(data);
}
Em @CookieValue indicamos o nome do Cookie cujo valor iremos ler, e exibimos o valor lido na resposta. Come_to_the_dark_side Agora chegou a melhor hora Header ( headers , não olhe o artigo sobre PHP, é bastante útil de ler): Primeiro, vamos ver como você pode ler os cabeçalhos:
//прочитать заголовки
@GetMapping(value = "/get-headers")
public ResponseEntity<?> getHeaders(@RequestHeader Map<String, String> headers){//представляет заголовки ввиде мапы,
    //где ключ это наименование заголовка, а meaning мапы - это meaning заголовка
    return ResponseEntity.ok(headers);
}
O trabalho principal é feito por @RequestHeader Map<String, String> , ele representa os cabeçalhos na forma de um mapa, onde a chave é o nome do cabeçalho e o valor do mapa é o valor do cabeçalho. É mais interessante testar este método usando um navegador, abra o navegador, digite http://localhost:8080/get-headers na barra de pesquisa e como resultado obtemos uma extensa lista de cabeçalhos. Pesquise cada título no Google para entender por que eles são necessários. A Wikipedia também oferece uma lista de títulos. “Se alguém leu alguma coisa, então alguém escreveu” é um antigo ditado de programação. Vamos anotar o título
//записать заголовок
@GetMapping(value = "/set-header")
public ResponseEntity<?> setHeader(){
    return ResponseEntity.ok().header("name-header","value-header").body(HttpStatus.OK);
}
Aqui usamos um método de cabeçalho especial da classe ResponseEntity . Onde "name-header" é o nome do cabeçalho e "value-header" é o valor do cabeçalho. Existem outras opções para trabalhar com cabeçalhos
//еще варианты работы с заголовками
@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);
}
Aqui usamos outro método da classe ResponseEntity, que assume um valor do tipo MultiValueMap<String, String> . Também será mais informativo verificar como funciona no navegador. Vamos ao endereço http://localhost:8080/set-headers, recebemos uma resposta informando que o status está OK. Se você é ótimo e usa o Google Chrome, pressione a combinação de teclas Ctrl + Shift + I e vá em “Ferramentas do desenvolvedor”, procure a guia Rede no painel superior , clicando nela procure a entrada: set-headers ( se não estiver lá, atualize a página) clique ali e na janela que se abre, selecione a aba Headers e em ResponseHeaders vemos nossos cabeçalhos. Para conhecer as manchetes, por enquanto basta. Agora leia: Estudando ResponseEntity<!--?--> e se livrando dele nos controladores Spring Com isso, deixe-me me despedir 🤓, nos vemos novamente...
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION