Привет, Хабр! Трендом ИТ стало расширение объема знаний и навыков за счет смежных компетенций. К примеру, углубленное владение инструментарием REST API, которое обычно ассоциируется с разработчиками, может быть и частью работы системного аналитика. Эта статья — набор практических задач по REST API, специально подготовленных для системных аналитиков с высоким уровнем грейда.

Кому будет полезна эта статья? Знание языков программирования не всегда требуется от системного аналитика (СА). Однако владение этими навыками может открыть новые возможности и дать вам преимущество на конкурентном рынке труда.

Тема подготовки к практическим заданиям по REST API — это продолжение обзорной статьи «Как пройти техническое интервью на позицию системного аналитика в финтех-проект» и статьи с примерами по теории REST API “25 вопросов и ответов по терминам REST API на собеседовании по вакансии системного аналитика”.

Часть задач из статьи требуют начальных знаний Python, — языка, который сегодня изучают даже в школах. Поэтому от опытного СА, с грейдом сеньор или мидл, работодатели также вправе ожидать подобных знаний. А может, вы уже изучили Python ранее, и тогда примеры заданий в статье будут для вас  просты и понятны.

Вот список заданий в этой статье:

  1. Напишите пример заголовка Content-Type в HTTP-запросе, объясните свой код и для каких целей Content-Type используется при работе с REST API

  2. Напишите пример того, как передаются параметры запроса (query parameters) в URL при использовании RESTful API. Объясните свой пример

  3. Напишите пример заголовка "Accept" в HTTP-запросе.  Объясните свой пример. Какие типы данных Accept может указывать при работе с REST API?

  4. Объясните, для каких целей можно указывать несколько типов данных в заголовке "Accept", Приведите пример такого заголовка

  5. Приведите пример HTTP-кода состояния сервера, когда запрошенный ресурс не найден, объясните свой пример

  6. Вам предоставлен HTTP GET-запрос для получения информации о товаре с идентификатором 1234 и обработкой ответа. Объясните пример кода

  7. Напишите HTTP POST-запрос для создания новой записи в базе данных. Прокомментируйте содержимое запроса

  8. Объясните пример кода для обработки ответа сервера 401 Unauthorized на запрос REST API по логину-паролю

  9. Предположим, вам поступило задание разработать REST API для управления задачами в To-Do List. Предложите точки входа

  10. Назовите принципы архитектуры микросервисов для интеграции разрабатываемого приложения с API банковской системы

SSP SOFT приглашает на позиции системного аналитика, разработчиков на Java, React и Python, 1С, инженеров DevOps и QA — см. страницу на hh.ru.

5 относительно несложных практических заданий по REST API

Начать можно с примеров относительно простых практических заданий, которые обычно получает кандидат на позицию системного аналитика (СА) с грейдом мидл. Учитывая, что общее время технического интервью не превышает 1 часа, то кандидат, выполняя задание из этого раздела, должен уложиться примерно в 5-7 минут. 

В этой части интервью по REST API, которая посвящена практическому заданию,  оценивается не только умение писать код HTTP запросов, но и понимание более широкого контекста этой технологии и особенно — способность кандидата объяснить свои ответы.

Почему так — архитектура REST API построена на определенных принципах, таких как использование HTTP-методов, ресурсов и состояний. Кандидат, который может только писать запросы, но не понимает эти принципы, может создавать неоптимальные решения. Поэтому в применяемой в компаниях балльной системе оценки кандидата способность объяснить свой код важнее, чем умение этот код написать. А теперь — переходим к примерам заданий.

1. Напишите пример заголовка Content-Type в HTTP-запросе, объясните свой код и для каких целей Content-Type используется при работе с REST API.

Ответ: Content-Type — это заголовок HTTP-запроса, который указывает на тип данных, содержащихся в теле запроса. Этот заголовок очень важен при работе с REST API, потому что он позволяет серверу правильно интерпретировать данные, которые ему отправляются, и выполнить соответствующие операции.

Пример заголовка Content-Type в HTTP-запросе:

Content-Type: application/json

В этом примере, Content-Type устанавливается в application/json, что указывает, что данные в теле запроса представлены в формате JSON. Это означает, что сервер ожидает, что данные будут валидными JSON-структурами, и будет обрабатывать их соответствующим образом.

Content-Type используется при работе с REST API по нескольким причинам:

  1. Идентификация формата данных: Позволяет серверу понять, какой тип данных он получает, чтобы правильно их обработать. Это особенно важно при отправке и приеме разных форматов, таких как JSON, XML, и HTML.

  2. Безопасность: Помогает серверу отражать атаки, основанные на неправильной обработкой данных. Например, сервер может отклонить запрос, если Content-Type не соответствует ожидаемому формату.

  3. Качество обслуживания (Quality of Service): Позволяет оптимизировать обработку данных, уменьшая нагрузку на сервер и сеть. Например, сжатие данных может быть применено, если Content-Type указывает на сжатый формат.

Резюме: Когда указанный Content-Type соответствует формату данных в теле запроса, это позволяет избежать проблем с обработкой запроса на стороне сервера.

2. Напишите пример передачи параметров запроса (query parameters) в URL при использовании RESTful API, затем объясните свой пример

Ответ: Параметры запроса (query parameters) передаются в URL RESTful API после символа вопроса ? и выглядят как пары «ключ-значение», разделенные символом амперсанда &.

Предположим, у нас есть RESTful API, предоставляющий информацию о книгах, и мы хотим получить список книг, написанных автором "Марк Твен" и опубликованных после 1870 года. Запрос может выглядеть следующим образом:

GET /api/books?author= Mark%20Twain&publishedAfter=1870

В этом примере:

- GET - это метод HTTP-запроса, который указывает на операцию "получить" информацию.

- /api/books - это путь к ресурсу (в данном случае, список книг).

- ? - символ вопроса, который отделяет путь от параметров запроса.

- author=Mark%20Twain - это параметр запроса с именем "author" и значением "Mark Twain". Пробелы в значении кодируются как "%20".

- & - символ амперсанда, который разделяет разные параметры запроса.

- publishedAfter=1870 - это второй параметр запроса с именем "publishedAfter" и значением "1870".

Резюме: Использование параметров запроса в URL позволяет клиентам передавать серверу уточняющую информацию для получения нужных данных.

3. Напишите пример заголовка "Accept" в HTTP-запросе,  объясните свой пример. Какие типы данных Accept может указывать при работе с REST API? 

Ответ: Заголовок "Accept" в HTTP-запросе используется клиентом для указания типа данных, который он готов принять от сервера. Пример заголовка "Accept" для получения данных в формате JSON выглядит так:

Accept: application/json

В этом примере "Accept: application/json" указывает, что клиент ожидает получить данные в формате JSON. Это означает, что сервер должен ответить клиенту, предоставив данные в формате JSON, если это возможно. Если сервер не может предоставить данные в указанном формате, он вернет код ошибки, например, 406 Not Acceptable (неприемлемый формат).

Заголовок "Accept" может указывать различные типы данных в зависимости от потребностей клиента. Вот распространенные типы данных в заголовке "Accept":

- application/json - для данных в формате JSON.

- application/xml - для данных в формате XML.

- text/plain - для текстовых данных без форматирования.

- text/html - для данных в формате HTML.

- image/png, image/jpeg - для изображений в соответствующих форматах.

Резюме: Использование заголовка "Accept" в HTTP-запросе позволяет задать приоритет получения данных в определенном формате.

4. Объясните, для каких целей можно указывать несколько типов данных в заголовке "Accept" и приведите пример такого заголовка.

Ответ: Указание нескольких типов данных в заголовке "Accept" позволяет клиенту определить предпочтения по отношению к форматам данных, которые клиент готов принять. Этот способ применяется, когда клиент может обрабатывать данные в нескольких форматах и предпочитает один формат, но может принять другой, если сервер не сможет предоставить данные в формате по умолчанию.

Пример заголовка "Accept" с несколькими типами данных:

Accept: application/json, application/xml, text/plain

В этом примере клиент предпочитает получить данные в формате JSON (application/json).

Если сервер поддерживает этот формат, то клиент получит данные в JSON. Однако, если сервер не может предоставить данные в JSON, клиент готов принять их в форматах XML (application/xml) или текста без форматирования (text/plain), в указанном порядке.

Резюме: В общем случае, несколько типов данных в заголовке "Accept" увеличивает гибкость и совместимость между клиентом и сервером, так как сервер может адаптироваться к предпочтениям клиента при отправке данных. Это реализуется в приложениях, когда разные клиенты могут поддерживать разные форматы данных, и сервер может выбирать наиболее подходящий формат на основе запроса клиента.

5. Приведите пример HTTP-кода состояния сервера, когда запрошенный ресурс не найден и объясните свой пример

Ответ: Когда запрошенный ресурс не найден, сервер возвращает код состояния HTTP 404 Not Found. Этот код говорит клиенту, что запрашиваемый ресурс не существует на сервере.

Пример HTTP-ответа с кодом состояния 404:

HTTP/1.1 404 Not Found
Date: хххххххх
Server: Apache
Content-Length: хх
Content-Type: text/html; charset=UTF-8
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /nonexistent -resource was not found on this server.</p>
</body></html>

В этом примере, сервер возвращает ответ HTTP 404 Not Found и сообщение, которое указывает на отсутствие запрашиваемого ресурса. Это сообщение будет отображаться клиенту в браузере или приложении, чтобы уведомить пользователя о том, что ресурс не был найден.

Резюме: Код состояния 404 позволяет клиентам и разработчикам узнать, что запрашиваемый ресурс не существует, и это часто используется веб-серверами для обработки ситуаций, когда страница или ресурс не найдены.

5 сложных практических заданий по REST API

Вторая часть статьи — для кандидата на позицию системного аналитика (СА) с грейдом мидл или сеньор, и опять таки, если позиция предполагает начальные навыки программирования. На выполнение каждого их этих заданий, скорее всего, потребуется минут 7-10.

Среди заданий есть примеры, когда кандидату потребуется небольшое знание Python, Java или других языков программирование на выбор, чтобы написать обработку ответа сервера на HTTP-запрос.

6. Объясните приложенный пример кода HTTP GET-запроса для получения информации о товаре с идентификатором 1234 и обработкой ответа

Ответ: Рассмотрим HTTP GET-запрос для получения информации о продукте с ID "1234" обработан на Python для того, чтобы вывести или информацию о товаре, или сообщение об ошибке:

import requests
url = "http://www.example.com/products/1234"
# GET-запрос
response = requests.get(url)
if response.status_code == 200:
    print(response.json())
else:
    print('Error: ' + str(response.status_code))

В этом коде мы отправляем GET-запрос к URL, который включает идентификатор продукта (в данном случае, "1234").

Если сервер возвращает статус ответа 200, это означает, что запрос был успешным, и мы выводим информацию о продукте. Если сервер возвращает статус ответа иной чем 200, это означает, что продукт не был найден, и мы выводим соответствующее сообщение об ошибке.  

Резюме: Это задание — пример обработки типового запроса о товаре. В реальном запросе заменяем URL на конечную точку нашего REST API.

7. Напишите HTTP POST-запрос для создания новой записи в базе данных и прокомментируйте содержимое запроса

Ответ: HTTP POST-запрос для создания новой записи в базе данных включает в себя тело запроса с данными, которые вы хотите добавить. Пример POST-запроса может выглядеть следующим образом:

POST /api/resource
Content-Type: application/json
{
  "field1": "value1",
  "field2": "value2",
  "field3": "value3"
}

- POST /api/resource: Это адрес эндпоинта API, куда вы отправляете запрос. Обычно POST используется для создания новых записей, и /api/resource представляет собой адрес конкретного ресурса в вашем API.

- Content-Type: application/json: Заголовок Content-Type указывает серверу, что тело запроса представляет собой данные в формате JSON.

- { "field1": "value1", "field2": "value2", "field3": "value3" }: Это тело запроса с данными, которые вы хотите добавить в базу данных. Ключи (например, field1, field2, field3) представляют собой поля в вашей таблице базы данных, а значения (например, value1, value2, value3) - значения, которые вы хотите добавить.

Резюме: Фактический формат и содержание запроса могут варьироваться в зависимости от того, как сервер API настроен для обработки таких запросов. 

8. Объясните приложенный пример кода для обработки ответа сервера 401 Unauthorized на запрос REST API по логину-паролю

Ответ: Когда сервер REST API возвращает код состояния 401 Unauthorized, это означает, что запрос не был авторизован, и клиенту не разрешен доступ к запрошенным ресурсам. Для того чтобы пройти аутентификацию, следует предоставить правильные учетные данные, в данном случае(имя пользователя и пароль.

Рассмотрим пример кода на Python, использующий библиотеку requests, для обработки ситуации 401 Unauthorized:

import requests
from requests.auth import HTTPBasicAuth
response = requests.get('http://www.example.com/products/1234', auth=HTTPBasicAuth('username', 'password'))

Вот что происходит пошагово:

from requests.auth import HTTPBasicAuth:
Эта строка импортирует класс HTTPBasicAuth из модуля auth, который является частью библиотеки requests.
HTTPBasicAuth и используется для выполнения базовой аутентификации при отправке HTTP-запросов.

response = requests.get('http://www.example.com/products/1234', auth=HTTPBasicAuth('username', 'password')):
Эта строка отправляет HTTP GET-запрос к URL 'http://www.example.com/products/1234'.

Параметр auth=HTTPBasicAuth('username', 'password') указывает, что запрос должен использовать базовую аутентификацию с именем пользователя 'username' и паролем 'password'. Ответ сервера сохраняется в переменной response.

Резюме:  Код в данном примере запрашивает имя пользователя и пароль, но в реальной ситуации,можно использовать токены, ключи API или другие методы аутентификации в зависимости от требований вашего REST API.

9. Предположим, вам поступило задание разработать REST API для управления задачами в To-Do List, в этом задании предложите точки входа

Ответ: При разработке REST API для управления задачами в списке дел можно предложить следующие точки входа:

  • GET /tasks: Получение списка всех задач.

  • GET /tasks/{id}: Получение информации о конкретной задаче по ее идентификатору.

  • POST /tasks: Создание новой задачи.

  • PUT /tasks/{id}: Обновление информации о задаче по её идентификатору.

  • DELETE /tasks/{id}: Удаление задачи по ее идентификатору.

Резюме: Задача в списке дел может включать в себя поля, такие как id, title, description, status и другие. Также потребуется реализовать возможность помечать задачи как "выполнено" или "не выполнено".

10. Назовите принципы архитектуры микросервисов для интеграции разрабатываемого приложения с API банковской системы

Ответ: Архитектура микросервисов предполагает разделение большого приложения на множество независимых сервисов, каждый из которых выполняет свою уникальную функцию и коммуницирует с другими через определенные протоколы, такие как REST API.

Вот 4 принципа архитектуры микросервисов при  интеграции нового приложения с API банковской системы:

  1. Взаимодействие через API: Все микросервисы будут взаимодействовать друг с другом через определенные API. Это позволяет интегрировать новое приложение с банковской информационной системой, поскольку можем разработать для этой цели новый микросервис, который будет взаимодействовать с банковской системой через ее API.

  2. Независимость сервисов: Каждый микросервис будет независимым и сможет работать автономно. Это означает, что если мы вносим изменения в один сервис, это не должно влиять на другие сервисы.

  3. Масштабируемость: Микросервисы можно масштабировать в зависимости от требований. Если нагрузка на определенный сервис возрастает, мы можем просто увеличить количество инстансов (экземпляров) этого сервиса.

  4. Безопасность: Поскольку каждый микросервис взаимодействует через API, мы можем контролировать доступ к каждому сервису. Это особенно важно при работе с банковской системой, где требуется высокий уровень безопасности.

Резюме: Архитектура микросервисов позволяет интегрировать новое приложение с API банковской системы, обеспечивая при этом независимость сервисов, масштабируемости и безопасности.

Заключение

В этой статье вы познакомились с 10 примерами заданий по REST API, которые могут быть использованы на техническом интервью для кандидатов на вакансию системного аналитика. Эти задания имеют повышенный уровень сложности и предназначены для оценки различных аспектов знаний и навыков кандидата в области RESTful API.

В целом, задания по REST API на техническом интервью могут быть очень разнообразны, и охватить их все в одной статье невозможно. Но можно почувствовать уровень сложности заданий в зависимости от грейда (джун, мидл, сеньор) и потренироваться на аналогичных заданиях, которые во множестве представлены на разных онлайн-ресурсах.  

Освежите к интервью знания по основам REST, HTTP-запросов, по обработке кодов состояния, работу с параметрами запроса и заголовками, а также аутентификацию. 
Посмотрите, к примеру, статью к собеседованию по теории REST API “25 вопросов и ответов по терминам REST API на собеседовании по вакансии системного аналитика”.

И главное — помните, что знания по REST API нужны не для интервью и получения оффера. Они нужны для работы над реальными проектами и помогут вам успешно справляться с задачами в сфере интеграции систем и разработки программных решений. Успехов на собеседованиях!

Комментарии (10)


  1. Robastik
    10.01.2024 07:16
    -2

    Чатжпг же, да?


  1. mmMike
    10.01.2024 07:16
    +3

    Часть задач из статьи требуют начальных знаний Python
    Рассмотрим пример кода на Python
    Вторая часть статьи — для кандидата на позицию системного аналитика (СА)

    А вы точно по проектированию HTTP вопросы задаете? А не по питону?
    Странный набор высосанных из пальца и не систематизированных вопросов.

    Т.е. аналитик должен знать питон. А если знает как пользоваться curl или postman или, например, js (не знаю уж зачем это аналитику знать JS), но не знает питон - то он все! не знает принципе протокола HTTP (как бы REST)
    Вы это серьезно?


    1. sergbe Автор
      10.01.2024 07:16
      +2

      Если в коммерческой конторе собес, то скорее вы правы. А по госстандарту требований к системному аналитику - обязан знать языки программирования. Не я выдумал, вопрос к Минтруду РФ.


  1. mello1984
    10.01.2024 07:16
    +1

    Странно, не очень понимаю, зачем системному аналитику знать, как конкретно пишутся заголовки запроса, или как на питоне написать гет...

    В каком случае он может применить эти данные? Неужели реально это спрашивают на собесах аналитиков?


    1. sergbe Автор
      10.01.2024 07:16
      +2

      Это хороший вопрос, на рынке по требованиям к знаниям СА огромный разнобой. Есть госстандарт требований к системному аналитику при найме и аттестации в госконторах. Но там совсем северный пушной зверь. Должен уметь все, кроме разве что управлять самолетами. А вот технологии машиностроения и приборостроения уже обязан знать, не говоря о языках программирования.


  1. SysManOne
    10.01.2024 07:16

    Очень странные дела ... Где Rest API и где системный анализ? Это удел пограммилл, разве нет ? И почему именно Rest API, а не , допустим RPC/XDR или TLV или ЖРПС ?


    Без претензий, просто необычно видеть такую связку. Ну и ... что делать на собеседовании если конец сервера вернул код 301 ? :-)


    1. sergbe Автор
      10.01.2024 07:16
      +1

      Rest API спрашивают на собесе на системного аналитика. Много видео о собесе СА, на Ютубе от Яндекса, разных банков и крупных компаний. Все про Rest API в том или ином объеме спрашивают.


  1. mr-garrick
    10.01.2024 07:16
    +2

    Бред какой-то! Говорите про Python и спрашиваете как вручную прописать HTTP заголовок запроса и тут же почему-то авторизация на Python. Почему не в HTTP? Почему аналитик должен знать как это делать на Python? Как на счёт всех остальных языков программирования? А вообще программисты на Python умеют делать HTTP заголовок вручную и знают куда его потом вставлять? (Господа Гусары, молчать!) Согласен что и аналитику и программисту надо знать как работает HTTP/REST и не только (...а то реально такие клоуны иногда попадаются - REST от SOAP не отличают, web-сервис и web-сервис, что ещё надо?), но вот тут какая-то несистематизированная фигня написана. Я бы предложил:

    • какие бывают типы web-сервисов (SOAP, REST, XML-RPC)

    • какие бывают типы запросов (GET, POST, PUT, DELETE), ещё про SOAP отдельная тема.

    • основные коды ответов сервера (тот же 404, 401, 500, 200)

    • какие бывают типы авторизации (Basic, Kerberos, NTLM & etc.)

    • может быть ещё - как подключится к REST сервису по HTTPS (с сертификатом, выданным сервером) и туда же - какие бывают сертификаты.

    • ну и раз уж про сервисы, то WSDL, XSD, OpenAPI, Swagger & etc.

    короче, мне не понравилось.


    1. sergbe Автор
      10.01.2024 07:16
      +1

      Понимаю вашу позицию, но уже была статья с примерами по теории REST API “25 вопросов и ответов по терминам REST API на собеседовании по вакансии системного аналитика”.


      1. mr-garrick
        10.01.2024 07:16

        Ну, если вы хотели осветить эту тему конкретно в реализации Python, то и надо было писать про Python, а не HTTP заголовки:

        • какие есть библиотеки для работы с web-серсиами в Python, в чём их разница.

        • примеры использования разных библиотек, опять же авторизация, сертификаты и пр.

        • ну, и т.п.

        только это уже не про аналитика будет.