Return to Video

vimeo.com/.../931125947

  • 0:08 - 0:12
    Bom, agora chegou a hora de criar
    o ponto de entrada para a nossa aplicação.
  • 0:12 - 0:13
    Então é necessário
    que o front-end,
  • 0:13 - 0:17
    quando queira requisitar algum dado,
    ele tenha um ponto de entrada.
  • 0:17 - 0:20
    Então nós vamos precisar criar
    agora os controladores.
  • 0:20 - 0:22
    Então, o que é o controller?
  • 0:22 - 0:26
    O controller é o cara que vai receber
    a requisição que está vindo de um cliente,
  • 0:26 - 0:30
    que pode ser um front-end,
    pode ser até uma outra aplicação,
  • 0:30 - 0:32
    quando nós falamos
    de microsserviço, por exemplo.
  • 0:32 - 0:35
    Nós já temos aqui o serviço, tá?
  • 0:35 - 0:37
    Então, essa classe de serviço
    é aquela que é responsável
  • 0:37 - 0:41
    por consumir de fato
    ali o nosso repositório.
  • 0:41 - 0:43
    Só que agora nós vamos
    criar o nosso controller.
  • 0:43 - 0:48
    Então aqui no pacote controller
    nós vamos criar aqui uma nova classe Java.
  • 0:48 - 0:52
    Nós vamos chamar essa classe
    de "ContatoController",
  • 0:52 - 0:57
    lembrando sempre de usar esse sufixo para nós
    podermos lembrar do que se trata a classe.
  • 0:57 - 0:59
    Vamos pressionar Enter.
  • 0:59 - 1:00
    E legal, então está aqui.
  • 1:00 - 1:02
    A primeira coisa que nós vamos fazer.
  • 1:02 - 1:05
    Lembra quando nós criamos
    o nosso "HelloController"?
  • 1:05 - 1:07
    Nós fizemos essas
    duas anotações aqui,
  • 1:07 - 1:11
    indicando que nós estamos trabalhando
    com o controlador do tipo REST
  • 1:11 - 1:15
    e nós também temos aqui
    o mapeamento da requisição.
  • 1:15 - 1:19
    Então nós vamos fazer a mesma coisa
    aqui no nosso controlador de contato.
  • 1:19 - 1:23
    Então nós vamos chegar aqui
    e vamos marcar aqui o "@RestController",
  • 1:23 - 1:27
    e além disso, nós vamos colocar
    aqui também um @RequestMapping.
  • 1:27 - 1:30
    Como que nós vamos fazer
    para chegar nessa requisição aqui?
  • 1:30 - 1:34
    Então, inicialmente
    nós vamos colocar isso aqui ("/api").
  • 1:34 - 1:37
    Então qualquer requisição
    que venha para "/api",
  • 1:37 - 1:39
    esse controlador vai interceptar.
  • 1:39 - 1:43
    E claro, nós vamos ter
    agora nossos métodos internos
  • 1:43 - 1:46
    que vão dar complemento
    para esse endereço aqui.
  • 1:46 - 1:49
    Bom, lembra que quando eu vou fazer
    uma consulta para um endpoint,
  • 1:49 - 1:51
    eu preciso colocar o URL, tá?
  • 1:51 - 1:55
    Então nessa URL nós temos:
    o endereço do servidor,
  • 1:55 - 1:59
    por exemplo,
    "servidor.com.br".
  • 1:59 - 2:01
    E aí eu preciso do recurso
    que eu vou acessar.
  • 2:01 - 2:04
    Então eu posso fazer ali
    um "/api", por exemplo,
  • 2:04 - 2:06
    porque eu posso ter outras
    coisas dentro desse servidor.
  • 2:06 - 2:09
    Então nós usamos o "/api"
    para indicar que eu quero ir para uma API.
  • 2:09 - 2:11
    Então, a primeira coisa
    que nós vamos precisar aqui.
  • 2:11 - 2:14
    O controlador vai precisar
    do "ContatoService"
  • 2:14 - 2:18
    para poder fazer o consumo
    dos recursos lá do repositório.
  • 2:18 - 2:21
    Então nós vamos fazer agora
    uma injeção de dependência aqui.
  • 2:21 - 2:22
    Então nós vamos falar o seguinte:
  • 2:22 - 2:26
    "Olha, vou criar aqui um atributo privado
    que vai ser do tipo ContatoService,
  • 2:26 - 2:30
    que eu vou chamar
    de simplesmente service".
  • 2:30 - 2:33
    Só que assim,
    esse atributo precisa ser inicializado,
  • 2:33 - 2:35
    nós precisamos passar ele
    na forma de um objeto,
  • 2:35 - 2:40
    então o Spring Boot já oferece para nós
    aqui uma forma rápida de fazer isso.
  • 2:40 - 2:43
    Então nós vamos utilizar
    a anotação "@Autowired".
  • 2:43 - 2:45
    O que isso vai fazer?
  • 2:45 - 2:49
    Ele já vai passar para
    nós esse atributo já inicializado,
  • 2:49 - 2:51
    e aí nós vamos começar a criar nossos métodos.
  • 2:51 - 2:53
    Então, por exemplo,
    o nosso primeiro método
  • 2:53 - 2:56
    vai ser um método que vai
    retornar um contato,
  • 2:56 - 3:00
    e esse método vai ser responsável
    por gravar o nosso contato.
  • 3:00 - 3:03
    E se ele vai gravar, eu preciso dizer
    para ele o que ele vai gravar.
  • 3:03 - 3:05
    Então vou passar aqui o objeto.
  • 3:05 - 3:09
    Então nós temos um método público
    que retorna um objeto do tipo contato.
  • 3:09 - 3:12
    O nome desse método é gravar.
  • 3:12 - 3:17
    E para gravar nós vamos
    passar um contato para ele.
  • 3:17 - 3:19
    Aí nós vamos fazer o seguinte,
  • 3:19 - 3:23
    nós vamos retornar para quem chamar,
    esse endpoint chamado "gravar",
  • 3:23 - 3:28
    nós vamos retornar o nosso
    "service.gravar(contato)".
  • 3:28 - 3:30
    Então, só para nós darmos
    uma relembrada aqui.
  • 3:30 - 3:34
    Se nós formos lá no método
    gravar do service, o que ele faz?
  • 3:34 - 3:38
    Ele recebe um contato
    e aí ele utiliza o "contatoRepository"
  • 3:38 - 3:40
    para poder fazer a gravação desse contato.
  • 3:40 - 3:45
    Lembra que o repositório é uma interface
    que já implementa tudo o que nós precisamos.
  • 3:45 - 3:48
    Então ele já vai fazer isso
    para nós de forma automática,
  • 3:48 - 3:53
    sem nós termos que escrever código SQL,
    sem ter que fazer nenhum script SQL.
  • 3:53 - 3:58
    Só que aí é o seguinte,
    quando nós fizermos a chamada para o gravar,
  • 3:58 - 4:02
    como que o nosso servidor vai
    saber que ele tem que direcionar a chamada
  • 4:02 - 4:04
    para esse endpoint aqui?
  • 4:04 - 4:08
    Então nós vamos fazer uma anotação
    aqui que vai ser o "@PostMapping".
  • 4:08 - 4:12
    Então qualquer requisição
    vinda com o verbo post,
  • 4:12 - 4:17
    direcionado para ("/contatos"),
    vai ser direcionado para esse endpoint aqui.
  • 4:17 - 4:22
    Então vamos lá, vamos entender a mecânica
    de como isso aqui funciona.
  • 4:22 - 4:27
    O usuário vai fazer uma requisição
    para ("/api") e ("/contatos").
  • 4:27 - 4:31
    Como essa requisição é do tipo Post,
    então se a requisição vinda
  • 4:31 - 4:37
    para ("/api) ("/contatos") for do tipo Post,
    esse vai ser o método,
  • 4:37 - 4:40
    esse vai ser o endpoint
    que vai atender essa requisição.
  • 4:40 - 4:43
    Nós vamos ter também um outro método
    que vai ser o método para listar
  • 4:43 - 4:46
    todos os contatos do nosso banco de dados.
  • 4:46 - 4:52
    Então esse método vai retornar para nós
    uma lista de contato.
  • 4:52 - 4:58
    Nós podemos chamar esse
    método de "listarTodosOsContatos(){".
  • 4:58 - 5:01
    Nesse caso, nós não vamos precisar
    passar parâmetro nenhum.
  • 5:01 - 5:04
    Então nós queremos uma lista
    realmente com todos os contatos
  • 5:04 - 5:11
    e nós vamos simplesmente fazer:
    "return service.listarTodosOsContatos () ;"
  • 5:11 - 5:15
    E lógico, para poder chamar esse endpoint,
    eu preciso fazer uma requisição.
  • 5:15 - 5:17
    De que tipo vai ser essa requisição?
  • 5:17 - 5:20
    Ela vai ser uma requisição do tipo Get,
  • 5:20 - 5:22
    e vai ser uma requisição que vai
    estar mapeada para quem?
  • 5:22 - 5:24
    Para o ("/contatos").
  • 5:24 - 5:29
    Então da mesma forma,
    foi feita uma requisição para o nosso servidor
  • 5:29 - 5:32
    na URL ("/api") e ("/contatos").
  • 5:32 - 5:35
    Só que agora eu tenho dois ("/contatos").
  • 5:35 - 5:39
    Como que o servidor sabe
    qual dos dois endpoints
  • 5:39 - 5:41
    deve ser entregue essa requisição?
  • 5:41 - 5:43
    Pelo tipo do verbo.
  • 5:43 - 5:45
    Então por exemplo,
    se a requisição é do tipo Post,
  • 5:45 - 5:47
    ele vai entregar para esse endpoint.
  • 5:47 - 5:51
    Se a requisição é do tipo Get,
    ele vai entregar para esse endpoint aqui.
  • 5:51 - 5:57
    Claro que a assinatura do método,
    em conjunto com o tipo do verbo
  • 5:57 - 6:00
    que nós estamos utilizando aqui,
    vai fazer com que isso seja possível.
  • 6:00 - 6:02
    Então nós já temos
    o "@PostMapping", o "@GetMapping",
  • 6:02 - 6:07
    e nós podemos também fazer aqui
    um método para fazer a exclusão, por exemplo.
  • 6:07 - 6:10
    E aí, se nós dermos
    uma olhadinha no nosso service,
  • 6:10 - 6:13
    o método para fazer a exclusão é esse daqui.
  • 6:13 - 6:17
    Então nós temos aqui um método
    chamado excluir e o que ele precisa receber?
  • 6:17 - 6:22
    Ele precisa receber um id, o id do objeto
    que eu quero remover do banco de dados.
  • 6:22 - 6:27
    Então nós vamos retornar lá para o controller
    e nós vamos fazer aqui um "public".
  • 6:27 - 6:32
    No caso do excluir, nós vamos retornar
    um "void" e nós vamos chamar de "excluir".
  • 6:32 - 6:37
    Só que nesse caso, para nós podermos excluir,
    vai ter que ser passado para nós o ID.
  • 6:37 - 6:41
    Qual é o ID do objeto contato que eu quero
    excluir lá do banco de dados.
  • 6:41 - 6:49
    E aí nós vamos chamar o "service.excluir(id)",
    passando esse ID que foi fornecido para nós aqui.
  • 6:49 - 6:52
    Só que agora como que eu passo
    esse ID para a URL?
  • 6:52 - 6:54
    Então de novo, olha, nós vamos
    fazer que a anotação,
  • 6:54 - 6:57
    vai ser um "@GetMapping",
    porque eu quero obter algo,
  • 6:57 - 6:59
    quero pegar algo que está no servidor.
  • 6:59 - 7:03
    Aliás, desculpa, "@GetMapping" não,
    agora nós vamos usar aqui um Delete,
  • 7:03 - 7:06
    "@DeleteMapping" porque
    nós queremos excluir
  • 7:06 - 7:13
    e esse Delete nós precisamos também ter aqui
    uma URL para completar o ("/api") e ("/contatos").
  • 7:13 - 7:17
    Só que agora nós temos que fazer o seguinte:
    eu tenho que conseguir pegar o ID.
  • 7:17 - 7:21
    Então o ID que está sendo passado
    aqui no método Excluir,
  • 7:21 - 7:25
    tem que ser passado aqui para a URL,
    então nós vamos colocar aqui, olha:
  • 7:25 - 7:28
    um "/" e vamos supor que eu quero
    apagar o registro número oito,
  • 7:28 - 7:30
    então ficaria algo assim.
  • 7:30 - 7:35
    Então eu quero excluir
    o registro de contatos cujo ID seja oito.
  • 7:35 - 7:38
    Só que nós precisamos colocar aqui
    então um parâmetro, tá?
  • 7:38 - 7:41
    Então no lugar aqui do oito,
    o que nós vamos fazer?
  • 7:41 - 7:44
    nós vamos colocar isso
    daqui ("/contatos/{id}").
  • 7:44 - 7:47
    E aí nós precisamos dizer
    para o Spring Boot
  • 7:47 - 7:53
    que esse parâmetro tem que ser
    substituído pelo valor que está aqui.
  • 7:53 - 7:54
    Então o que nós vamos fazer?
  • 7:54 - 7:59
    Esse atributo nós vamos marcar
    aqui como "@PathVariable",
  • 7:59 - 8:04
    e aí nos estamos dizendo o seguinte:
    "Esse valor tem que ser passado
  • 8:04 - 8:07
    para a variável que tem o mesmo nome lá".
  • 8:07 - 8:10
    Então esse ID, o valor do ID
    que for passado aqui
  • 8:10 - 8:14
    na chamada desse método,
    vai substituir aqui.
  • 8:14 - 8:16
    daí é isso que vai tornar
    nossa requisição dinâmica.
  • 8:16 - 8:20
    Nós vamos poder apagar qualquer registro
    que nós queiramos com qualquer ID.
  • 8:20 - 8:23
    Outro recurso que nós
    podemos criar aqui também, outro endpoint,
  • 8:23 - 8:25
    é o endpoint para fazer a atualização.
  • 8:25 - 8:30
    Então nós vamos fazer aqui um "public",
    o atualizar também retorna um contato
  • 8:30 - 8:32
    para quem chamou o endpoint.
  • 8:32 - 8:36
    Nós vamos chamar esse endpoint
    de "atualizar" e se eu vou atualizar,
  • 8:36 - 8:38
    eu vou atualizar um contato.
  • 8:38 - 8:40
    Então também é preciso
    passar aqui um contato
  • 8:40 - 8:43
    para que nós possamos fazer
    a atualização dele.
  • 8:43 - 8:49
    Nós vamos de novo retornar aqui
    o nosso "service.atualizar"
  • 8:49 - 8:54
    e passar esse contato que é passado para nós
    na hora da chamada do endpoint.
  • 8:54 - 8:56
    E nós vamos também fazer uma anotação.
  • 8:56 - 8:59
    Então nós vamos anotar aqui
    com @PutMapping(""),
  • 8:59 - 9:04
    e ele vai direcionar para onde?
    @PutMapping("/contatos").
  • 9:04 - 9:11
    Então percebe que tanto o "atualizar",
    o "listarTodosOsContatos",
  • 9:11 - 9:15
    e mesmo o "gravar",
    percebe que eles vão para a mesma URL?
  • 9:15 - 9:22
    O que faz com que o Spring Boot
    consiga direcionar para o endpoint correto,
  • 9:22 - 9:28
    é além do nome da URL,
    o verbo HTTP que nós estamos utilizando.
  • 9:28 - 9:31
    Bom, mais uma coisinha,
    quando nós fazemos um Post
  • 9:31 - 9:36
    eu preciso passar o contato
    que vai ser gravado no banco de dados,
  • 9:36 - 9:41
    então nós precisamos dizer para o Spring Boot
    de onde ele vai pegar esse contato.
  • 9:41 - 9:47
    Então aqui no caso do Post, nós vamos
    colocar também a anotação "@RequestBody".
  • 9:47 - 9:50
    O que essa anotação
    "@Request Body" está fazendo?
  • 9:50 - 9:51
    Está dizendo para o Spring Boot:
  • 9:51 - 9:55
    "Olha Spring Boot, nós vamos fazer
    a gravação de um novo contato.
  • 9:55 - 10:00
    Esse contato está vindo numa
    requisição HTTP do tipo Post.
  • 10:00 - 10:05
    Você vai buscar por esse contato
    no corpo da requisição".
  • 10:05 - 10:09
    Quando nós fizermos uma requisição,
    imagina que você está do lado do cliente,
  • 10:09 - 10:11
    então você vai mandar uma
    requisição para o servidor,
  • 10:11 - 10:14
    você tem que mandar o
    contato que será gravado.
  • 10:14 - 10:17
    Como nós estamos fazendo
    uma requisição HTTP,
  • 10:17 - 10:20
    nós temos que mandar esse contato
    na forma de um texto,
  • 10:20 - 10:23
    e aí entra o formato JSON.
  • 10:23 - 10:29
    Então o cliente tem que construir
    o objeto no formato de texto,
  • 10:29 - 10:31
    só que padronizado em JSON.
  • 10:31 - 10:37
    Quando nós recebemos essa requisição,
    nós estamos dizendo para o Spring Boot
  • 10:37 - 10:41
    que ele deve pegar o objeto
    no corpo da requisição,
  • 10:41 - 10:44
    ou seja, ele vai olhar
    lá no body da requisição
  • 10:44 - 10:47
    e vai extrair o JSON que está lá dentro.
  • 10:47 - 10:49
    E aí nós vamos fazer a conversão.
  • 10:49 - 10:54
    O Spring Boot vai converter esse objeto JSON
    num objeto contato de fato
  • 10:54 - 10:58
    para nós podermos manipular
    aqui do lado do Java.
  • 10:58 - 11:01
    Então nós já temos aqui
    o CRUD básico que é:
  • 11:01 - 11:07
    fazer o cadastro, fazer a leitura,
    fazer a exclusão e fazer a atualização.
  • 11:07 - 11:12
    Agora nós temos também lá no nosso
    repositório, se nós formos dar uma olhadinha...
  • 11:12 - 11:15
    Nós temos aqui alguns
    métodos que nós criamos.
  • 11:15 - 11:18
    Então nós temos aqui, por exemplo,
    um "findByNome"
  • 11:18 - 11:22
    e nós temos aqui também
    uma lista de contatos pela data de nascimento.
  • 11:22 - 11:25
    Nós podemos construir também
    esses dois endpoints lá.
  • 11:25 - 11:26
    Então vamos voltar lá
    para o "ContatoController".
  • 11:26 - 11:29
    Vou criar agora esse "findByNome".
  • 11:29 - 11:34
    Lógico que lá no nosso service,
    nós temos que ter também o método
  • 11:34 - 11:37
    que vai implementar isso,
    então nós temos aqui buscar por ID,
  • 11:37 - 11:43
    listar todos, o excluir, aqui tem
    o "mostrarAniversariantes", que é a lista,
  • 11:43 - 11:48
    o atualizar e nós também podemos
    implementar aqui no serviço, um public,
  • 11:48 - 11:53
    nós vamos retornar um contato,
    e vamos chamar de "buscarPeloNome".
  • 11:53 - 11:55
    Se eu vou buscar pelo nome,
    eu vou ter que fornecer
  • 11:55 - 11:58
    uma String carregando o nome.
  • 11:58 - 12:08
    Nós vamos chamar o nosso repositório
    "contatoRepository.findByNome(nome);".
  • 12:08 - 12:12
    Legal, e o que acontece aqui né?
  • 12:12 - 12:18
    "findAll"não, "findByNome",
    que foi aquele personalizado que nós criamos.
  • 12:18 - 12:23
    E aí nós passamos o nome que foi fornecido
    aqui na hora de fazer a chamada para o serviço.
  • 12:23 - 12:26
    Lembrando que nós podemos
    receber também aqui um vazio,
  • 12:26 - 12:30
    então é legal nós também utilizarmos
    aquela estrutura do "Optional".
  • 12:30 - 12:35
    Nós podemos colocar aqui
    um "Optional".
  • 12:35 - 12:37
    Esse cara nós podemos
    chamar de "contatoOptional",
  • 12:37 - 12:40
    que vai receber esse carinha aqui.
  • 12:40 - 12:44
    Ele vai receber a resposta desse
    repositório que nós construímos lá.
  • 12:44 - 12:48
    Deixa eu dar uma olhadinha
    lá no nosso repositório.
  • 12:48 - 12:50
    Ah, ele está recebendo aqui
    um contato, né?
  • 12:50 - 12:51
    Então vamos mudar isso aqui.
  • 12:51 - 12:55
    Vamos falar que ele vai retornar
    para nós um "Optional",
  • 12:55 - 12:58
    que vai ficar mais legal porque
    nós conseguimos tratar se ele estiver vazio.
  • 12:58 - 13:03
    Agora sim, então nós vamos ter aqui
    um Optional que vai receber o Optional
  • 13:03 - 13:05
    que está vindo de lá do banco de dados.
  • 13:05 - 13:07
    E aí, o que nós conseguimos fazer aqui?
  • 13:07 - 13:12
    Nós conseguimos fazer o tratamento,
    então se o "(contatoOptional)" estiver presente,
  • 13:12 - 13:14
    então o que que nós fazemos?
  • 13:14 - 13:19
    Nós retornamos para quem está chamando
    o "contatoOptional.get()".
  • 13:19 - 13:21
    Caso contrário, o que nós fazemos?
  • 13:21 - 13:24
    Nós podemos repetir isso aqui
    e nós lançamos uma exceção
  • 13:24 - 13:27
    lá para quem chamou:
    ("Contato não encontrado!").
  • 13:27 - 13:31
    E aí no nosso controller
    nós vamos utilizar esse service aqui
  • 13:31 - 13:34
    de uma forma bem mais interessante,
    porque isso aqui pode gerar um erro
  • 13:34 - 13:37
    e vai mostrar uma mensagem
    que o contato não foi encontrado.
  • 13:37 - 13:39
    Legal gente, então é sempre assim,
  • 13:39 - 13:43
    você tem o service, que é o cara
    que de fato vai consumir o repositório.
  • 13:43 - 13:46
    Lembre que o repositório é feito
    automaticamente pelo Spring Boot.
  • 13:46 - 13:50
    Agora nós vamos criar o controller
    que vai usar esse service.
  • 13:50 - 13:53
    Então vamos lá,
    vamos criar aqui um @...
  • 13:53 - 13:57
    Como ele é uma pesquisa, uma consulta
    então ele é um "@GetMapping".
  • 13:57 - 14:01
    Ele vai ser um "@GetMapping"
    também aqui para a "/contatos",
  • 14:01 - 14:05
    e nós vamos ter que passar
    o nome de quem nós estamos consultando.
  • 14:05 - 14:07
    Então aqui teria que aparecer, seila,
  • 14:07 - 14:09
    eu estou procurando
    o usuário que se chama Carlos,
  • 14:09 - 14:13
    mas nós não vamos passar Carlos aqui,
    então nós vamos passar aqui um parâmetro.
  • 14:13 - 14:16
    Então vou chamar aqui de
    ("/contato/{nome}").
  • 14:16 - 14:18
    Nós vamos construir agora
    a estrutura do método.
  • 14:18 - 14:21
    Então nós vamos criar aqui um public
    e ele vai retornar o quê?
  • 14:21 - 14:28
    Um contato, que nós podemos
    chamar aqui de "buscarContatoPeloNome",
  • 14:28 - 14:31
    e vai passar aqui um "(String nome)".
  • 14:31 - 14:37
    Da onde nós vamos tirar essa String aqui,
    de onde esse nome vai vir?
  • 14:37 - 14:42
    Ele vai sair daqui, nós vamos
    ter que extrair esse nome da URL.
  • 14:42 - 14:46
    Então quem chamar essa URL
    vai chamar ("/contatos/carlos").
  • 14:46 - 14:51
    Esse carinha que está aqui,
    o Carlos, nós vamos ter que substituir
  • 14:51 - 14:54
    pelo parâmetro da função do método.
  • 14:54 - 14:58
    Então nós vamos chamar aqui
    também o "@PatchVariable".
  • 14:58 - 15:04
    Então uma variável no caminho
    vai ser substituída no nosso parâmetro.
  • 15:04 - 15:06
    E aí nós vamos fazer simplesmente o quê?
  • 15:06 - 15:13
    "return service.buscarPeloNome(nome);"
    passando aqui o nome do usuário
  • 15:13 - 15:16
    que foi passado para nós
    na chamada desse endpoint.
  • 15:16 - 15:19
    E nós temos um outro service
    que faz a busca aqui.
  • 15:19 - 15:23
    Ele mostra para nós os aniversariantes
    de um determinado período.
  • 15:23 - 15:27
    Então nós vamos fazer também aqui mais
    um controlador que também é do tipo Get.
  • 15:27 - 15:35
    Então nós vamos chamar aqui o "@GetMapping",
    nós vamos passar aqui um ("/contatos/"),
  • 15:35 - 15:38
    e nós vamos assinar esse
    método da seguinte forma:
  • 15:38 - 15:43
    vai ser aqui um "public", ele vai retornar
    para nós uma lista de contatos,
  • 15:43 - 15:51
    nós vamos chamar de "mostrarAniversariantes",
    e nós vamos precisar receber aqui:
  • 15:51 - 15:54
    "mostrarAniversariantes(LocalDate dataInicial)".
  • 15:54 - 15:57
    Aí nós temos que dar
    uma olhadinha lá no nosso service.
  • 15:57 - 16:02
    Nós estamos passando primeiro
    a data inicial e depois a data final.
  • 16:02 - 16:07
    Então: (LocalDate dataInicial,
    LocalDate dataFinal).
  • 16:07 - 16:09
    E agora nós vamos fazer
    simplesmente o quê?
  • 16:09 - 16:11
    Nós vamos retornar o nosso
  • 16:11 - 16:18
    "service.mostrarAniversariantes
    (dataInicial, dataFinal)".
  • 16:18 - 16:22
    Nós agora precisamos decidir
    como que nós vamos passar
  • 16:22 - 16:25
    essas informações aqui na URL.
  • 16:25 - 16:27
    Então nós podemos fazer
    algo do tipo assim,
  • 16:27 - 16:34
    nós podemos passar aqui um
    ("/contatos/{dataInicial}/{dataFinal}").
  • 16:34 - 16:37
    Então nós sabemos que o "contatos",
  • 16:37 - 16:41
    aí nós vamos passar
    uma data, "barra", uma data final aqui.
  • 16:41 - 16:44
    E aí nós vamos ter que anotar,
    então esse local date aqui,
  • 16:44 - 16:48
    nós vamos tirar também
    do "@PathVariable".
  • 16:48 - 16:51
    Assim como nós podemos
    tirar esse outro,
  • 16:51 - 16:55
    eu vou quebrar aqui para
    ficar mais legal de nós olharmos.
  • 16:55 - 16:59
    Esse outro aqui, nós também vamos
    poder fazer aqui um "@PathVariable" também.
  • 16:59 - 17:00
    Legal, gente.
  • 17:00 - 17:03
    Então assim, o básico dos nossos
    controladores já está criado.
  • 17:03 - 17:07
    Agora, se nós pensarmos no REST,
    o que o REST fala para nós?
  • 17:07 - 17:14
    Então, por exemplo, quando eu faço um Post,
    eu envio um objeto lá para o servidor,
  • 17:14 - 17:16
    ele vai pegar esse objeto
    que está no formato JSON
  • 17:16 - 17:18
    e vai gravar no banco de dados.
  • 17:18 - 17:22
    Ele tem que devolver
    esse objeto que ele criou
  • 17:22 - 17:25
    para quem chamou o endpoint.
  • 17:25 - 17:28
    E aí nós temos as respostas HTTP,
    os Status HTTP.
  • 17:28 - 17:31
    Então, se tudo aconteceu com sucesso,
    se tudo deu certo,
  • 17:31 - 17:34
    nós devolvemos o código 200, por exemplo.
  • 17:34 - 17:36
    Mas nós temos que definir
    que tipo de código 200 é esse.
  • 17:36 - 17:41
    Então, por exemplo, para o Post
    nós vamos devolver um 201 que é o Created.
  • 17:41 - 17:45
    Ou seja, eu informo para o cliente
    que está consumindo o meu endpoint
  • 17:45 - 17:49
    que o objeto foi criado no banco
    e ele está lá gravado, bonitinho,
  • 17:49 - 17:51
    ele está lá persistido no banco.
  • 17:51 - 17:55
    Então nós vamos agora definir
    que tipo de código HTTP
  • 17:55 - 18:00
    os endpoints vão responder
    para quem chamar os nossos endpoints,
  • 18:00 - 18:02
    para quem chamar
    os nossos controladores, tá bom?
  • 18:02 - 18:05
    Então o Post é porque
    eu vou criar um objeto novo,
  • 18:05 - 18:11
    então nós podemos colocar aqui
    uma anotação que é a "ResponseStatus".
  • 18:11 - 18:17
    Ou seja, qual vai ser o status da resposta
    e nós vamos fornecer aqui um HTTP Status
  • 18:17 - 18:20
    e aí nós temos vários tipos de respostas.
  • 18:20 - 18:26
    Nós temos aqui, por exemplo,
    o "HttpStatus.CREATED", que é o código 201.
  • 18:26 - 18:31
    Então, quando nós temos um Post,
    nós devolvemos uma mensagem 201
  • 18:31 - 18:36
    informando para o consumidor da API
    que o objeto foi criado.
  • 18:36 - 18:40
    Aqui, no caso do Get, nós vamos também
    devolver um "ResponseStatus",
  • 18:40 - 18:46
    e o padrão ele já vai 200, mas nós vamos
    colocar aqui de forma explícita.
  • 18:46 - 18:52
    Então tem um "HttpStatus"
    e nós temos aqui o "OK".
  • 18:52 - 18:56
    Então está aqui, olha,
    nós vamos devolver um "HttpStatus.OK".
  • 18:56 - 19:00
    Vou copiar esse carinha,
    porque para os outros Gets aqui,
  • 19:00 - 19:03
    nós também vamos
    responder com o código 200.
  • 19:03 - 19:08
    Ou seja, a consulta ocorreu de forma ok.
  • 19:08 - 19:14
    No caso do Delete nós vamos responder
    aqui com um "HttpStatus.NO_CONTENT".
  • 19:14 - 19:15
    Por quê?
  • 19:15 - 19:19
    Como nós excluímos o objeto,
    então nós estamos devolvendo para ele:
  • 19:19 - 19:25
    "Olha, o objeto foi excluído, então
    não há mais conteúdo para você olhar".
  • 19:25 - 19:30
    Aqui no Put nós vamos
    responder também com o 200.
  • 19:30 - 19:33
    Ou seja, a atualização ocorreu
    com sucesso no banco de dados.
  • 19:33 - 19:36
    Então os nossos controladores
    já estão prontos,
  • 19:36 - 19:41
    já estão ali prontinhos para começar
    a receber as requisições dos nossos usuários.
  • 19:41 - 19:46
    Então agora você já sabe como
    que você cria a porta de entrada,
  • 19:46 - 19:52
    como que você define
    os controladores que vão receber
  • 19:52 - 19:55
    as requisições dos clientes da nossa API.
Title:
vimeo.com/.../931125947
Video Language:
Portuguese, Brazilian
Duration:
19:58
Roberto Severiano Junior edited Portuguese, Brazilian subtitles for vimeo.com/.../931125947
Roberto Severiano Junior edited Portuguese, Brazilian subtitles for vimeo.com/.../931125947
Roberto Severiano Junior edited Portuguese, Brazilian subtitles for vimeo.com/.../931125947
Roberto Severiano Junior edited Portuguese, Brazilian subtitles for vimeo.com/.../931125947
Roberto Severiano Junior edited Portuguese, Brazilian subtitles for vimeo.com/.../931125947
Roberto Severiano Junior edited Portuguese, Brazilian subtitles for vimeo.com/.../931125947
Roberto Severiano Junior edited Portuguese, Brazilian subtitles for vimeo.com/.../931125947
Roberto Severiano Junior edited Portuguese, Brazilian subtitles for vimeo.com/.../931125947

Portuguese, Brazilian subtitles

Revisions Compare revisions