Если вы изучали вакансии на джунов-разработчиков, в 90% из них вы видели в требованиях либо знание REST API, либо SOAP API, либо оба. API – это основа практически любого проекта, без тщательно продуманных еще на стадии планирования интерфейсов разработка либо существенно затянется (и съест много денег), либо вообще застопорится. Ниже – о том, почему API всем так нужен и какой минимум вам нужно знать, чтобы утверждать: «Владею REST API».
Аббревиатура API расшифровывается как «Application Programming Interface», в переводе – интерфейс программирования приложения. Как это и бывает с аббревиатурами в IT, из расшифровки ничего не понятно, поэтому постараемся дать более человеческое определение: API – это четкий набор действий, которые вы можете совершать с приложением. Если вы уже учили ООП, то вы знаете, что такое «инкапсуляция»; так вот, API – это буквально реализация инкапсуляции. Если вы ООП не учили, то для объяснения того, зачем API нужен, понадобится подводка.
Итак, самая большая проблема в IT – сделать так, чтобы несколько человек могли слаженно работать над одной задачей. В «бородатые нулевые», когда IT еще был крайне молодой сферой и большинство сервисов/приложений писались «на коленке», каждый разработчик старался сделать что-то свое, идеальное по мнению его внутреннего перфекционизма. На словах звучит романтично, на деле же такой подход мог угробить весь проект: внезапно могло оказаться, что разработчик, ответственный за критическую часть приложения, реализовал эту самую критическую часть каким-то очень запутанным алгоритмом, а затем уволился; или решение разработчика конфликтует с остальным функционалом приложения; или два разработчика независимо друг от друга написали решение одной и той же проблемы, и теперь выясняют, чье именно решение должно использоваться в проекте.
По мере появления в IT больших денег такие проблемы становились все более и более дорогими для бизнеса, и бизнес нашел ряд решений для того, чтобы синхронизировать работу внутри команды разработки. 3 самых известных инструмента для решения проблем синхронизации – это:
Выше мы уже упоминали инкапсуляцию – один из принципов ООП. Инкапсуляция – это когда мы скрываем внутренности нашего приложения/сервиса, оставляя открытым только интерфейс, то есть конкретные способы взаимодействия с модулем.
Например, мы разработали калькулятор, который принимает на вход 2 числа и операцию, после чего отдает результат применения операции к этим числам («число 1» «операция» «число 2», «5» «+» «3»). Наш калькулятор версии 1.0 реализован довольно просто: есть класс, в котором описаны 2 целочисленные (int) переменные; у класса есть метод, который принимает 2 переменные и символ, после чего с помощью if’а перебирает символ на соответствие одному из 4-х основных (+, -, *, /), производит вычисление и возвращает результат. Если мы не пользуемся инкапсуляцией, то мы объявляем переменные как public, и любой другой кусок кода в нашей программе может напрямую записать любое значение в объект класса. И это – большая проблема, потому что любой сторонний сервис может влезть в наш объект и что-то где-то перезаписать – при неудачном стечении обстоятельств может получиться так, что «5+3» выдаст нам «-10», потому что пока наш объект производил свои вычисления, кто-то влез в объект и поменял переменные. Проблемой будет и изменение нашего собственного кода – как только мы решим для версии 1.1 переименовать переменные с «a» и «b» на «value1» и «value2», у всех, кто ссылался на «a» и «b» в своем коде, тут же все сломается, и к нам придут разбираться недовольные разработчики.
Итак, как нам решить проблему? К нашему калькулятору нужно применить инкапсуляцию – скрыть все внутренности разработки и создать интерфейс. Внутренности скрываются очень просто: делаем наши переменные private. Если кто-то на этот момент уже ссылался на них – он получит ошибку, но это – не ваша проблема. Далее мы разбиваем метод, которому передавали числа, на отдельные операции: calc.add(); calc.divide() и так далее. Эти методы мы делаем public – теперь сторонние разработчики могут ими пользоваться. Можно было, к слову, оставить единый метод, но есть золотое правило: один метод выполняет одну задачу, старайтесь этого правила придерживаться. Все, мы инкапсулировали наш калькулятор: сторонние приложения могут использовать только те методы, которые мы указали, «движок» скрыт. Если мы решим что-то поменять в алгоритме вычислений – никто ничего не узнает, при этом же ни у кого ничего не сломается.
Можно было бы сказать, что наши методы calc.add(), calc.divide() и остальные как раз и являются API – мы ведь получили программный интерфейс, который является четким набором действий. Да, у нас уже почти есть API, но ему кое-чего не хватает, и в статьях про API об этой важной детали упоминают редко. Итак, нашему API не хватает документации. Технически у публичных API может и не быть документации, но если вы хотите, чтобы ваше приложение (и его интерфейс) кого-то заинтересовали – нужно написать хотя бы минимальный гайд, который рассказывает:
Если вы создали приложение, которым могут пользоваться все – API имеет смысл выложить в публичный доступ; если у приложения есть какие-то ограничения (оно, например, платное) – можно предоставлять доступ и к самому API, и к документации по запросу (для таких API обычно выпускают токены доступа, которые получают покупатели).
Итак, как API позволяет разработчикам более эффективно взаимодействовать друг с другом? 3 пункта:
Технически под определение API подходит практически любой интерфейс, к которому можно обратиться, поэтому, например, графический интерфейс вашего компьютера или смартфона – это тоже API, к которому вы обращаетесь своими пальцами (а графический интерфейс, в свою очередь, обращается к ядру операционной системы). Но обычно при обсуждении API имеют в виду либо Web API, либо внутренний API. Внутренний API – это интерфейс, который используется строго внутри проекта: например, фронтенд обращается к бэкенду с запросом внутри сайта (наш пример API выше – тоже внутренний API). А вот Web API – это практически любой интерфейс (обычно – от стороннего разработчика), к которому можно обратиться через интернет. Видов Web API – много:
REST API – самый распространенный Web API на сторонних сайтах, поэтому если вы хотите стать разработчиком – его нужно знать обязательно. Детальный разбор REST API выходит за рамки этого материала, но если вкратце:
Что касается архитектурных принципов REST:
В Гугле. Без шуток, первое место, в котором вам стоит проверить нужный вам API – поисковик. API большинства крупных сервисов без проблем гуглятся, например:
Если найти нужный API не удалось – ищите более глубоко, в техподдержке сервиса и на Реддите. Посмотрите прайсинг сервиса – возможно, API доступен только тем, кто его оплатил. Ну а если вы и здесь ничего не найдете – возможно, нужного вам API просто нет, так тоже бывает.
Это – интерфейс, который позволяет сторонним разработчикам пользоваться вашим приложением, не вникая в суть его реализации. Вы, соответственно, тоже можете пользоваться приложениями сторонних разработчиков, если у этих приложений есть доступный вам API.
API решает проблемы синхронизации работы программистов на уровне приложений. Достигается это за счет трех преимуществ API:
Начните с принципов REST API, когда хорошо с ним разберетесь – можете «пощупать» SOAP и RPC для разнообразия.
Для начала вам нужно написать приложение, но сразу вас предупреждаем – API лучше планировать еще на стадии разработки архитектуры приложения, тогда вся разработка пойдет легче. Заложите в приложение принципы REST – клиент-серверную модель, stateless, единый интерфейс. Если приложение – достаточно объемное, можете задуматься над кэшированием и многоуровневостью (если делаете пет-проект для резюме – обязательно закладывайте и то, и то, чтобы получить RESTful). Написали приложение, реализовали API – напишите документацию. Протестируйте API на работоспособность – готово.