JavaRush /Java Blog /Random-IT /Compito di prova per l'occupazione, scopriamolo..
timurnav
Livello 21

Compito di prova per l'occupazione, scopriamolo..

Pubblicato nel gruppo Random-IT
Amici, ciao a tutti. Voglio condividere con voi la mia esperienza nella risoluzione di un compito di test per la posizione di sviluppatore Java in un'azienda russa. Dirò subito che implementare la funzionalità principale dell'incarico non è particolarmente difficile, ma come sempre i dettagli e le piccole cose sono importanti, il che mi ha impedito di inviarlo in tempo; non hanno mai risposto a nulla sull'incarico - il loro posto vacante era già riempito quando gliel'ho inviato. Ti suggerisco di esaminare il compito per vedere se ho fatto tutto ciò che mi veniva richiesto. E per coloro che non hanno idea di come realizzarlo, aggiungerò molta acqua su come l'ho affrontato. Se qualcuno è interessato a questo, benvenuto nel gatto. Dico subito che non pubblicherò qui tutta la soluzione, ma ci saranno molte spiegazioni per i principianti, se qualcuno non è interessato a leggere i miei sfoghi, ecco il progetto su github . Inizierò con il testo dell'attività stessa.
Compito di prova n. 1
Descrizione: API Server (JSON HTTP API) Strumenti di sviluppo: Java Framework: Play Framework 2.4 (o superiore) o Spring boot 1.2.3 (o superiore) Database: MySQL Protocollo: HTTP, porta 80 Funzionalità (richieste):
  1. Caricatore.
    • Trasferiamo il file (immagine avatar JPG) sul server.
    • Salviamo l'immagine in una directory sul server.
    • La risposta del server è l'URI interno dell'immagine.
  2. Aggiunta di un nuovo utente.
    • Trasferiamo i dati personali dell'utente al server (URI dell'immagine, nome utente, email, ecc.).
    • Salviamo le informazioni nel database.
    • La risposta del server è l'ID univoco del nuovo utente.
  3. Ottenere informazioni sull'utente.
    • Trasmettiamo un ID utente univoco al server.
    • Lettura delle informazioni dal database.
    • La risposta del server sono i dati personali dell'utente (vedi sopra).
  4. Modifica dello stato dell'utente (Online, Offline).
    • Trasferiamo l'ID utente univoco e il nuovo stato (Online, Offline) al server.
    • Modifica dello stato dell'utente.
    • Risposta del server: ID utente univoco, stato nuovo e precedente.
    Nota: il server sta interrogando un API/database esterno. Poiché si tratta di un'attività di test semplificata, è necessario implementare uno “stub” con accesso simulato e un ritardo di 5-10 secondi.
  5. Statistiche del server.
    • Trasferiamo i parametri al server: 1. stato del client (Online, Offline o assente), 2. ID univoco (timestamp) della richiesta (potrebbe essere assente)
    • La risposta del server è un elenco di utenti con stati e URI di immagine, nonché un ID univoco (timestamp) della richiesta.
    Nota: se la richiesta contiene parametri, il server deve filtrare la sua risposta in base ad essi. Se la richiesta contiene un ID univoco (timestamp) della richiesta (ricevuta in precedenza), il server dovrebbe restituire solo gli utenti il ​​cui stato è cambiato dopo (nel tempo) questo ID univoco (timestamp).
Requisiti obbligatori:
- RESTful. - Tutti i dati sono in formato JSON. - Il server API deve essere progettato tenendo conto che le richieste 3 e 5 hanno la priorità più alta (rispetto alle richieste 1, 2, 4) e devono essere completate il più rapidamente possibile. - Elaborazione degli errori.
Requisiti facoltativi (desiderabili):
- Documentazione del codice. - L'architettura del server API deve essere progettata per carichi elevati e scalabilità. - Test.
Risultato del test:
- Il risultato dell'attività di test deve essere fornito in un archivio e con istruzioni dettagliate per la sua distribuzione. È consigliabile allegare un Dockerfile per creare un contenitore Docker per l'attività di test. Può essere scaricato su github.com. - Dovrebbe contenere una breve documentazione dell'API creata (elenco delle richieste, parametri della richiesta, formati della richiesta, formati della risposta, ecc.). - Informazioni sul tempo impiegato nell'attività di test nel contesto di: progettazione, programmazione, documentazione, ecc. Si prega di notare che questa attività di test è intesa solo per valutare conoscenze e competenze e non mira a creare un prodotto finito (server API), pertanto sono consentite semplificazioni con spiegazioni e motivazioni.
i programmatori attenti ed esperti possono saltare la sezione successiva, qui mi occuperò del testo dell'attività stessa. L'"intestazione" dell'attività non crea alcuna difficoltà di comprensione, quindi mi limiterò a dire che la mia scelta è caduta su Spring Boot, ma non perché ci avessi già fatto qualcosa, ma perché avevo già completato un progetto reale utilizzando Primavera (ma Boot non c'era, a quanto ho capito per la sua semplicità). In base alla funzionalità del server: 1) Downloader di file. Fondamentalmente non c'è nulla di complicato qui, dovevo solo capire come vengono generalmente archiviate le immagini sul server, si è scoperto che il modo più conveniente è semplicemente inserirle in una directory speciale. Di seguito esamineremo l'implementazione specifica. 2) Aggiungere un nuovo utente, un'operazione semplice, se avete mai fatto applicazioni CRUD allora mi supporterà, in caso contrario vedrete tutto qui sotto. 3) Ottenere informazioni sull'utente. nessuna domanda: tutto è chiaro. 4)Modifica dello stato dell'utente. i primi due punti del compito sono chiari come il sole, ma per quanto riguarda la richiesta esterna??? È impossibile capirlo senza 100 g, anche adesso non sono sicuro al 100% di aver capito bene. Dettagli di seguito. 5) Statistiche del server. Anche questo è interessante. Il primo punto suggerisce di implementare un metodo con varie opzioni per i parametri, non è ancora chiaro come fare, visto che dovrebbe trattarsi di un metodo controller. il secondo punto chiede a tutti gli utenti il ​​cui stato è cambiato dopo un momento nel tempo, sembra chiaro, ma ci sono delle sottigliezze.
Iniziare
oh, quante volte ho letto questa frase mentre stavo lavorando a questo compito! Se hai mai provato a capire come impostare un progetto in Spring, ma per qualche motivo non hai mai provato Spring Boot, complimenti, rimarrai semplicemente deliziato da quello che scriverò di seguito. Ho letto da qualche parte che i programmatori trasferivano una grande quantità di codice da un progetto all'altro, questo è codice modello: impostazioni per la connessione a database, mappatura servlet, ecc. Ecc., in modo che, ad esempio, per ridurre la quantità di codice modello con cui lavorare Usiamo JPA/Hibernate per i database, nascondono alcuni modelli, ma per configurarli è necessario scrivere nuovamente un file xml o classi di configurazione. e se hai un piccolo progetto, si scopre che non scrivi meno codice, ma anche viceversa. Successivamente concluderemo il lavoro con JPA in Spring; ci sono molti progetti, ma il più conveniente è, ovviamente, Spring Data. Questo è un progetto molto grande che può funzionare probabilmente con tutto il possibile, inclusi JPA e NoSQL e un sacco di progetti diversi, è incredibilmente magico, lo useremo nel nostro progetto. Usando Spring ci liberiamo quasi delle impostazioni di connessione al database, Spring fa tutto per noi, dobbiamo solo inserire le annotazioni necessarie su transazionalità, memorizzazione nella cache e, in casi speciali, cercare su Google (guarda gli altri) alcune altre impostazioni nella configurazione del contesto. Ma allo stesso tempo, la maggior parte degli sviluppatori alle prime armi non ha assolutamente idea di come creare un progetto in primavera. Nessuno sa completamente come configurarlo per eseguire il progetto e ottenere il risultato nel browser seguendo il collegamento che inizia con localhost:8080/*. E poi entra in scena lo Spring Boot! È meglio parlare di Spring Boot con un esempio concreto! Cominciamo con lo spazio vuoto. Per creare un progetto Spring Boot, gli sviluppatori Spring hanno ideato un "costruttore" per la creazione di modelli. Puoi usarlo sul loro sito web, ma è molto più semplice farlo nel nostro IDE preferito, Intellij IDEA. E quindi: File->Nuovo->Progetto Nella finestra, vai alla scheda Spring Initializr, dovrebbe essere impostato jdk e l'URL https://start.spring.io, controlla la connessione Internet, quindi ti servirà per selezionare il nome, e poi le tecnologie che utilizzeremo, nella prima fase ci serve solo WEB: metti un segno di spunta accanto e poi il progetto viene creato. Affinché Maven possa visualizzare tutte le dipendenze, dobbiamo aprire la scheda Maven nell'idea e fare clic sul pulsante Aggiorna. Abbiamo ricevuto un modello di applicazione già pronto, che contiene tutte le impostazioni per la comunicazione client-server. Per avere una prima impressione, creiamo una classe controller (probabilmente abbiamo tutti sentito parlare di MVC). In tutte le applicazioni Spring, i controller hanno un design abbastanza semplice: questa è una classe contrassegnata con l'annotazione @Controller (sono possibili prefissi, ad esempio @RestController), questa classe è responsabile dell'elaborazione delle richieste in arrivo. Affinché il controller possa riconoscere una richiesta per un determinato indirizzo, è necessario associare questo indirizzo al metodo del controller. 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 + "!"; } } Scopriamo cosa sta succedendo qui. @RestController . esattamente l'annotazione di cui ho scritto sopra. Usiamo il rest controller perché vogliamo vedere subito il risultato e non vogliamo scrivere pagine .jsp (wow), ci sarà più semplice vedere subito il risultato nel browser come una stringa. @RequestMapping è solo un'associazione a un indirizzo. Il prefisso dell'indirizzo pubblico sarà: localhost:8080. Come possiamo vedere, l'intera classe si blocca all'indirizzo /hello , questo significa che tutti i metodi all'interno di questa classe hanno il prefisso localhost:8080/hello. Il prossimo è il primo metodo della classe, nella sua stessa mappatura è indicato il metodo del protocollo Http: una richiesta GET (leggi tu stesso i metodi del protocollo Http) Cosa significa tutto questo? effettuando una richiesta GET all'indirizzo localhost:8080/hello, riceveremo una risposta sotto forma di stringa “Hello World!”, controlliamo! Nella classe DemoApplication, c'è un'annotazione interessante che si può dire avvii da solo l'intero contesto Spring: @SpringBootApplication. Il metodo principale di questa classe diventa magico, lancia semplicemente tutta la magia nascosta in SpringApplication, se chiami il menu contestuale di questa classe, le opzioni appariranno nella riga Esegui, consiglio di avviarlo presto con un segno verde, in questo modo il la console avrà un aspetto più gradevole e in futuro sarà più semplice leggere i log direttamente da lei. Lanciamo l'applicazione. quando l'output della console si interrompe, dovresti vedere nella console
2015-09-02 09:25:36.895 INFO 5844 --- [ principale] sbcetTomcatEmbeddedServletContainer: Tomcat avviato sulle porte: 8080 (http) 2015-09-02 09:25:36.900 INFO 5844 --- [ principale] demo.DemoApplication: DemoApplication avviata in **** secondi (JVM in esecuzione per 15.501)
dove "****" è la durata del lancio dell'applicazione :) dopodiché, in qualsiasi browser (o curl, o qualunque cosa usi?) devi digitare l'indirizzo a cui è stato mappato il metodo del controller
host locale:8080/ciao
Il browser dovrebbe visualizzare il file canonical
Ciao mondo!
Ecco un'applicazione web per te! Se hai notato che esiste un altro metodo nel controller, ha una propria mappatura degli indirizzi; viene aggiunto un segnaposto all'indirizzo corrente. Che viene passato al metodo come parametro da Spring. Non è difficile intuire che la responsabilità di ciò sia l'annotazione @PathVariable. Quindi su richiesta
localhost:8080/ciao/Il tuo nome
il browser mostrerà
Ciao, il tuo nome!
Abbiamo risolto le nozioni di base di Spring Boot. Successivamente, allegheremo il database, ma sarà nel prossimo post. Grazie a tutti.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION