JavaRush /Blog Java /Random-FR /Tâche de test pour l'emploi, trouvons-le..
timurnav
Niveau 21

Tâche de test pour l'emploi, trouvons-le..

Publié dans le groupe Random-FR
Amis, bonjour à tous. Je souhaite partager avec vous mon expérience dans la résolution d'une tâche de test pour le poste de développeur Java dans une entreprise russe. Je dirai tout de suite que mettre en œuvre la fonctionnalité principale de la mission n'est pas particulièrement difficile, mais comme toujours, les détails et les petites choses sont importants, ce qui m'a empêché de la soumettre à temps ; ils n'ont jamais rien répondu sur la mission - leur poste vacant était déjà rempli lorsque je le leur ai envoyé. Je vous suggère d'examiner la tâche pour voir si j'ai fait tout ce qui était exigé de moi. Et pour ceux qui ne savent pas comment le faire, j'ajouterai beaucoup d'eau sur la façon dont je l'ai géré. Si cela intéresse quelqu'un, bienvenue chez le chat. Je précise tout de suite que je ne posterai pas toute la solution ici, mais il y aura beaucoup d'explications pour les débutants, si quelqu'un n'est pas intéressé à lire mes effusions, voici le projet sur github . texte de la tâche elle-même.
Tâche de test n°1
Description : Serveur API (API JSON HTTP) Outils de développement : Java Framework : Play Framework 2.4 (ou supérieur) ou Spring boot 1.2.3 (ou supérieur) Base de données : MySQL Protocole : HTTP, port 80 Fonctionnalité (requêtes) :
  1. Chargeur.
    • Nous transférons le fichier (image d'avatar JPG) sur le serveur.
    • Nous sauvegardons l'image dans un répertoire sur le serveur.
    • La réponse du serveur est l'URI interne de l'image.
  2. Ajout d'un nouvel utilisateur.
    • Nous transférons les données personnelles de l’utilisateur au serveur (URI de l’image, nom d’utilisateur, email, etc.).
    • Nous sauvegardons les informations dans la base de données.
    • La réponse du serveur est l'ID unique du nouvel utilisateur.
  3. Obtention d'informations sur l'utilisateur.
    • Nous transmettons un identifiant unique au serveur.
    • Lecture des informations de la base de données.
    • La réponse du serveur est constituée des données personnelles de l'utilisateur (voir ci-dessus).
  4. Modification du statut de l'utilisateur (en ligne, hors ligne).
    • Nous transférons l'ID utilisateur unique et le nouveau statut (En ligne, Hors ligne) au serveur.
    • Modification du statut de l'utilisateur.
    • Réponse du serveur : ID utilisateur unique, statut nouveau et précédent.
    Remarque : Le serveur interroge une API/base de données externe. Puisqu'il s'agit d'une tâche de test simplifiée, il est nécessaire d'implémenter un « stub » avec un accès simulé et un délai de 5 à 10 secondes.
  5. Statistiques du serveur.
    • Nous transférons les paramètres au serveur : 1. statut du client (En ligne, Hors ligne ou absent), 2. ID unique (horodatage) de la demande (peut être absent)
    • La réponse du serveur est une liste d'utilisateurs avec des statuts et des URI d'image, ainsi qu'un identifiant unique (horodatage) de la demande.
    Remarque : Si la requête contient des paramètres, le serveur doit filtrer sa réponse en fonction de ceux-ci. Si la demande contient un identifiant unique (horodatage) de la demande (reçu plus tôt), alors le serveur ne doit renvoyer que les utilisateurs dont le statut a changé après (dans le temps) cet identifiant unique (horodatage).
Exigences obligatoires:
- REPOSANT. - Toutes les données sont au format JSON. - Le serveur API doit être conçu en tenant compte du fait que les requêtes 3 et 5 ont la priorité la plus élevée (par rapport aux requêtes 1, 2, 4) et doivent être complétées le plus rapidement possible. - Traitement des erreurs.
Exigences facultatives (souhaitables) :
-Documentation du code. - L'architecture du serveur API doit être conçue pour une charge et une évolutivité élevées. - Essais.
Résultat du test:
- Le résultat de la tâche de test doit être fourni dans une archive et avec des instructions détaillées pour son déploiement. Il est conseillé de joindre un Dockerfile pour créer un conteneur Docker pour la tâche de test. Peut être téléchargé sur github.com. - Doit contenir une brève documentation de l'API créée (liste des requêtes, paramètres de requête, formats de requête, formats de réponse, etc.). - Informations sur le temps passé sur la tâche de test dans le cadre de : conception, programmation, documentation, etc. Veuillez noter que cette tâche de test est uniquement destinée à évaluer les connaissances et les compétences et ne vise pas à créer un produit fini (serveur API), c'est pourquoi des simplifications avec explications et raisons sont autorisées.
les programmeurs attentifs et expérimentés peuvent sauter la section suivante, je traiterai ici du texte de la tâche elle-même. L'« en-tête » de la tâche ne pose aucune difficulté de compréhension, je dirai donc simplement que mon choix s'est porté sur Spring Boot, mais pas parce que j'en avais déjà fait quelque chose, mais parce que j'avais déjà réalisé un vrai projet en utilisant Spring (mais Boot n'était pas là, si je comprends bien en raison de sa simplicité). Selon la fonctionnalité du serveur : 1) Téléchargeur de fichiers. Il n'y a fondamentalement rien de compliqué ici, j'avais juste besoin de comprendre comment les images sont généralement stockées sur le serveur, il s'est avéré que le moyen le plus pratique est simplement de les placer dans un répertoire spécial. Nous examinerons la mise en œuvre spécifique ci-dessous. 2) Ajouter un nouvel utilisateur, opération simple, si vous avez déjà fait des applications CRUD, alors il me soutiendra, sinon, vous verrez tout ci-dessous. 3) Obtenir des informations sur l'utilisateur. pas de questions - tout est clair. 4) Modification du statut de l'utilisateur. les deux premiers points de la tâche sont clairs comme le jour, mais qu'en est-il de la demande externe ??? Il est impossible de le comprendre sans 100 g, même maintenant, je ne suis pas sûr à 100 % d'avoir bien compris. Détails ci-dessous. 5) Statistiques du serveur. C'est également intéressant. Le premier point suggère d'implémenter une méthode avec diverses options pour les paramètres, on ne sait pas encore comment procéder, étant donné qu'il devrait s'agir d'une méthode de contrôleur. le deuxième point s'adresse à tous les utilisateurs dont le statut a changé après un certain temps, cela semble clair, mais il y a des subtilités.
Commencer
oh, combien de fois ai-je lu cette phrase pendant que je travaillais sur cette tâche ! Si vous avez déjà essayé de comprendre comment mettre en place un projet au Spring, mais que pour une raison quelconque vous n'avez jamais essayé Spring Boot, félicitations, vous serez tout simplement ravi de ce que j'écrirai ci-dessous. J'ai lu quelque part que les programmeurs transféraient une très grande quantité de code d'un projet à l'autre, il s'agit de codes modèles - paramètres de connexion aux bases de données, mappage de servlets, etc., etc., afin que, par exemple, pour réduire la quantité de code de modèle pour travailler avec Nous utilisons JPA/Hibernate pour les bases de données, ils cachent certains modèles, mais pour les configurer, vous devez à nouveau écrire un fichier XML ou des classes de configuration. et si vous avez un petit projet, il s'avère que vous n'écrivez pas moins de code, mais même vice versa. Nous terminerons ensuite notre travail avec JPA au Spring ; il existe de nombreux projets, mais le plus pratique est, bien sûr, Spring Data. C'est un très gros projet qui peut fonctionner avec probablement tout ce qui est possible, y compris JPA et NoSQL et tout un tas de projets différents, c'est incroyablement magique, nous l'utiliserons dans notre projet. En utilisant Spring, nous nous débarrassons presque des paramètres de connexion à la base de données, Spring fait tout pour nous, il nous suffit de coller les annotations nécessaires sur la transactionnalité, la mise en cache et, dans des cas particuliers, Google (regardez les autres) d'autres paramètres dans la configuration du contexte. Mais en même temps, la plupart des développeurs novices n'ont absolument aucune idée de comment créer un projet au printemps. Personne ne sait complètement comment le configurer pour exécuter le projet et obtenir le résultat dans le navigateur en suivant le lien commençant par localhost:8080/*. Et puis Spring Boot entre en scène ! Mieux vaut parler de Spring Boot avec un exemple précis ! Commençons par le blanc. Pour créer un projet Spring Boot, les développeurs Spring ont proposé un « constructeur » pour créer des modèles. Vous pouvez l'utiliser sur leur site Web, mais il est beaucoup plus facile de le faire dans notre IDE préféré, Intellij IDEA. Et donc : Fichier->Nouveau->Projet Dans la fenêtre, allez dans l'onglet Spring Initializr, jdk doit y être défini, et l'URL https://start.spring.io, vérifiez la connexion Internet, vous aurez alors besoin pour sélectionner le nom, puis les technologies que nous utiliserons, dans un premier temps, nous n'avons besoin que de WEB - cochez-le et le projet est ensuite créé. Pour que Maven récupère toutes les dépendances, nous devons ouvrir l'onglet Maven dans l'idée et cliquer sur le bouton de mise à jour. Nous avons reçu un modèle de candidature prêt à l'emploi, qui contient tous les paramètres de communication client-serveur. Pour avoir une première impression, créons une classe de contrôleur (nous avons probablement tous entendu parler de MVC). Dans toutes les applications Spring, les contrôleurs ont une conception assez simple - il s'agit d'une classe marquée de l'annotation @Controller (des préfixes sont possibles, par exemple @RestController), cette classe est responsable du traitement des requêtes entrantes. Pour que le contrôleur reconnaisse une demande d'adresse, vous devez mapper cette adresse à la méthode du contrôleur. 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 + "!"; } } Voyons ce qui se passe ici. @RestController . exactement l'annotation dont j'ai parlé ci-dessus. Nous utilisons le contrôleur rest parce que nous voulons voir immédiatement le résultat et ne voulons pas écrire de pages .jsp (wow), il nous sera plus facile de voir immédiatement le résultat dans le navigateur sous forme de chaîne. @RequestMapping n'est qu'une liaison à une adresse. Le préfixe de l'adresse publique sera : localhost:8080. Comme nous pouvons le voir, la classe entière se bloque à l' adresse /hello , cela signifie que toutes les méthodes à l'intérieur de cette classe ont le préfixe localhost:8080/hello. Vient ensuite la première méthode de la classe, dans son propre mappage, la méthode du protocole Http est indiquée - une requête GET (lisez par vous-même les méthodes du protocole Http) Qu'est-ce que tout cela signifie ? en faisant une requête GET à l'adresse localhost:8080/hello, nous recevrons une réponse sous la forme de la chaîne « Hello World ! », vérifions ça ! Dans la classe DemoApplication, il existe une annotation intéressante qui peut à elle seule lancer l'intégralité du contexte Spring - @SpringBootApplication. La méthode principale de cette classe devient magique, elle lance simplement toute la magie cachée dans SpringApplication, si vous appelez le menu contextuel de cette classe, des options apparaîtront dans la ligne Run, je recommande de l'exécuter tôt avec une marque verte, de cette façon le La console sera plus jolie et à l'avenir, il sera plus facile de lire les journaux directement depuis elle. Lançons l'application. lorsque la sortie de la console s'arrête, vous devriez voir dans la console
2015-09-02 09:25:36.895 INFO 5844 --- [ principal] sbcetTomcatEmbeddedServletContainer : Tomcat démarré sur le(s) port(s) : 8080 (http) 2015-09-02 09:25:36.900 INFO 5844 --- [ principal] demo.DemoApplication : Démarrage de DemoApplication en **** secondes (JVM fonctionnant sous 15.501)
où "****" est la durée du lancement de l'application :) après cela, dans n'importe quel navigateur (ou curl, ou quoi que vous utilisiez ?), vous devez taper l'adresse à laquelle la méthode du contrôleur a été mappée
hôte local : 8080/bonjour
Le navigateur doit afficher le canonique
Bonjour le monde!
Voici une application web pour vous ! Si vous avez remarqué qu'il existe une autre méthode dans le contrôleur, celui-ci possède son propre mappage d'adresse ; un espace réservé est ajouté à l'adresse actuelle. Qui est passé à la méthode en tant que paramètre par Spring. Il n'est pas difficile de deviner que l'annotation @PathVariable en est responsable. Donc sur demande
localhost:8080/bonjour/Votre nom
le navigateur affichera
Bonjour, votre nom !
Nous avons réglé les bases de Spring Boot. Ensuite, nous joindrons la base de données, mais ce sera dans le prochain article. Merci à tous.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION