JavaRush /Java-Blog /Random-DE /Testaufgabe für Beschäftigung, lass es uns herausfinden.....
timurnav
Level 21

Testaufgabe für Beschäftigung, lass es uns herausfinden..

Veröffentlicht in der Gruppe Random-DE
Freunde, hallo zusammen. Ich möchte meine Erfahrungen bei der Lösung einer Testaufgabe für die Position eines Java-Entwicklers in einem russischen Unternehmen mit Ihnen teilen. Ich muss gleich sagen, dass die Implementierung der Hauptfunktionalität der Aufgabe nicht besonders schwierig ist, aber wie immer sind die Details und Kleinigkeiten wichtig, was mich daran gehindert hat, sie rechtzeitig einzureichen; sie haben nie etwas über die Aufgabe – ihre freie Stelle – geantwortet war bereits gefüllt, als ich es ihnen schickte. Ich schlage vor, dass Sie sich die Aufgabe ansehen, um zu sehen, ob ich alles getan habe, was von mir verlangt wurde. Und für diejenigen, die keine Ahnung haben, wie man es macht, werde ich viel darüber erzählen, wie ich damit umgegangen bin. Wenn sich jemand dafür interessiert, willkommen bei der Katze. Ich sage gleich, dass ich hier nicht die ganze Lösung veröffentlichen werde, aber es wird viele Erklärungen für Anfänger geben. Falls jemand nicht daran interessiert ist, meine Ergüsse zu lesen, hier ist das Projekt auf Github . Ich werde mit dem beginnen Text der Aufgabe selbst.
Testaufgabe Nr. 1
Beschreibung: API-Server (JSON HTTP API) Entwicklungstools: Java Framework: Play Framework 2.4 (oder höher) oder Spring Boot 1.2.3 (oder höher) Datenbank: MySQL Protokoll: HTTP, Port 80 Funktionalität (Anfragen):
  1. Lader.
    • Wir übertragen die Datei (JPG-Avatarbild) auf den Server.
    • Wir speichern das Bild in einem Verzeichnis auf dem Server.
    • Die Serverantwort ist der interne URI des Bildes.
  2. Einen neuen Benutzer hinzufügen.
    • Wir übertragen die persönlichen Daten des Benutzers an den Server (URI des Bildes, Benutzername, E-Mail usw.).
    • Wir speichern die Informationen in der Datenbank.
    • Die Serverantwort ist die eindeutige ID des neuen Benutzers.
  3. Einholen von Informationen über den Benutzer.
    • Wir übermitteln eine eindeutige Benutzer-ID an den Server.
    • Informationen aus der Datenbank lesen.
    • Die Antwort des Servers sind die persönlichen Daten des Nutzers (siehe oben).
  4. Benutzerstatus ändern (Online, Offline).
    • Wir übertragen die eindeutige Benutzer-ID und den neuen Status (Online, Offline) an den Server.
    • Ändern des Benutzerstatus.
    • Serverantwort – eindeutige Benutzer-ID, neuer und vorheriger Status.
    Hinweis: Der Server fragt eine externe API/Datenbank ab. Da es sich um eine vereinfachte Testaufgabe handelt, ist es notwendig, einen „Stub“ mit simuliertem Zugriff und einer Zeitverzögerung von 5-10 Sekunden zu implementieren.
  5. Serverstatistiken.
    • Wir übertragen Parameter an den Server: 1. Client-Status (Online, Offline oder abwesend), 2. eindeutige ID (Zeitstempel) der Anfrage (kann fehlen)
    • Die Serverantwort ist eine Liste von Benutzern mit Status und Bild-URIs sowie einer eindeutigen ID (Zeitstempel) der Anfrage.
    Hinweis: Wenn die Anfrage Parameter enthält, muss der Server seine Antwort nach diesen filtern. Wenn die Anfrage eine eindeutige ID (Zeitstempel) der Anfrage (früher empfangen) enthält, sollte der Server nur Benutzer zurückgeben, deren Status sich nach (zeitlicher) dieser eindeutigen ID (Zeitstempel) geändert hat.
Obligatorische Anforderungen:
- RUHIG. - Alle Daten liegen im JSON-Format vor. - Der API-Server sollte so konzipiert sein, dass die Anfragen 3 und 5 die höchste Priorität haben (im Vergleich zu den Anfragen 1, 2, 4) und so schnell wie möglich abgeschlossen werden müssen. - Fehlerbearbeitung.
Optionale Anforderungen (wünschenswert):
- Dokumentation des Codes. - Die API-Server-Architektur muss für hohe Last und Skalierung ausgelegt sein. - Tests.
Testergebnis:
- Das Ergebnis der Testaufgabe muss in einem Archiv und mit detaillierten Anweisungen für die Bereitstellung bereitgestellt werden. Es empfiehlt sich, eine Docker-Datei anzuhängen, um einen Docker-Container für die Testaufgabe zu erstellen. Kann auf github.com heruntergeladen werden. - Sollte eine kurze Dokumentation der erstellten API enthalten (Liste der Anfragen, Anfrageparameter, Anfrageformate, Antwortformate usw.). - Informationen über den Zeitaufwand für die Testaufgabe im Kontext: Design, Programmierung, Dokumentation usw. Bitte beachten Sie, dass diese Testaufgabe nur der Beurteilung von Kenntnissen und Fähigkeiten dient und nicht darauf abzielt, ein fertiges Produkt (API-Server) zu erstellen, daher sind Vereinfachungen mit Erläuterungen und Begründungen zulässig.
Aufmerksame und erfahrene Programmierer können den nächsten Abschnitt überspringen, hier werde ich mich mit dem Text der Aufgabe selbst befassen. Der „Header“ der Aufgabe verursacht keine Verständnisschwierigkeiten, daher kann ich nur sagen, dass meine Wahl auf Spring Boot gefallen ist, aber nicht, weil ich bereits etwas damit gemacht hatte, sondern weil ich bereits ein echtes Projekt mit Spring Boot abgeschlossen hatte Spring (aber Boot war nicht da, soweit ich es aufgrund seiner Einfachheit verstehe). Nach Serverfunktionalität: 1) Datei-Downloader. Hier gibt es im Grunde nichts Kompliziertes, ich musste nur herausfinden, wie die Bilder im Allgemeinen auf dem Server gespeichert werden. Es stellte sich heraus, dass es am bequemsten ist, sie einfach in einem speziellen Verzeichnis abzulegen. Wir werden uns die konkrete Implementierung weiter unten ansehen. 2) Das Hinzufügen eines neuen Benutzers ist ein einfacher Vorgang. Wenn Sie jemals CRUD-Anwendungen erstellt haben, wird er mich unterstützen. Wenn nicht, sehen Sie unten alles. 3) Einholen von Informationen über den Benutzer. Keine Fragen - alles ist klar. 4)Ändern des Benutzerstatus. Die ersten beiden Punkte der Aufgabe sind klar, aber was ist mit der externen Anfrage??? Ohne 100 g ist es unmöglich, es herauszufinden, auch jetzt bin ich mir nicht 100 % sicher, ob ich es richtig verstanden habe. Details unten. 5)Serverstatistiken. Das ist auch interessant. Der erste Punkt schlägt vor, eine Methode mit verschiedenen Optionen für Parameter zu implementieren. Es ist noch nicht klar, wie das geht, da es sich um eine Controller-Methode handeln soll. Der zweite Punkt fragt alle Benutzer, deren Status sich nach einem Moment geändert hat. Es scheint klar, aber es gibt Feinheiten.
Erste Schritte
Oh, wie oft habe ich diesen Satz gelesen, während ich an dieser Aufgabe gearbeitet habe! Wenn Sie jemals versucht haben, herauszufinden, wie Sie ein Projekt in Spring einrichten, aber aus irgendeinem Grund noch nie Spring Boot ausprobiert haben, herzlichen Glückwunsch, Sie werden von dem, was ich unten schreibe, einfach begeistert sein. Ich habe irgendwo gelesen, dass Programmierer früher eine sehr große Menge Code von Projekt zu Projekt übertragen haben. Dabei handelt es sich um Vorlagencode – Einstellungen für die Verbindung zu Datenbanken, Servlet-Mapping usw. usw., um beispielsweise die Menge zu reduzieren Vorlagencode für die Arbeit mit Wir verwenden JPA/Hibernate für Datenbanken. Sie verbergen einige der Vorlagen, aber um sie zu konfigurieren, müssen Sie erneut eine XML-Datei oder Konfigurationsklassen schreiben. und wenn Sie ein kleines Projekt haben, dann stellt sich heraus, dass Sie nicht weniger Code schreiben, sondern sogar umgekehrt. Als nächstes schließen wir die Arbeit mit JPA in Spring ab; es gibt viele Projekte, aber das bequemste ist natürlich Spring Data. Dies ist ein sehr großes Projekt, das wahrscheinlich mit allem Möglichen arbeiten kann, einschließlich JPA und NoSQL und einer ganzen Reihe verschiedener Projekte. Es ist unglaublich magisch, wir werden es in unserem Projekt verwenden. Mit Spring werden wir die Datenbankverbindungseinstellungen fast los, Spring erledigt alles für uns, wir müssen nur die notwendigen Anmerkungen zu Transaktionalität, Caching und in besonderen Fällen Google (schauen Sie sich andere an) einige andere Einstellungen in der Kontextkonfiguration einfügen. Gleichzeitig haben die meisten unerfahrenen Entwickler jedoch überhaupt keine Ahnung, wie man im Frühling ein Projekt erstellt. Niemand weiß genau, wie man es konfiguriert, um das Projekt auszuführen und das Ergebnis im Browser zu erhalten, indem man dem Link folgt, der mit localhost:8080/* beginnt. Und dann kommt Spring Boot ins Spiel! Es ist besser, anhand eines konkreten Beispiels über Spring Boot zu sprechen! Beginnen wir mit dem Rohling. Um ein Spring Boot-Projekt zu erstellen, haben sich die Spring-Entwickler einen „Konstruktor“ zum Erstellen von Vorlagen ausgedacht. Sie können es auf ihrer Website verwenden, aber es ist viel einfacher, es in unserer Lieblings-IDE, Intellij IDEA, zu tun. Und so: Datei->Neu->Projekt Gehen Sie im Fenster zur Registerkarte Spring Initializr, dort sollte JDK und die URL https://start.spring.io festgelegt sein. Überprüfen Sie die Internetverbindung. Dann benötigen Sie Um den Namen und dann die Technologien auszuwählen, die wir verwenden werden, benötigen wir im ersten Schritt nur WEB – setzen Sie ein Häkchen daneben und dann wird das Projekt erstellt. Damit Maven alle Abhängigkeiten abrufen kann, müssen wir die Registerkarte „Maven“ in der Idee öffnen und auf die Schaltfläche „Aktualisieren“ klicken. Wir haben eine vorgefertigte Bewerbungsvorlage erhalten, die alle Einstellungen für die Client-Server-Kommunikation enthält. Um einen ersten Eindruck zu bekommen, erstellen wir eine Controller-Klasse (wir haben wahrscheinlich alle schon von MVC gehört). In allen Spring-Anwendungen haben Controller ein recht einfaches Design – dies ist eine Klasse, die mit der Annotation @Controller gekennzeichnet ist (Präfixe sind möglich, zum Beispiel @RestController), diese Klasse ist für die Verarbeitung eingehender Anfragen verantwortlich. Damit der Controller eine Anfrage nach einer Adresse erkennen kann, müssen Sie diese Adresse der Controller-Methode zuordnen. 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 + "!"; } } Lassen Sie uns herausfinden, was hier vor sich geht. @RestController . genau die Anmerkung, über die ich oben geschrieben habe. Wir verwenden den Rest-Controller, weil wir das Ergebnis sofort sehen wollen und keine .jsp-Seiten schreiben wollen (wow), es wird für uns einfacher sein, das Ergebnis sofort im Browser als String zu sehen. @RequestMapping ist lediglich eine Bindung an eine Adresse. Das Präfix für die öffentliche Adresse lautet: localhost:8080. Wie wir sehen können, hängt die gesamte Klasse an der Adresse /hello . Das bedeutet, dass alle Methoden innerhalb dieser Klasse das Präfix localhost:8080/hello haben. Als nächstes folgt die erste Methode der Klasse. In ihrer eigenen Zuordnung wird die HTTP-Protokollmethode angegeben – eine GET-Anfrage (lesen Sie selbst mehr über die HTTP-Protokollmethoden). Was bedeutet das alles? Wenn wir eine GET-Anfrage an die Adresse localhost:8080/hello stellen, erhalten wir eine Antwort in Form der Zeichenfolge „Hallo Welt!“. Lass es uns überprüfen! In der DemoApplication-Klasse gibt es eine coole Annotation, von der man sagen kann, dass sie den gesamten Spring-Kontext im Alleingang startet – @SpringBootApplication. Die Hauptmethode dieser Klasse wird magisch, sie startet einfach die gesamte Magie, die in SpringApplication verborgen ist. Wenn Sie das Kontextmenü dieser Klasse aufrufen, werden Optionen in der Ausführungszeile angezeigt. Ich empfehle, sie frühzeitig mit einer grünen Markierung zu starten Konsole wird schöner aussehen und es wird in Zukunft einfacher sein, die Protokolle direkt von ihr zu lesen. Starten wir die Anwendung. Wenn die Konsolenausgabe stoppt, sollten Sie in der Konsole sehen
2015-09-02 09:25:36.895 INFO 5844 --- [ main] sbcetTomcatEmbeddedServletContainer: Tomcat wurde auf Port(s) gestartet: 8080 (http) 2015-09-02 09:25:36.900 INFO 5844 --- [ main] demo.DemoApplication: DemoApplication in **** Sekunden gestartet (JVM läuft für 15.501)
Dabei ist „****“ die Dauer des Anwendungsstarts :) Danach müssen Sie in einem beliebigen Browser (oder Curl oder was auch immer Sie verwenden?) die Adresse eingeben, der die Controller-Methode zugeordnet wurde
localhost:8080/Hallo
Der Browser sollte das Kanonische anzeigen
Hallo Welt!
Hier ist eine Webanwendung für Sie! Wenn Sie bemerkt haben, dass es im Controller eine andere Methode gibt, verfügt diese über eine eigene Adresszuordnung; ein Platzhalter wird zur aktuellen Adresse hinzugefügt. Was von Spring als Parameter an die Methode übergeben wird. Es ist nicht schwer zu erraten, dass die Annotation @PathVariable dafür verantwortlich ist. Also auf Anfrage
localhost:8080/hello/Ihr Name
Browser wird angezeigt
Hallo, dein Name!
Wir haben die Grundlagen von Spring Boot geklärt. Als nächstes hängen wir die Datenbank an, aber das wird im nächsten Beitrag behandelt. Danke an alle.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION