JavaRush /Java Blog /Random-TL /Test task para sa trabaho, alamin natin ito..
timurnav
Antas

Test task para sa trabaho, alamin natin ito..

Nai-publish sa grupo
Mga kaibigan, kumusta sa lahat. Gusto kong ibahagi sa iyo ang aking karanasan sa paglutas ng isang pagsubok na gawain para sa posisyon ng isang developer ng Java sa isang kumpanyang Ruso. Sasabihin ko kaagad na ang pagpapatupad ng pangunahing pag-andar ng takdang-aralin ay hindi partikular na mahirap, ngunit gaya ng nakasanayan, ang mga detalye at maliliit na bagay ay mahalaga, na humadlang sa akin na maisumite ito sa oras; hindi sila sumagot ng anuman tungkol sa takdang-aralin - ang kanilang bakante napuno na nung pinadala ko sa kanila. Iminumungkahi kong tingnan mo ang gawain upang makita kung ginawa ko ang lahat ng hinihiling sa akin. At para sa mga walang ideya kung paano gawin ito, magdadagdag ako ng maraming tubig tungkol sa kung paano ko ito hinarap. Kung sinuman ang interesado dito, maligayang pagdating sa pusa. Sasabihin ko kaagad na hindi ko ipo-post ang buong solusyon dito, ngunit magkakaroon ng maraming mga paliwanag para sa mga nagsisimula, kung sinuman ang hindi interesadong basahin ang aking pagbubuhos, narito ang proyekto sa github . Magsisimula ako sa teksto ng mismong gawain.
Gawain sa pagsusulit Blg. 1
Paglalarawan: API Server (JSON HTTP API) Development Tools: Java Framework: Play Framework 2.4 (o mas mataas) o Spring boot 1.2.3 (o mas mataas) Database: MySQL Protocol: HTTP, port 80 Functionality (mga kahilingan):
  1. Loader.
    • Inilipat namin ang file (JPG avatar picture) sa server.
    • I-save namin ang imahe sa isang direktoryo sa server.
    • Ang tugon ng server ay ang panloob na URI ng larawan.
  2. Pagdaragdag ng bagong user.
    • Inilipat namin ang personal na data ng user sa server (URI ng larawan, username, email, atbp.).
    • I-save namin ang impormasyon sa database.
    • Ang tugon ng server ay ang natatanging ID ng bagong user.
  3. Pagkuha ng impormasyon tungkol sa gumagamit.
    • Nagpapadala kami ng natatanging user ID sa server.
    • Pagbabasa ng impormasyon mula sa database.
    • Ang tugon ng server ay ang personal na data ng user (tingnan sa itaas).
  4. Pagbabago ng katayuan ng user (Online, Offline).
    • Inilipat namin ang natatanging user ID at bagong status (Online, Offline) sa server.
    • Pagbabago ng katayuan ng gumagamit.
    • Tugon ng server - natatanging user ID, bago at dating katayuan.
    Tandaan: Ang server ay nagtatanong ng isang panlabas na API/database. Dahil ito ay isang pinasimpleng gawain sa pagsubok, kinakailangan na magpatupad ng isang "stub" na may simulate na pag-access at isang pagkaantala ng oras na 5-10 segundo.
  5. Mga istatistika ng server.
    • Naglilipat kami ng mga parameter sa server: 1. status ng kliyente (Online, Offline o wala), 2. natatanging ID (timestamp) ng kahilingan (maaaring wala)
    • Ang tugon ng server ay isang listahan ng mga user na may mga status at picture URI, pati na rin ang isang natatanging ID (timestamp) ng kahilingan.
    Tandaan: Kung ang kahilingan ay naglalaman ng mga parameter, dapat i-filter ng server ang tugon nito sa pamamagitan ng mga ito. Kung ang kahilingan ay naglalaman ng isang natatanging ID (timestamp) ng kahilingan (natanggap nang mas maaga), ang server ay dapat na magbalik lamang ng mga user na ang mga katayuan ay nagbago pagkatapos (sa oras) ng natatanging ID na ito (timestamp).
Mga kinakailangang kinakailangan:
- RESTful. - Все данные в формате JSON. - Сервер API должен быть спроектирован с учетом того, что requestы 3 и 5 имеет высший приоритет (по отношению к requestам 1, 2, 4) и должны быть выполнены максимально быстро. - Обработка ошибок.
Необязательные требования (желательно):
- Документирование codeа. - Архитектура Сервера API должна быть рассчитана на высокую нагрузку и масштабирование. - Тесты.
Результат тестового задания:
- Результат тестового задания должен быть предоставлен в архиве и с подробной инструкцией по его развертыванию. Желательно приложить Dockerfile для сборки Docker контейнера для тестового задания. Можно загрузить на github.com. - Должен содержать краткую documentацию созданного API (список requestов, параметры requestов, форматы requestов, форматы ответов и т.д.). - Информация о времени потраченном на тестовое задание в разрезе: проектирование, программирование, documentация и т.д. Обращаем внимание, что это тестовое задание предназначено только для оценки знаний и умений, а не ставит целью создание законченного продукта (serverа API), поэтому допускаются упрощения с объяснением и указанием причин.
внимательные и опытные программисты могут пропустить следующий раздел, тут я буду разбираться с самим текстом задания. "Шапка" задания не вызывает ниHowих сложностей с восприятием, поэтому просто скажу что мой выбор пал на Spring Boot, но не потому что я уже когда-то что-то на нем делал, а потому что я уже прошел реальный проект с использованием Spring (но Boot'а там не было, How я понимаю из-за его простоты). По функционалу serverа: 1) Загрузчик файлов. Тут принципиально ничего сложного нет, мне нужно было просто разобраться How картинки вообще хранятся на serverе, оказалось, что наиболее удобным способом является простое размещение их в Howой-нибудь специально отведенной для этого директории. Конкретную реализацию разберем ниже. 2) Добавление нового пользователя, простая операция, если вы делали когда-нибудь CRUD applications, то он поддержит меня, если нет - всё увидите ниже. 3)Получение информации о пользователе. нет вопросов - всё ясно. 4)Изменение статуса пользователя. первые два пункта задания ясны How день, а что там с внешним requestом??? тут без 100гр не разобраться, я даже сейчас на 100% не уверен правильно ли я понял. Детали ниже. 5)Статистика serverа. Тут тоже интересно. первым пунктом предлагается реализовать метод с различными вариантами параметров, пока не понятно How это делать учитывая что это должен быть метод контроллера. вторым пунктом спрашивают всех юзеров, у кого изменился статус после момента времени вроде понятно, но есть тонкости.
Getting Started
ох, сколько раз я читал эту фразу, пока разбирался с этим заданием! Если вы пробовали когда нибудь разбираться в настройке проекта на Spring, но при этом по Howой-то причине так ни разу и не попробовали Spring Boot, поздравляю вас, вы испытаете просто восторг от того, что я напишу ниже. Я где-то вычитал, что раньше программисты очень большое количество codeа раньше переносor из проекта в проект, это шаблонный code - настройки подключения к базам данных, маппинг сервлетов и прочее-прочее, так вот чтобы, например, уменьшить объем шаблонного codeа для работы с базами данных мы используем JPA/Hibernate, они скрывают часть шаблонов но чтобы настроить их опять же нужно писать xml файл or конфигурационные классы. а если у вас маленький проект, то получается что ни фига вы не меньше codeа пишете, а даже наоборот. Дальше мы оборачиваем работу с JPA в Спринг, есть много проектов, но наиболее удобный это, конечно же, Spring Data. Это очень большой проект который может работать наверное со всем чем можно и JPA и NoSQL еще целую кучу разных проектов, он невероятно магический мы будем его использовать в нашем проекте. Используя Spring мы почти избавляемся от настроек соединения с БД, Spring все делает за нас, нам только нужно навтыкать нужных аннотаций по транзакционности, кешированию и в особых случаях нагуглить (подсмотреть у других) еще Howих-нибудь настроек в кофигурации контекста. Но при этом у большинства начинающих разработчиков нет абсолютно ниHowого понятия How создать проект на Spring. Никто не знает fully How его настроить чтобы запустить проект и получить результат в браузере пройдя по ссылке начинающейся с localhost:8080/*. И тут на сцену выходит Spring Boot! Про Spring Boot лучше рассказать на конкретном примере! Начнем с заготовки. Whatбы создать проект Spring Boot разработчики Spring придумали "конструктор" создания шаблонов. Им можно воспользоваться на их сайте, но гораздо проще сделать это в нашей любимой IDE Intellij IDEA. И так: File->New->Project В окне переходим на вкладку Spring Initializr, в ней должно быть выставлено jdk, и URL https://start.spring.io, проверяем подключение к интернету, далее нужно будет выбрать название, а затем технологии которые мы будем использовать, на первом этапе нам нужно только WEB - ставим рядом с ней галочку и далее создается проект. Whatбы мавен подтянул все зависимости нам нужно открыть вкладку Maven в идее и нажать кнопку обновить. Мы получor готовый шаблон applications, в котором зарыты все настройки для клиент-serverного общения. Whatбы получить первое впечатление создадим класс контроллера(про MVC-то уж наверняка все слышали). Во всех Spring applicationsх контроллеры имеют достаточно простую конструкцию - это класс, который помечен аннотацией @Controller(возможны префиксы, например, @RestController), этот класс отвечает за обработку входящих requestов. Для того, чтобы контроллер распознал request на Howой-нибудь address нужно сделать маппинг этого address на метод контроллера. Ниже представлен code этого класса, пока мы будем работать без иехрархии директорий, поэтому положим его в один пакадж с классом созданным автоматически Initializr'ом, у меня он называется DemoApplication. 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 + "!"; } } разберемся что тут. @RestController. How раз та annotation, о которой я писал выше. именно рестконтроллер используем поскольку мы хотим сразу увидеть результат и не хотим писать pages.jsp (фу-Howа), нам будет проще сразу увидеть результат в браузере в виде строки. @RequestMapping - How раз привязка к addressу. префикс общего address будет такой: localhost:8080. Как мы видим весь класс висит на addressе /hello, это означает что все методы внутри этого класса имеют префикс localhost:8080/hello. Далее первый метод класса, в его собственном маппинге указан метод Http протокола - request GET(про методы Http протокола почитайте сами) What это всё означает? обратившись GET requestом на address localhost:8080/hello - получим ответ в виде строки "Hello World!", давайте проверим это! В классе DemoApplication, есть одна крутая annotation, которая можно сказать в одиночку запускает весь контекст спринга - @SpringBootApplication. Метод main этого класса становится волшебным, How раз запускает всю магию скрытую в SpringApplication, если вызвать контекстное меню на этом классе то в строке Run появятся варианты, рекомендую запускаться раном с зеленой меткой, так консоль будет приятнее выглядеть и в будущем будет проще читать логи прям из нее. Запускаем приложение. когда вывод в консоль прекратится, вы должны увидеть в консоли
2015-09-02 09:25:36.895 INFO 5844 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 2015-09-02 09:25:36.900 INFO 5844 --- [ main] demo.DemoApplication : Started DemoApplication in **** seconds (JVM running for 15.501)
где "****" - длительность запуска applications :) после этого в любом браузере (or curl, or чем там вы пользуетесь?) нужно набрать address на который замапor метод контроллера
localhost:8080/hello
В браузере должно отобразиться каноническое
Hello World!
вот вам и веб приложение! Если вы заметor в контроллере есть еще один метод, там есть собственный маппинг address, к текущему addressу добавляется плейсхолдер. Который спрингом передается в метод в качестве параметра. Не трудно догадаться что за это отвечает annotation @PathVariable. Так на request
localhost:8080/hello/Ваше Name
браузер покажет
Hello, Ваше Name!
С основами Spring Boot разобрались. Далее прикрутим базу данных, но это будет уже в следующем посте. Всем спасибо.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION