JavaRush /Blogue Java /Random-PT /Tarefa de teste para emprego, vamos descobrir..
timurnav
Nível 21

Tarefa de teste para emprego, vamos descobrir..

Publicado no grupo Random-PT
Amigos, olá a todos. Quero compartilhar com vocês minha experiência na resolução de um problema de teste para o cargo de desenvolvedor Java em uma empresa russa. Direi desde já que implementar a funcionalidade principal do trabalho não é particularmente difícil, mas como sempre os detalhes e pequenas coisas são importantes, o que me impediu de o entregar a tempo; nunca responderam nada sobre o trabalho - a vaga deles já estava preenchido quando enviei para eles. Sugiro que você analise a tarefa para ver se fiz tudo o que foi exigido de mim. E para quem não tem ideia de como fazer, vou acrescentar bastante água sobre como lidei com isso. Se alguém estiver interessado nisso, seja bem-vindo ao gato. Direi desde já que não vou postar a solução completa aqui, mas haverá muitas explicações para iniciantes, se alguém não tiver interesse em ler meus desabafos, aqui está o projeto no github . Vou começar com o texto da tarefa em si.
Tarefa de teste nº 1
Descrição: Servidor API (API JSON HTTP) Ferramentas de Desenvolvimento: Framework Java : Play Framework 2.4 (ou superior) ou Spring boot 1.2.3 (ou superior) Banco de dados: MySQL Protocolo: HTTP, porta 80 Funcionalidade (solicitações):
  1. Carregador.
    • Transferimos o arquivo (imagem de avatar JPG) para o servidor.
    • Salvamos a imagem em um diretório do servidor.
    • A resposta do servidor é o URI interno da imagem.
  2. Adicionando um novo usuário.
    • Transferimos os dados pessoais do utilizador para o servidor (URI da imagem, nome de utilizador, email, etc.).
    • Salvamos as informações no banco de dados.
    • A resposta do servidor é o ID exclusivo do novo usuário.
  3. Obtenção de informações sobre o usuário.
    • Transmitimos um ID de usuário exclusivo para o servidor.
    • Lendo informações do banco de dados.
    • A resposta do servidor são os dados pessoais do usuário (veja acima).
  4. Alteração do status do usuário (Online, Offline).
    • Transferimos o ID de usuário exclusivo e o novo status (Online, Offline) para o servidor.
    • Alterando o status do usuário.
    • Resposta do servidor - ID de usuário exclusivo, status novo e anterior.
    Nota: O servidor está consultando uma API/banco de dados externo. Por se tratar de uma tarefa de teste simplificada, é necessário implementar um “stub” com acesso simulado e um atraso de 5 a 10 segundos.
  5. Estatísticas do servidor.
    • Transferimos parâmetros para o servidor: 1. status do cliente (Online, Offline ou ausente), 2. ID exclusivo (timestamp) da solicitação (pode estar ausente)
    • A resposta do servidor é uma lista de usuários com status e URIs de imagem, bem como um ID exclusivo (carimbo de data/hora) da solicitação.
    Nota: Se a solicitação contiver parâmetros, o servidor deverá filtrar sua resposta por eles. Se a solicitação contiver um ID exclusivo (carimbo de data e hora) da solicitação (recebido anteriormente), o servidor deverá retornar apenas os usuários cujos status foram alterados após (no tempo) esse ID exclusivo (carimbo de data e hora).
