Меню

Как подключить апи к сайту

Рекомендации при подключении API

Как мы интегрировали в наш проект много разношерстных API, с какими проблемами столкнулись и какие решения нашли.

Владислав Балаклейский, Технический директор Aviata.kz

Сегодня расскажу о том, как мы интегрировали в наш проект много разношерстных API, какие проблемы мы выловили и какие выводы из этого сделали.

Как вы понимаете, весь наш сервис построен на работе с API.

В рамках этой презентации я условно разбиваю API на 2 типа: доступные и закрытые.

Под доступными подразумеваются в первую очередь открытые, широко распространенные, хорошо документированные API, с большим комьюнити. За примерами далеко ходить не придется и вы о них наверняка слышали. Мы используем AWS SES, Google Drive, Firebase. К тому же очень часто для их использования уже есть набор готовых клиентов под разные языки программирования. Также есть комьюнити и возможность вести обсуждение или искать решение багов в stack overflow.

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

Когда я составил для себя этот список проблем, я понял что такие же симптомы есть и в наших собственных API. Давайте пройдемся по деталям и найдем к ним верное решение.

Подготовка к работе

Что же нужно запросить от поставщика, чтобы как можно скорее начать работу.

Ранее мы с вами говорили о том, чтобы писать клиент на основе самого сложного и разнообразного кейса в вашем процессе. Но когда вы получили доступы в тестовую среду, получили документацию и примеры запросов я советую провести тест всего процесса с минимальным количеством данных. Взять Postman или аналогичный инструмент для отправки запросов и отправить сырые запросы например (XML) от авторизации до выписки билетов. Если MVP требует реализации возвратов билетов, проверьте и их тоже. Почему это важно? На стороне поставщика не всегда все сразу настроено как положено. Для нас с вами это черный ящик, мы даже не подразумеваем какие у них есть настройки, локали, и т.д. Лучше сразу понять что не работает из всего процесса, чтобы поставщик это исправил, настроил, пока вы только начинаете интеграцию.

Технические проблемы с реализацией

Неописанные параметры

Когда приходит задача интегрироваться с сложным API, очень часто хочется как можно скорее просто начать работать. Это может быть ошибкой.Например, делая одну из интеграций мы по готовой инструкции сделали запрос на поиск из Алматы в Нур-Султан на 1 пассажира. Получили результаты с перелетами, и даже забронировали билет. Все это сделали сразу в клиенте.

У этого параметра такое количество значений:

Стоит ли говорить о том, что описания к этим значениям в API нет. Не зная, на что он в принципе влияет, мы использовали то, что было дано в примере и вроде бы все пошло хорошо. Нам вернулись результаты поиска:

По сути это одноуровневый список перелетов, но так как мы запрашивали перелет туда-обратно, а нам выдали список перелетов из одного уровня, то мы начали комбинировать их друг с другом, складывая стоимость перелета, учитывать время вылета, если это полет туда и обратно в один и тот же день, сортировать по цене. CombinabilityNestedRoundtripOnlyLowestFarePerFareType сразу. Вот только этот параметр меняет структуру выдачи и теперь она выглядит так:

Оказывается все это уже готово на стороне API и мы можем для этого использовать параметр CombinabilityNestedRoundtripOnlyLowestFarePerFareType сразу. Вот только этот параметр меняет структуру выдачи и теперь она выглядит так:

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

Читайте также:  Аэропорт внуково вай фай как подключить

В итоге мы переписываем часть клиента, отвечающего за поиск, чтобы он учитывал вложенные перелеты и не комбинировал самостоятельно.

Не используются полные реальные данные

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

Например, для интеграции сервиса ЖД мы использовали свои данные для бронирования, однако уже в релизе столкнулись с тем, что Казахские символы не отображались в PDF билете, который генерировался из HTML. Пришлось экстренно костылить библиотеку, которая сначала генерировала docx файл с казахским шрифтом, а уже оттуда делали PDF.

Какой следует из этого вывод? Для интеграции надо сразу использовать наиболее сложный процесс и с самыми разными и что важно реальными данными. Для написания клиента это будет сложно и займет много времени, но зато сэкономит нервы при переписывании его.

Размер данных

Старые API очень часто используют XML\WSDL форматы. Как по мне это устаревшие и сложные для чтения\восприятия форматы. И к тому же, они многословные, что по итогу приводит к большому объему данных. Например, некоторые GDS на результаты поиска выдают 1.6 мб данных, а если запросить результаты на соседние даты, то получится 20 мб. Это накладывает свой отпечаток на скорость обработки. Поэтому когда мы использовали библиотеку suds для обработки SOAP\WSDL результатов, у нас все тормозило. Пришлось переключиться на стандартную низкоуровневую библиотеку xml. Работать с ней не так приятно, но скорость важнее. Поэтому проверьте какой объем данных вы получаете от API и сравните производительность разных библиотек.

Тоже самое касается и хранения данных. В результате бронирования нам приходит огромный пласт данных в XML. Не все эти данные нам нужны для использования в проекте, поэтому мы выделяем нужные и сохраняем в удобном нам формате. Раньше мы распределяли их по сущностям в классы с большой вложенностью, практически как в исходном XML ответе. А затем сохраняли сериализованный класс в базу. Это отстой, не делайте так. Потому что с годами ваши классы обрастают новыми методами и атрибутами, и когда спустя время вы десериализуете старую бронь у нее не будет этих методов. Лучше переводите все в JSON структуру. Весит меньше, легче читается.

Авторизация

В 2 из 5 случаях подключения к API у нас возникали трудности с авторизацией. Обычно до запуска в продакшн на моменте тестирования вы отправляете запросы и API сервис реагирует вполне нормально. Отдает ответ вовремя, без задержек и ошибок. Что происходит, когда вы выкатываете ваш сервис в продакшн? Параллельно пойдут сотни и тысячи запросов в API.

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

Во втором случае авторизационная сессия становилась невалидной после процесса бронирования. Поэтому для каждого нового процесса (от поиска до бронирования) надо было запрашивать новую сессию.

Так что внимательно и детально уточняйте процесс работы с авторизацией.

Заключение

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

Итоговый чек-лист

К сожалению, чек-лист не является решением всех проблем, и будет здорово, если мы сможем все вместе его дополнить в комментариях.

Читайте также:  Зонателеком любимый номер как подключить

Источник

Как использовать API сайта, у которого нет API?

У меня достаточно часто появляется задача получить данные от стороннего сайта, при этом далеко не всегда этот сайт предоставляет возможность удобно получить эти данные через API. Единственное решение в таком случае — парсить html содержимое страниц. Когда-то я писал регэкспы, потом появились библиотеки, позволяющие получить нужное содержимое по css-селектору, а сейчас и это кажется сложной задачей, которую хотелось бы упростить.

Сегодня я хочу рассказать вам о моей небольшой библиотеке, позволяющей описать в API-стиле http-запросы и парсить ответ сервера в нужный вам формат.

Примечание: не стоит забывать об авторских правах, если вы используете чужие данные.

Установка

Библиотека доступна к установке через composer, поэтому все, что необходимо сделать — это добавить зависимость «sleeping-owl/apist»: «1.*» в ваш composer.json и вызвать composer update.

У данной библиотеки нет зависимостей от каких-либо фреймворков, поэтому вы можете использовать ее с любым фреймворком, либо же в чистом PHP-проекте. Для сетевых запросов используется Guzzle, для манипуляций с dom-деревом используется «symfony/dom-crawler».

Использование

После установки вы можете приступить к созданию нового класса, олицетворяющего API нужного вам сайта. Библиотека не накладывает никаких ограничений на то, как и где вы будете создавать свой класс. Нужно расширить класс SleepingOwl\Apist\Apist и указать базовый урл:

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

Здесь метод «get» — это тип используемого http-запроса, также доступны остальные методы (post, put, patch, delete и т.д.).
Первый параметр — урл данного метода, он может быть как относительным, так и абсолютным.
Второй параметр — это и есть та основа, из-за которой я создал эту библиотеку. Он описывает структуру, которую необходимо получить в результате вызова данного метода. Это может быть как массив, так и одиночное значение. То есть для описанного выше метода результат будет такого вида:

Примечание: результат будет типа array, json-формат здесь использован для удобства.

Третьим опциональным параметром могут идти любые дополнительные параметры запроса, get или post переменные, загружаемые файлы, заголовки запроса и т.п. С полным списком можно ознакомиться в документации Guzzle.

Создание фильтров

Пара слов о том, как это работает: каждый объект, созданный через Apist::filter($cssSelector) после загрузки данных заменяется на нужное значение, он сохраняет не только сам селектор, по которому он будет искать данные, но и всю вереницу вызовов, которые к нему были применены. После загрузки данных он пытается применить эти методы к найденным элементам.

Исходники демо-класса HabrApi.php, используемого в примерах на сайте проекта можно посмотреть здесь.

Upd: в версии 1.2.0 добавилась возможность инициализировать апи из yaml файла, подробнее можно посмотреть в документации.

Источник

Как подключить апи к сайту

13 ноября 2017 Опубликовано в разделах: Азбука терминов. 15229

Что значит API

Простейшей аналогией использования API будет процесс работы на калькуляторе для сложных вычислений. Допустим, у вас есть задача, вы можете понимать её суть, строить уравнения и графики, но не умеете совершать арифметические действия с цифрами. Рядом с вами лежит калькулятор, умеющий делать эти операции с легкостью. Вы не знаете, что происходит внутри вычислительной машины, да и знать это не обязательно. Вы отдаёте информацию в одном виде, а получаете в другом, нужном для ваших целей.

По такому принципу работает любое API. Вам все равно, как программа получает ответ, какой путь проходит запрос внутри неё, как производятся вычисления. Вы уверены только в одном – в ответ будет выдана стандартизированная информация об успехе операции или её ошибке.

Читайте также:  Как подключить антенну через розетку к телевизору

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

Плюсы:

Минусы:

Примеры API

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

VKAPI

Внешний интерфейс взаимодействия популярной социальной сети ВКонтакте с клиентами, а также с браузерными и серверными приложениями. Позволяет управлять сообщениями сообществ, обложками групп, страницами пользователей при наличии соответствующих ключей доступа.

Все запросы осуществляются к адресу https://api.vk.com/method/

После слэша идёт наименование используемого API-метода и передаются GET-параметры запроса. Ответ так же приходит по HTTPS в формате JSON.

TELEGRAM BOT API

Одно из самых популярных API. С его помощью осуществляется контроль ботов в мессенджере Telegram. После создания бота через @botfather и получения необходимых ключей доступа, вы можете начать взаимодействие с внутренним интерфейсом.

Запросы осуществляются по адресу

Где token выражает секретный ключ.

Запросы посылаются через HTTPS соединения, название метода указывается через слэш к основному адресу. Ответ приходит в формате JSON.

OPEN WEATHER MAP API

Зачастую бывает необходимо получить информацию о погоде, не задействуя сторонние виджеты и платные приложения. На помощь приходит сервис OpenWeatherMap с открытым и бесплатным API. После регистрации и получения идентификационных данных вы можете отправлять с серверных скриптов запросы на погоду по всему миру. В ответ на ID города ресурс возвращает максимально подробную информацию о текущей погоде и дает прогноз на ближайшее время.

Формат работа: HTTP передача по api.openweathermap.org/data/2.5/weather?id= c указанием идентификационного номера желаемого города. Ответ сервера: JSON.

GOOGLE MAPS API

Что может быть приятнее, чем интерактивная карта мира на сайте? Особенно, если это не шаблонная вставка из Google Maps, а ваша персональная редакция популярной карты с личными кластерами маркеров. Карта будет взаимодействовать с другими скриптами на сайте, посылая информацию о кликах и координатах.

Подобные возможности предлагает JavaScript API Google Maps. Модуль полностью скриптовой и работает на стороне браузера, поэтому HTTP-запросы из PHP и формирование заголовков на стороне сервера, как было в других API, нам не нужно.

Например, выставление метки на карте будет выглядеть так:

var mark = new google.maps.Marker( <
position: myPOS,
map: map,
title:»Hello!»
>);

Для чего нужно и чем полезно использование API

Полезных функций довольно много.

Первый аспект

Можно наладить интерактивное взаимодействие пользователя с социальными сетями и мессенджерами, использовать возможности сторонних вычислительных систем для вывода курсов валют, погоды и другой важной информации.

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

Второй аспект

Если вы владелец сложных вычислительных мощностей, популярного сервиса или хранилища данных для открытого или полуприватного доступа, то хорошим ходом будет поднять собственное API. Что это даст:

Третий аспект

Почти тот же, что и второй. Но без необходимости реализовывать API для открытого доступа. Если у вас есть портал, и вы хотите создать под него мобильное приложение на Android/IOS, то переписать систему под единое API – лучшее решение. Вся структура данных систематизируется. Сайт и приложение будут работать через единые каналы данных.

– Только качественный трафик из Яндекса и Google
– Понятная отчетность о работе и о планах работ
– Полная прозрачность работ

Источник