Интерфейс прикладного программирования ( API ) — это способ взаимодействия двух или более компьютерных программ или компонентов друг с другом. Это тип программного интерфейса , предлагающий услуги другим программам . [1] Документ или стандарт, описывающий, как построить или использовать такое соединение или интерфейс, называется спецификацией API . Говорят, что компьютерная система, соответствующая этому стандарту, реализует или предоставляет API. Термин API может относиться либо к спецификации, либо к реализации. В то время как пользовательский интерфейс системы определяет, как ее конечные пользователи взаимодействуют с рассматриваемой системой, ее API определяет, как писать код, который использует возможности этой системы.
В отличие от пользовательского интерфейса , который соединяет компьютер с человеком, интерфейс прикладного программирования соединяет компьютеры или части программного обеспечения друг с другом. Он не предназначен для непосредственного использования лицом ( конечным пользователем ), кроме программиста , который включает его в программное обеспечение. API часто состоит из различных частей, которые действуют как инструменты или сервисы, доступные программисту. Говорят, что программа или программист, использующие одну из этих частей, вызывают эту часть API. Вызовы, составляющие API, также известны как подпрограммы , методы, запросы или конечные точки . Спецификация API определяет эти вызовы, то есть объясняет, как их использовать или реализовывать.
Одна из целей API — скрыть внутренние детали работы системы, раскрывая только те части, которые программист найдет полезными, и сохраняя их согласованность, даже если внутренние детали изменятся позже. API может быть специально создан для конкретной пары систем или может быть общим стандартом, обеспечивающим взаимодействие между многими системами.
Существуют API для языков программирования , библиотек программного обеспечения , компьютерных операционных систем и компьютерного оборудования . API возникли в 1940-х годах, хотя этот термин появился только в 1960-х и 1970-х годах. Современное использование термина API часто относится к веб-API , [2] которые обеспечивают связь между компьютерами, подключенными к Интернету . Недавние разработки в области API привели к росту популярности микросервисов , которые представляют собой слабосвязанные сервисы, доступ к которым осуществляется через общедоступные API. [3]
При создании приложений API упрощает программирование, абстрагируя базовую реализацию и предоставляя только те объекты или действия, которые необходимы разработчику. В то время как графический интерфейс почтового клиента может предоставить пользователю кнопку, которая выполняет все шаги по получению и выделению новых писем, API для ввода/вывода файлов может предоставить разработчику функцию , которая копирует файл из одного места в другое без требуя, чтобы разработчик понимал операции файловой системы , происходящие за кулисами. [4]
Термин API первоначально описывал интерфейс только для программ, ориентированных на конечного пользователя, известных как прикладные программы . Это происхождение до сих пор отражено в названии «интерфейс прикладного программирования». Сегодня этот термин шире и включает в себя также служебное программное обеспечение и даже аппаратные интерфейсы . [6]
Идея API намного старше, чем сам термин. Британские ученые-компьютерщики Морис Уилкс и Дэвид Уилер работали над модульной библиотекой программного обеспечения в 1940-х годах для EDSAC , одного из первых компьютеров. Подпрограммы в этой библиотеке хранились на перфоленте, спрятанной в картотеке . В этом шкафу также содержалось то, что Уилкс и Уилер назвали «библиотечным каталогом» с заметками о каждой подпрограмме и о том, как включить ее в программу. Сегодня такой каталог назвали бы API (или спецификацией API или документацией API), поскольку он инструктирует программиста, как использовать (или «вызывать») каждую подпрограмму, которая ему нужна. [6]
Книга Уилкса и Уиллера 1951 года «Подготовка программ для электронного цифрового компьютера» содержит первую опубликованную спецификацию API. Джошуа Блох считает, что Уилкс и Уиллер «скрыто изобрели» API, потому что это скорее открытая концепция, чем изобретенная. [6]
Термин «интерфейс прикладной программы» (без суффикса ‑ing ) впервые упоминается в статье под названием « Структуры данных и методы удаленной компьютерной графики» , представленной на конференции AFIPS в 1968 году. [8] [6] Авторы этой статьи используют термин «интерфейс прикладной программы» (без суффикса ‑ing). термин, описывающий взаимодействие приложения (в данном случае графической программы) с остальной частью компьютерной системы. Согласованный интерфейс приложения (состоящий из вызовов подпрограмм Фортрана ) был предназначен для того, чтобы освободить программиста от работы с особенностями устройства графического отображения и обеспечить независимость от оборудования в случае замены компьютера или дисплея. [7]
Этот термин был введен в область баз данных CJ Date [9] в статье 1974 года под названием « Реляционный и сетевой подходы : сравнение интерфейса прикладного программирования» . [10] API стал частью структуры ANSI/SPARC для систем управления базами данных . Эта платформа рассматривала интерфейс прикладного программирования отдельно от других интерфейсов, таких как интерфейс запросов. Специалисты по базам данных в 1970-х годах заметили, что эти разные интерфейсы можно комбинировать; достаточно богатый интерфейс приложения может поддерживать и другие интерфейсы. [5]
Это наблюдение привело к созданию API, поддерживающих все типы программирования, а не только программирование приложений.
К 1990 году технолог Карл Маламуд определил API просто как «набор сервисов, доступных программисту для выполнения определенных задач» . [11]
Идея API была снова расширена с появлением удаленных вызовов процедур и веб-API . Когда в 1970-х и 1980-х годах компьютерные сети стали обычным явлением, программисты захотели вызывать библиотеки, расположенные не только на их локальных компьютерах, но и на компьютерах, расположенных в других местах. Эти удаленные вызовы процедур хорошо поддерживались, в частности, языком Java . В 1990-х годах, с распространением Интернета , такие стандарты, как CORBA , COM и DCOM , конкурировали за право стать наиболее распространенным способом предоставления сервисов API. [12]
В диссертации Роя Филдинга «Архитектурные стили и проектирование сетевых программных архитектур» в Калифорнийском университете в Ирвайне в 2000 году была изложена передача репрезентативного состояния (REST) и описана идея «сетевого интерфейса прикладного программирования», который Филдинг противопоставил традиционному «библиотечному интерфейсу». на основе» API. [13] Веб-API XML и JSON получили широкое коммерческое распространение, начиная с 2000 года и продолжаясь с 2022 года. Веб-API в настоящее время является наиболее распространенным значением термина API. [2]
Семантическая сеть , предложенная Тимом Бернерсом-Ли в 2001 году, включала «семантические API», которые превращают API в открытый , распределенный интерфейс данных, а не в интерфейс поведения программного обеспечения. [14] Собственные интерфейсы и агенты получили более широкое распространение, чем открытые, но идея API как интерфейса данных прижилась. Поскольку веб-API широко используются для обмена данными всех видов в Интернете, API стал широким термином, описывающим большую часть коммуникаций в Интернете. [12] При таком использовании термин API частично совпадает по значению с термином « протокол связи» .
Интерфейс библиотеки программного обеспечения — это один из типов API. API описывает и предписывает «ожидаемое поведение» (спецификация), тогда как библиотека является «фактической реализацией» этого набора правил.
Один API может иметь несколько реализаций (или ни одной, поскольку они абстрактны) в виде разных библиотек, использующих один и тот же программный интерфейс.
Отделение API от его реализации может позволить программам, написанным на одном языке, использовать библиотеку, написанную на другом. Например, поскольку Scala и Java компилируются в совместимый байт-код , разработчики Scala могут воспользоваться преимуществами любого API Java. [15]
Использование API может варьироваться в зависимости от типа используемого языка программирования. API для процедурного языка, такого как Lua, может состоять в основном из базовых процедур для выполнения кода, манипулирования данными или обработки ошибок, тогда как API для объектно-ориентированного языка , такого как Java, будет обеспечивать спецификацию классов и их методов класса . [16] [17] Закон Хайрама [18] гласит: «При достаточном количестве пользователей API не имеет значения, что вы обещаете в контракте: все наблюдаемое поведение вашей системы будет кем-то зависеть». Между тем, несколько исследований показывают, что большинство приложений, использующих API, как правило, используют лишь небольшую часть API. [19]
Языковые привязки также являются API. Сопоставляя функции и возможности одного языка с интерфейсом, реализованным на другом языке, языковая привязка позволяет использовать библиотеку или службу, написанную на одном языке, при разработке на другом языке. [ нужна цитата ]
Такие инструменты, как SWIG и F2PY, генератор интерфейсов Fortran - Python , облегчают создание таких интерфейсов. [20]
API также может быть связан с программной платформой : платформа может быть основана на нескольких библиотеках, реализующих несколько API, но в отличие от обычного использования API, доступ к поведению, встроенному в структуру, опосредован расширением ее содержимого новыми классами. подключен к самому фреймворку.
Более того, общий поток управления программой может выйти из-под контроля вызывающей стороны и оказаться в руках платформы из-за инверсии управления или аналогичного механизма. [21] [22]
API может определять интерфейс между приложением и операционной системой . [23] POSIX , например, предоставляет набор общих спецификаций API, целью которых является обеспечение возможности компиляции приложения, написанного для операционной системы, соответствующей POSIX, для другой операционной системы, соответствующей POSIX.
Linux и Berkeley Software Distribution являются примерами операционных систем, реализующих API POSIX. [24]
Microsoft продемонстрировала твердую приверженность обратно совместимому API, особенно в своей библиотеке Windows API (Win32), поэтому старые приложения могут работать в более новых версиях Windows с использованием настройки для конкретного исполняемого файла, называемой «Режим совместимости». [25]
API отличается от двоичного интерфейса приложения (ABI) тем, что API основан на исходном коде, а ABI — на двоичном коде. Например, POSIX предоставляет API, а стандартная база Linux предоставляет ABI. [26] [27]
Удаленные API позволяют разработчикам манипулировать удаленными ресурсами с помощью протоколов — конкретных стандартов связи, которые позволяют различным технологиям работать вместе, независимо от языка или платформы. Например, API подключения к базе данных Java позволяет разработчикам запрашивать множество различных типов баз данных с одним и тем же набором функций, в то время как API удаленного вызова методов Java использует протокол удаленного метода Java, чтобы разрешить вызов функций, которые работают удаленно, но кажутся локальными для разработчик. [28] [29]
Таким образом, удаленные API полезны для поддержки абстракции объекта в объектно-ориентированном программировании ; вызов метода , выполняемый локально на прокси- объекте, вызывает соответствующий метод на удаленном объекте, используя протокол удаленного взаимодействия, и получает результат для локального использования в качестве возвращаемого значения.
Модификация прокси-объекта также приведет к соответствующей модификации удаленного объекта. [30]
Веб-API — это служба, доступ к которой осуществляется с клиентских устройств (мобильных телефонов, ноутбуков и т. д.) на веб-сервере с использованием протокола передачи гипертекста (HTTP). Клиентские устройства отправляют запрос в форме HTTP-запроса и получают ответное сообщение, обычно в формате нотации объектов JavaScript ( JSON ) или расширяемого языка разметки ( XML ). Разработчики обычно используют веб-API для запроса на сервер определенного набора данных с этого сервера.
Примером может служить API транспортной компании, который можно добавить на веб-сайт, ориентированный на электронную коммерцию, чтобы облегчить заказ услуг доставки и автоматически включать текущие тарифы на доставку, без необходимости разработчику сайта вводить таблицу тарифов грузоотправителя в веб-базу данных. Хотя «веб-API» исторически был фактически синонимом веб-сервиса , недавняя тенденция (так называемый Web 2.0 ) отходит от веб-сервисов на основе простого протокола доступа к объектам ( SOAP ) и сервис-ориентированной архитектуры (SOA) к более прямому подходу. Веб-ресурсы в стиле репрезентативной передачи состояния (REST) и ресурсно-ориентированная архитектура (ROA). [31] Частично эта тенденция связана с движением семантической сети к структуре описания ресурсов (RDF), концепции продвижения веб- технологий разработки онтологий . Веб-API позволяют объединять несколько API в новые приложения, известные как гибридные приложения . [32]
В пространстве социальных сетей веб-API позволили веб-сообществам облегчить обмен контентом и данными между сообществами и приложениями. Таким образом, контент, динамически создаваемый в одном месте, можно публиковать и обновлять в нескольких местах в Интернете. [33] Например, REST API Twitter позволяет разработчикам получать доступ к основным данным Twitter, а API поиска предоставляет разработчикам методы взаимодействия с данными поиска Twitter и тенденциями. [34]
Дизайн API оказывает существенное влияние на его использование. [4] Прежде всего, проектирование программных интерфейсов представляет собой важную часть архитектуры программного обеспечения , организации сложной части программного обеспечения. [35] Принцип сокрытия информации описывает роль программных интерфейсов как обеспечение возможности модульного программирования путем сокрытия деталей реализации модулей, чтобы пользователям модулей не приходилось понимать сложности внутри модулей. [36] Помимо предыдущего основного принципа, другие показатели для измерения удобства использования API могут включать такие свойства, как функциональная эффективность, общая правильность и обучаемость для новичков. [37] Одним из простых и широко распространенных способов разработки API является следование рекомендациям Нильсена по эвристической оценке. Шаблон фабричного метода также типичен при разработке API из-за его возможности многократного использования. [38] Таким образом, при разработке API делается попытка предоставить только те инструменты, которые ожидает пользователь. [4]
Интерфейс прикладного программирования может быть синхронным или асинхронным . Синхронный вызов API — это шаблон проектирования, в котором сайт вызова блокируется во время ожидания завершения вызываемого кода. [39] Однако при асинхронном вызове API сайт вызова не блокируется во время ожидания завершения вызываемого кода, а вместо этого вызывающий поток уведомляется о прибытии ответа.
Безопасность API очень важна при разработке общедоступного API. Распространенные угрозы включают SQL-инъекцию , атаку типа «отказ в обслуживании» (DoS), нарушение аутентификации и раскрытие конфиденциальных данных. [40] Без обеспечения надлежащих мер безопасности злоумышленники могут получить доступ к информации, которой они не должны иметь, или даже получить привилегии для внесения изменений на ваш сервер. Некоторые распространенные методы обеспечения безопасности включают в себя надлежащую безопасность соединения с использованием HTTPS , безопасность контента для предотвращения атак путем внедрения данных и требование ключа API для использования вашего сервиса. [41] Многие общедоступные службы API требуют от вас использования назначенного ключа API и отказываются предоставлять данные без отправки ключа вместе с вашим запросом. [42]
API — один из наиболее распространенных способов интеграции технологических компаний. Те, кто предоставляют и используют API, считаются членами бизнес-экосистемы. [43]
Основные правила выпуска API: [44]
Важным фактором, когда API становится общедоступным, является его «стабильность интерфейса». Изменения в API — например, добавление новых параметров в вызов функции — могут нарушить совместимость с клиентами, которые зависят от этого API. [48]
Если части публично представленного API могут быть изменены и, следовательно, нестабильны, такие части конкретного API должны быть явно задокументированы как «нестабильные». Например, в библиотеке Google Guava части, которые считаются нестабильными и которые могут вскоре измениться, помечены аннотацией Java @Beta
. [49]
Публичный API иногда может объявлять свои части устаревшими или аннулированными. Обычно это означает, что часть API следует рассматривать как кандидата на удаление или изменение с обратной совместимостью. Таким образом, эти изменения позволяют разработчикам отказаться от частей API, которые будут удалены или не будут поддерживаться в будущем. [50]
19 февраля 2020 года Akamai опубликовала свой ежегодный отчет «Состояние Интернета», демонстрирующий растущую тенденцию киберпреступников, нацеленных на публичные платформы API финансовых услуг по всему миру. С декабря 2017 по ноябрь 2019 года Akamai стала свидетелем 85,42 миллиарда атак с нарушением учетных данных. Около 20%, или 16,55 миллиардов, были против имен хостов, определенных как конечные точки API. Из них 473,5 миллиона были нацелены на организации сектора финансовых услуг. [51]
Документация API описывает услуги, которые предлагает API, и способы их использования, стремясь охватить все, что клиенту необходимо знать для практических целей.
Документация имеет решающее значение для разработки и обслуживания приложений, использующих API. [52] Документация по API традиционно находится в файлах документации, но ее также можно найти в социальных сетях, таких как блоги, форумы и веб-сайты вопросов и ответов. [53]
Традиционные файлы документации часто представляются через систему документации, такую как Javadoc или Pydoc, которая имеет единообразный внешний вид и структуру. Однако типы контента, включенные в документацию, различаются в зависимости от API. [54]
В целях ясности документация API может включать описание классов и методов API, а также «типичные сценарии использования, фрагменты кода, обоснование дизайна, обсуждения производительности и контракты», но подробности реализации самих сервисов API обычно опущен.
Справочная документация для REST API может быть сгенерирована автоматически из документа OpenAPI, который представляет собой машиночитаемый текстовый файл, использующий предписанный формат и синтаксис, определенные в спецификации OpenAPI . Документ OpenAPI определяет базовую информацию, такую как имя и описание API, а также описывает операции, к которым API предоставляет доступ. [55]
Документация API может быть дополнена метаданными, например аннотациями Java . Эти метаданные могут использоваться компилятором, инструментами и средой выполнения для реализации пользовательского поведения или пользовательской обработки. [56]
В 2010 году корпорация Oracle подала в суд на Google за распространение новой реализации Java, встроенной в операционную систему Android. [57] Google не получила никакого разрешения на воспроизведение Java API, хотя разрешение было дано аналогичному проекту OpenJDK. Google обратилась к Oracle с просьбой договориться о лицензии на их API, но получила отказ из-за проблем с доверием. Несмотря на разногласия, Google все равно решил использовать код Oracle. Судья Уильям Алсап постановил в деле Oracle против Google , что API не могут быть защищены авторским правом в США и что победа Oracle широко расширила бы защиту авторских прав до «функционального набора символов» и разрешила бы защиту авторских прав на простые программные команды:
Принять требование Oracle означало бы разрешить кому-либо защищать авторские права на одну версию кода для выполнения системы команд и тем самым запретить всем остальным писать разные версии для выполнения всех или части одних и тех же команд. [58] [59]
Решение Алсупа было отменено в 2014 году по апелляции в Апелляционный суд Федерального округа , хотя вопрос о том, является ли такое использование API добросовестным использованием , остался нерешенным. [60] [61]
В 2016 году после двухнедельного судебного разбирательства присяжные постановили, что повторное внедрение API Java со стороны Google представляет собой добросовестное использование , но Oracle пообещала обжаловать это решение. [62] Oracle выиграла апелляцию: Апелляционный суд Федерального округа постановил, что использование Google API-интерфейсов не соответствует критериям добросовестного использования. [63] В 2019 году Google подала апелляцию в Верховный суд США по поводу постановлений об авторских правах и добросовестном использовании, и Верховный суд удовлетворил решение. [64] Из-за пандемии COVID-19 устные слушания по делу были отложены до октября 2020 года. [65]
Дело было решено Верховным судом в пользу Google решением 6–2. Судья Стивен Брейер высказал мнение суда и в какой-то момент упомянул, что «декларирующий код, если он вообще защищен авторским правом, дальше, чем большинство компьютерных программ, с точки зрения авторского права». Это означает, что код, используемый в API, с точки зрения защиты авторских прав больше похож на словари, чем на романы. [66]
Когда вы слышите аббревиатуру «API» или его расширенную версию «Интерфейс прикладного программирования», это почти всегда относится к нашему современному подходу, заключающемуся в том, что мы используем HTTP для предоставления доступа к машиночитаемым данным в формате JSON или XML, часто просто называемые «веб-API». API существуют почти так же давно, как компьютеры, но современные веб-API начали формироваться в начале 2000-х годов.