Requisitos obrigatórios:
- RESTful. - Todos os dados estão no formato JSON. - O servidor API deve ser desenhado tendo em conta que os pedidos 3 e 5 têm a maior prioridade (em relação aos pedidos 1, 2, 4) e devem ser concluídos o mais rapidamente possível. - Erro no processamento.
Requisitos opcionais (desejáveis):
- Documentação de código. - A arquitetura do API Server deve ser projetada para alta carga e escalabilidade. - Testes.
Resultado do teste:
- O resultado da tarefa de teste deve ser fornecido em arquivo e com instruções detalhadas para sua implantação. É aconselhável anexar um Dockerfile para construir um contêiner Docker para a tarefa de teste. Pode ser baixado em github.com. - Deve conter breve documentação da API criada (lista de solicitações, parâmetros de solicitação, formatos de solicitação, formatos de resposta, etc.). - Informações sobre o tempo gasto na tarefa de teste no contexto de: design, programação, documentação, etc. Observe que esta tarefa de teste tem como objetivo apenas avaliar conhecimentos e habilidades, e não visa criar um produto acabado (servidor API), portanto são permitidas simplificações com explicações e motivos.
programadores atentos e experientes podem pular a próxima seção, aqui tratarei do texto da tarefa em si. O “cabeçalho” da tarefa não causa dificuldades de compreensão, então direi apenas que minha escolha recaiu sobre o Spring Boot, mas não porque já tivesse feito algo com ele, mas porque já havia concluído um projeto real usando Spring (mas o Boot não estava lá, pelo que entendi devido à sua simplicidade). De acordo com a funcionalidade do servidor: 1) Downloader de arquivos. Basicamente não há nada complicado aqui, eu só precisava descobrir como as imagens geralmente são armazenadas no servidor, descobri que a maneira mais conveniente é simplesmente colocá-las em algum diretório especial. Veremos a implementação específica abaixo. 2) Adicionar um novo usuário, uma operação simples, se você já fez aplicações CRUD ele vai me apoiar, caso contrário você verá tudo abaixo. 3) Obtenção de informações sobre o usuário. sem perguntas - tudo está claro. 4)Alterando o status do usuário. os dois primeiros pontos da tarefa estão claros como o dia, mas e a solicitação externa??? É impossível descobrir sem 100g, mesmo agora não tenho 100% de certeza se entendi corretamente. Detalhes abaixo. 5) Estatísticas do servidor. Isso também é interessante. O primeiro ponto sugere a implementação de um método com diversas opções de parâmetros, ainda não está claro como fazer isso, visto que este deveria ser um método controlador. o segundo ponto pergunta a todos os usuários cujo status mudou após um momento, parece claro, mas há sutilezas.
Começando
ah, quantas vezes li essa frase enquanto trabalhava nessa tarefa! Se você já tentou descobrir como montar um projeto no Spring, mas por algum motivo nunca experimentou o Spring Boot, parabéns, você ficará simplesmente encantado com o que escreverei a seguir. Eu li em algum lugar que os programadores costumavam transferir uma quantidade muito grande de código de projeto para projeto, este é o código do modelo - configurações para conexão com bancos de dados, mapeamento de servlet, etc., etc., para que, por exemplo, reduza a quantidade de código de modelo para trabalhar Usamos JPA/Hibernate para bancos de dados, eles ocultam alguns dos modelos, mas para configurá-los, você precisa escrever novamente um arquivo xml ou classes de configuração. e se você tem um projeto pequeno, acontece que você não escreve menos código, mas vice-versa. A seguir encerramos o trabalho com JPA no Spring; existem muitos projetos, mas o mais conveniente é, claro, o Spring Data. Este é um projeto muito grande que pode funcionar provavelmente com tudo o que é possível, incluindo JPA e NoSQL e um monte de projetos diferentes, é incrivelmente mágico, vamos usá-lo em nosso projeto. Usando o Spring quase nos livramos das configurações de conexão do banco de dados, o Spring faz tudo por nós, só precisamos inserir as anotações necessárias sobre transacionalidade, cache e, em casos especiais, google (veja outros) algumas outras configurações na configuração do contexto. Mas, ao mesmo tempo, a maioria dos desenvolvedores novatos não tem absolutamente nenhuma ideia de como criar um projeto no Spring. Ninguém sabe completamente como configurá-lo para executar o projeto e obter o resultado no navegador seguindo o link que começa com localhost:8080/*. E então Spring Boot entra em cena! É melhor falar sobre Spring Boot com um exemplo específico! Vamos começar com o espaço em branco. Para criar um projeto Spring Boot, os desenvolvedores do Spring criaram um “construtor” para criar modelos. Você pode usá-lo no site deles, mas é muito mais fácil fazer isso em nosso IDE favorito, o Intellij IDEA. E assim: Arquivo->Novo->Projeto Na janela, vá até a aba Spring Initializr, jdk deve estar configurado nela, e a URL https://start.spring.io, verifique a conexão com a Internet, então você precisará para selecionar o nome e depois as tecnologias que iremos utilizar, na primeira etapa só precisamos de WEB - marque ao lado e então o projeto está criado. Para que o Maven obtenha todas as dependências, precisamos abrir a guia Maven na ideia e clicar no botão atualizar. Recebemos um modelo de aplicativo pronto, que contém todas as configurações para comunicação cliente-servidor. Para ter uma primeira impressão, vamos criar uma classe de controlador (provavelmente todos nós já ouvimos falar de MVC). Em todos os aplicativos Spring, os controladores têm um design bastante simples - esta é uma classe marcada com a anotação @Controller (prefixos são possíveis, por exemplo, @RestController), esta classe é responsável por processar as solicitações recebidas. Para que o controlador reconheça uma solicitação de algum endereço, é necessário mapear esse endereço para o método do controlador. import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "/hello") public class DemoController { @RequestMapping(method = RequestMethod.GET) public String halloWorld() { return "Hello World!"; } @RequestMapping(value = "/{name}", method = RequestMethod.GET) public String halloName(@PathVariable("name") String name) { return "Hello, " + name + "!"; } } Vamos descobrir o que está acontecendo aqui. @RestController . exatamente a anotação sobre a qual escrevi acima. Usamos o controlador rest porque queremos ver imediatamente o resultado e não queremos escrever páginas .jsp (uau), será mais fácil vermos imediatamente o resultado no navegador como uma string. @RequestMapping é apenas uma ligação a um endereço. O prefixo do endereço público será: localhost:8080. Como podemos ver, toda a classe fica pendurada no endereço /hello , isso significa que todos os métodos dentro desta classe possuem o prefixo localhost:8080/hello. A seguir está o primeiro método da classe, em seu próprio mapeamento é indicado o método do protocolo Http - uma solicitação GET (leia você mesmo sobre os métodos do protocolo Http) O que tudo isso significa? fazendo uma solicitação GET para o endereço localhost:8080/hello, receberemos uma resposta na forma da string “Hello World!”, vamos verificar! Na classe DemoApplication, há uma anotação interessante que pode ser considerada capaz de iniciar sozinho todo o contexto do Spring - @SpringBootApplication. O método principal desta classe se torna mágico, apenas lança toda a magia escondida no SpringApplication, se você chamar o menu de contexto desta classe, as opções aparecerão na linha Run, recomendo executá-lo antecipadamente com uma marca verde, desta forma o console ficará melhor e no futuro será mais fácil ler os logs diretamente dela. Vamos iniciar o aplicativo. quando a saída do console parar, você deverá ver no console
02/09/2015 09:25:36.895 INFO 5844 --- [principal] sbcetTomcatEmbeddedServletContainer: Tomcat iniciado na(s) porta(s): 8080 (http) 02/09/2015 09:25:36.900 INFO 5844 --- [principal] demo.DemoApplication: DemoApplication iniciado em **** segundos (JVM em execução para 15.501)
onde "****" é a duração da inicialização do aplicativo :) depois disso, em qualquer navegador (ou curl, ou o que você usar?) você precisa digitar o endereço para o qual o método do controlador foi mapeado
localhost:8080/olá
O navegador deve exibir o canônico
Olá Mundo!
Aqui está um aplicativo da web para você! Se você notou que há outro método no controlador, ele possui seu próprio mapeamento de endereço; um espaço reservado é adicionado ao endereço atual. Que é passado para o método como parâmetro pelo Spring. Não é difícil adivinhar que a anotação @PathVariable é responsável por isso. Então, a pedido
localhost:8080/olá/Seu nome
o navegador mostrará
Olá, seu nome!
Resolvemos o básico do Spring Boot. A seguir anexaremos o banco de dados, mas isso ficará no próximo post. Obrigado a todos.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION