JavaRush /Blog Java /Random-ES /Tarea de prueba para el empleo, averigüémoslo.
timurnav
Nivel 21

Tarea de prueba para el empleo, averigüémoslo.

Publicado en el grupo Random-ES
Amigos, hola a todos. Quiero compartir con ustedes mi experiencia al resolver una tarea de prueba para el puesto de desarrollador de Java en una empresa rusa. Diré de inmediato que implementar la funcionalidad principal del trabajo no es particularmente difícil, pero como siempre, los detalles y las pequeñas cosas son importantes, lo que me impidió enviarlo a tiempo, nunca respondieron nada sobre el trabajo: su vacante. ya estaba lleno cuando se lo envié. Le sugiero que investigue la tarea para ver si hice todo lo que se me pidió. Y para los que no tienen idea de cómo hacerlo, les agregaré mucha agua sobre cómo lo solucioné. Si alguien está interesado en esto, bienvenido al gato. Diré de inmediato que no publicaré la solución completa aquí, pero habrá muchas explicaciones para principiantes, si alguien no está interesado en leer mis efusiones, aquí está el proyecto en github . Comenzaré con el texto de la tarea en sí.
Tarea de prueba número 1
Descripción: Servidor API (JSON HTTP API) Herramientas de desarrollo: Java Framework: Play Framework 2.4 (o superior) o Spring boot 1.2.3 (o superior) Base de datos: MySQL Protocolo: HTTP, puerto 80 Funcionalidad (solicitudes):
  1. Cargador.
    • Transferimos el archivo (imagen de avatar JPG) al servidor.
    • Guardamos la imagen en un directorio del servidor.
    • La respuesta del servidor es el URI interno de la imagen.
  2. Agregar un nuevo usuario.
    • Transferimos los datos personales del usuario al servidor (URI de la imagen, nombre de usuario, correo electrónico, etc.).
    • Guardamos la información en la base de datos.
    • La respuesta del servidor es la identificación única del nuevo usuario.
  3. Obtención de información sobre el usuario.
    • Transmitimos una identificación de usuario única al servidor.
    • Lectura de información de la base de datos.
    • La respuesta del servidor son los datos personales del usuario (ver arriba).
  4. Cambiar el estado del usuario (en línea, fuera de línea).
    • Transferimos la identificación de usuario única y el nuevo estado (en línea, fuera de línea) al servidor.
    • Cambiar el estado del usuario.
    • Respuesta del servidor: ID de usuario único, estado nuevo y anterior.
    Nota: El servidor está consultando una API/base de datos externa. Dado que se trata de una tarea de prueba simplificada, es necesario implementar un "stub" con acceso simulado y un retraso de 5 a 10 segundos.
  5. Estadísticas del servidor.
    • Transferimos parámetros al servidor: 1. estado del cliente (en línea, fuera de línea o ausente), 2. ID único (marca de tiempo) de la solicitud (puede estar ausente)
    • La respuesta del servidor es una lista de usuarios con estados y URI de imagen, así como una identificación única (marca de tiempo) de la solicitud.
    Nota: Si la solicitud contiene parámetros, el servidor debe filtrar su respuesta por ellos. Si la solicitud contiene una ID única (marca de tiempo) de la solicitud (recibida anteriormente), entonces el servidor debe devolver solo los usuarios cuyos estados cambiaron después (en el tiempo) de esta ID única (marca de tiempo).
Requisitos obligatorios:
- DESCANSO. - Todos los datos están en formato JSON. - El servidor API debe diseñarse teniendo en cuenta que las solicitudes 3 y 5 tienen la mayor prioridad (en relación con las solicitudes 1, 2, 4) y deben completarse lo más rápido posible. - Error de procesamiento.
Requisitos opcionales (deseables):
- Documentación de código. - La arquitectura del servidor API debe estar diseñada para una alta carga y escalabilidad. - Pruebas.
Resultado de la prueba:
- El resultado de la tarea de prueba deberá entregarse en un archivo y con instrucciones detalladas para su implementación. Es recomendable adjuntar un Dockerfile para crear un contenedor Docker para la tarea de prueba. Se puede descargar en github.com. - Debe contener una breve documentación de la API creada (lista de solicitudes, parámetros de solicitud, formatos de solicitud, formatos de respuesta, etc.). - Información sobre el tiempo dedicado a la tarea de prueba en el contexto de: diseño, programación, documentación, etc. Tenga en cuenta que esta tarea de prueba está destinada únicamente a evaluar conocimientos y habilidades, y no tiene como objetivo crear un producto terminado (servidor API), por lo que se permiten simplificaciones con explicaciones y motivos.
Los programadores atentos y experimentados pueden saltarse la siguiente sección; aquí me ocuparé del texto de la tarea en sí. El "encabezado" de la tarea no causa ninguna dificultad de comprensión, por lo que solo diré que mi elección recayó en Spring Boot, pero no porque ya hubiera hecho algo con él, sino porque ya había completado un proyecto real usando Spring (pero Boot no estaba allí, según tengo entendido por su simplicidad). Por funcionalidad del servidor: 1) Descargador de archivos. Básicamente, no hay nada complicado aquí, solo necesitaba descubrir cómo se almacenan generalmente las imágenes en el servidor, resultó que la forma más conveniente es simplemente colocarlas en algún directorio especial. Veremos la implementación específica a continuación. 2) Agregar un nuevo usuario, una operación simple, si alguna vez ha creado aplicaciones CRUD, entonces él me apoyará, si no, verá todo a continuación. 3) Obtener información sobre el usuario. No hay preguntas, todo está claro. 4) Cambiar el estado del usuario. Los dos primeros puntos de la tarea son claros como el día, pero ¿qué pasa con la solicitud externa? Es imposible resolverlo sin 100 g, incluso ahora no estoy 100% seguro de haberlo entendido correctamente. Detalles abajo. 5) Estadísticas del servidor. Esto también es interesante. El primer punto sugiere implementar un método con varias opciones de parámetros, aún no está claro cómo hacerlo, dado que este debería ser un método controlador. El segundo punto pregunta a todos los usuarios cuyo estado ha cambiado después de un momento, parece claro, pero hay sutilezas.
Empezando
¡Oh, cuántas veces leí esta frase mientras trabajaba en esta tarea! Si alguna vez ha intentado descubrir cómo configurar un proyecto en Spring, pero por alguna razón nunca ha probado Spring Boot, felicidades, estará simplemente encantado con lo que escribiré a continuación. Leí en alguna parte que los programadores solían transferir una gran cantidad de código de un proyecto a otro, este es un código de plantilla: configuraciones para conectarse a bases de datos, mapeo de servlets, etc., etc., para, por ejemplo, reducir la cantidad de código de plantilla para trabajar Usamos JPA/Hibernate para bases de datos, ocultan algunas de las plantillas, pero para configurarlas, nuevamente necesita escribir un archivo xml o clases de configuración. y si tienes un proyecto pequeño, resulta que no escribes menos código, sino al revés. A continuación terminamos trabajando con JPA en Spring; hay muchos proyectos, pero el más conveniente es, por supuesto, Spring Data. Este es un proyecto muy grande que puede funcionar probablemente con todo lo posible, incluidos JPA y NoSQL y un montón de proyectos diferentes. Es increíblemente mágico, lo usaremos en nuestro proyecto. Al usar Spring, casi nos deshacemos de la configuración de conexión de la base de datos, Spring hace todo por nosotros, solo necesitamos incluir las anotaciones necesarias sobre transaccionalidad, almacenamiento en caché y, en casos especiales, buscar en Google (ver otras) algunas otras configuraciones en la configuración de contexto. Pero al mismo tiempo, la mayoría de los desarrolladores novatos no tienen ni idea de cómo crear un proyecto en Spring. Nadie sabe completamente cómo configurarlo para ejecutar el proyecto y obtener el resultado en el navegador siguiendo el enlace que comienza con localhost:8080/*. ¡Y entonces Spring Boot entra en escena! ¡Es mejor hablar de Spring Boot con un ejemplo específico! Empecemos por el espacio en blanco. Para crear un proyecto Spring Boot, los desarrolladores de Spring idearon un "constructor" para crear plantillas. Puedes usarlo en su sitio web, pero es mucho más fácil hacerlo en nuestro IDE favorito, Intellij IDEA. Y así: Archivo->Nuevo->Proyecto En la ventana, vaya a la pestaña Spring Initializr, debe configurar jdk en ella y la URL https://start.spring.io, verifique la conexión a Internet, luego necesitará para seleccionar el nombre y luego las tecnologías que usaremos, en la primera etapa solo necesitamos WEB: marque la casilla al lado y luego se crea el proyecto. Para que Maven obtenga todas las dependencias, debemos abrir la pestaña Maven en la idea y hacer clic en el botón Actualizar. Recibimos una plantilla de aplicación lista para usar, que contiene todas las configuraciones para la comunicación cliente-servidor. Para tener una primera impresión, creemos una clase de controlador (probablemente todos hayamos oído hablar de MVC). En todas las aplicaciones Spring, los controladores tienen un diseño bastante simple: esta es una clase que está marcada con la anotación @Controller (son posibles prefijos, por ejemplo, @RestController), esta clase es responsable de procesar las solicitudes entrantes. Para que el controlador reconozca una solicitud de alguna dirección, debe asignar esta dirección al método del 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 + "!"; } } Averigüemos qué está pasando aquí. @RestController . exactamente la anotación sobre la que escribí arriba. Usamos el controlador rest porque queremos ver el resultado inmediatamente y no queremos escribir páginas .jsp (wow), nos resultará más fácil ver inmediatamente el resultado en el navegador como una cadena. @RequestMapping es solo un enlace a una dirección. El prefijo de dirección pública será: localhost:8080. Como podemos ver, toda la clase se bloquea en la dirección /hello , esto significa que todos los métodos dentro de esta clase tienen el prefijo localhost:8080/hello. El siguiente es el primer método de la clase, en su propio mapeo se indica el método del protocolo Http: una solicitud GET (lea usted mismo sobre los métodos del protocolo Http) ¿Qué significa todo esto? al realizar una solicitud GET a la dirección localhost:8080/hello, recibiremos una respuesta en forma de cadena “¡Hola mundo!”, ¡Comprobémoslo! En la clase DemoApplication, hay una anotación interesante que se puede decir que inicia por sí sola todo el contexto Spring: @SpringBootApplication. El método principal de esta clase se vuelve mágico, simplemente lanza toda la magia oculta en SpringApplication, si llamas al menú contextual de esta clase, aparecerán opciones en la línea Ejecutar, recomiendo iniciarlo temprano con una marca verde, de esta manera el La consola se verá mejor y en el futuro será más fácil leer los registros directamente desde ella. Iniciemos la aplicación. cuando la salida de la consola se detiene, deberías ver en la consola
2015-09-02 09:25:36.895 INFO 5844 --- [principal] sbcetTomcatEmbeddedServletContainer: Tomcat se inició en los puertos: 8080 (http) 2015-09-02 09:25:36.900 INFO 5844 --- [principal] demo.DemoApplication: inició DemoApplication en **** segundos (JVM ejecutándose para 15.501)
donde "****" es la duración del inicio de la aplicación :) después de eso, en cualquier navegador (¿o curl, o lo que sea que uses?) debes escribir la dirección a la que se asignó el método del controlador
localhost:8080/hola
El navegador debe mostrar el canónico.
¡Hola Mundo!
¡Aquí tienes una aplicación web! Si notó que hay otro método en el controlador, tiene su propia asignación de direcciones; se agrega un marcador de posición a la dirección actual. Que Spring pasa al método como parámetro. No es difícil adivinar que la anotación @PathVariable es responsable de esto. Entonces a pedido
localhost:8080/hola/Tu nombre
el navegador mostrará
Hola, tu nombre!
Hemos resuelto los conceptos básicos de Spring Boot. A continuación adjuntaremos la base de datos, pero eso será en la próxima publicación. Gracias a todos.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION