Как сделать api для мобильного приложения
Приветствую! Нарисовалась у меня задача: нужно интегрировать в CRM систему мессенджеры, а то трудно анализировать работу менеджеров, когда они общаются с клиентами используя один общий «рабочий» телефон. И первым делом нужно было подключить WhatsApp, как один из самых популярных мессенджеров у нашей целевой аудитории.
Анализ ситуации.
1. Официальный API
Официального API в релизе тогда ещё не было. Но Facebook успел прислать ссылку на форму, для подключения официального API, находящегося в тестировании.
2. Сторонний сервис. Подключение через WhatsApp WEB
Но это зависимость от чужого API, в любой момент может всё отвалиться, да и передавать чужому сервису номера клиентов не хотелось. А ещё писать под чужой авторский API, да ещё который придётся переписывать, при переезде на другой сервис, тоже такое себе удовольствие.
Ну и ещё требуется держать телефон включенным (хотя некоторые сервисы за доп плату решали эту проблему :)
3. Ручной режим
Решение
Есть такая программка для автоматизации действий под Android, называется Tasker, одна из первых подобных программ. Но я в ней не разобрался с первого раза… Поискал аналоги, наткнулся на программу Automagic. В ней события, действия и ветвления рисуются как блок схема.
Передаю привет конструктору HiAsm, благодаря которому когда то научился понимать концепцию программирования.
Плюсы, минусы, доработка и планы
Чуть позже хочу сверху виртуальной машины, где запущен мессенджер, написать SIP транк, через который можно будет звонить через WhatsApp как через SIP ^.^ что может сэкономить расходы на связь.
Ещё хочу делать скриншоты аватарок и отправлять их на сервер, для прикрепления миниатюры к контакту в CRM системе.
Ну и вообще самое интересное: Данный способ обёртывания в API подойдёт почти для любого приложения под Android :)
Всё изначально разрабатывал и запускал на Android 9, xiaomi mi 9 se, root прав нет.
Большинство из нас стали весьма жадны до новой информации, что в Интернете является такой важной частью нашей жизни. Поэтому создание приложений Android со статичным контентом может быть плохой идеей. Вместо этого вам следует рассмотреть возможность создания приложений, которые могут отображать свежий контент каждый раз, когда пользователь их открывает.
В этом уроке я расскажу вам, как использовать классы и методы, доступные в Android SDK, для подключения к удаленным веб-серверам и взаимодействия с ними с использованием их REST API.
1. Включение доступа к Интернету
Использование REST API, очевидно, связано с использованием Интернета. Тем не менее, приложения Android могут получить доступ к Интернету только в том случае, если у них есть разрешение android.permission.INTERNET . Поэтому перед началом написания любого сетевого кода вы должны убедиться, что в файле манифеста вашего проекта присутствуют следующие uses-permission теги:
Поскольку android.permission.INTERNET не считается опасным разрешением, вам не нужно запрашивать его во время выполнения на устройствах с уровнем API 23 или выше.
2. Создание фоновых потоков
Платформа Android не позволяет выполнять сетевые операции в основном потоке приложения. Поэтому весь ваш сетевой код должен принадлежать фоновому потоку. Самый простой способ создать такой поток - использовать метод execute() класса AsyncTask . В качестве единственного аргумента execute() ожидает объект Runnable .
Если вы хотите узнать больше о выполнении операций в фоновом потоке, я предлагаю вам прочитать этот учебник о фоновых операциях из серии Android для начинающих.
В следующем фрагменте кода показано, как настроить соединение с корневой конечной точкой API GitHub:
4. Добавление заголовков запросов
Большинство веб-сайтов, предлагающих REST API, хотят иметь возможность однозначно идентифицировать ваше приложение. Самый простой способ помочь им сделать это - включить уникальный заголовок User-Agent во все ваши запросы.
Вы можете добавить несколько заголовков к своему запросу, вызвав несколько раз метод setRequestProperty() . Например, следующий фрагмент кода добавляет заголовок Accept и кастомный заголовок Contact-Me :
В случае отсутствия ошибок вы можете теперь вызвать метод getInputStream() , чтобы получить ссылку на входящий поток соединения.
Большинство REST API в наши дни возвращают данные, отформатированные как документы JSON. Поэтому, вместо прямого чтения из объекта InputStream , я предлагаю вам создать для него InputStreamReader .
Android SDK имеет класс JsonReader, который позволяет легко разбирать документы JSON. Вы можете создать новый экземпляр класса JsonReader , передав объект InputStreamReader его конструктору.
То как вы извлекаете определенную часть информации из документа JSON, зависит от его структуры. Например, документ JSON, возвращаемый корневой конечной точкой REST API GitHub, выглядит следующим образом:
Как вы можете видеть, ответ - это только один большой объект JSON, содержащий несколько ключей. Чтобы извлечь из него значение с именем organization_url, вам нужно будет написать следующий код:
После того как вы извлечете всю необходимую информацию, вы всегда должны вызвать метод close() для объекта JsonReader , чтобы он освобождал все сохраненные ресурсы.
В следующем фрагменте кода устанавливается кеш размером 100 000 байт:
Заключение
Чтобы узнать больше о работе с сетью на платформе Android, вы можете обратиться к руководству по сетевым операциям Android.
На заре программирования и до совсем недавнего времени программа была чем-то законченным, полностью готовой к употреблению самостоятельной единицей, которая выполняла свои функции и только их.
Однако с появлением мобильных устройств, веб сайтов с богатой логикой и социальных сетей все стало меняться. Сейчас программы, которые не выходят в сеть, не умеют что-то выкладывать в фейсбуки и вообще работают сами в себе, практически не имеют права на жизнь. Даже професcиональные инструменты, такие как, Microsoft Office 2013, стали поддерживать облачные хранилища для обмена документами.
Мир меняется. Теперь, чтобы заработать денег на продаже софта, необязательно писать свою собственную операционную систему или антивирус, потратив кучу времени и ресурсов. Достаточно просто попросить свою жену и вдвоем разработать мировой хит. Поэтому многие сегодня мечтают создать своих злых птичек или кат-зе-роуп, изучая разработку под iOS, Android, Windows Phone.
И все вроде бы выглядит хорошо и уже кажется, что решение найдено. Однако проблемы начинаются, когда вы станете самостоятельно развертывать сервис бекенда на сервере. Я — программист, и когда дело доходит до установки и настройки сервера, мне сразу становится не по себе. Во-первых, это абсолютно новые знания, которые надо изучить, чтобы все работало как надо. Во-вторых, чтобы все работало действительно как надо и не упало при возросшей нагрузке или атаке, надо курить маны еще больше и упорнее. Можно попробовать найти такого хостера, который избавит вас от возни с серверами и предустановит PHP и/или что-то еще. Но тогда останется проблема того, что нужно будет самостоятельно реализовывать все необходимые обработчики событий сервера для реализации полноценного REST API. А это опять же отнимает ваше полезное время и тратит его на ненужные вещи.
К чему я это все?
Данный сервис, наряду с другими полезными возможностями Windows Azure Mobile Services, является PaaS решением и предоставляет возможность быстро развернуть облачный RESTful API, к которому может получить доступ программа на любом языке и платформе. В основу этого решения легла уже не новая, но довольно популярная технология Node.js. Custom API является полностью функциональным Node.js приложением со всеми вытекающими последствиями — это полноценное решение без компромиссов. А с учетом того факта, что для работы с ним написаны нативные SDK для всех трех популярных мобильных платформ, это решение становится еще интереснее.
Далее в этой части я хочу рассказать о том, как создать и начать пользоваться облачным бекендом в Windows Azure и обращаться к нему с мобильного устройства. Не переключайтесь!
Создание облачного бекенда
Создание облачного бекенда, как и любого другого сервиса в Windows Azure, происходит из портала управления облаком. Сперва надо создать мобильную службы, придумав ей какое-то вменяемое название:
Далее вам необходимо выбрать SQL базу данных, в которой будут храниться данные мобильной службы. Есть вариант создать бесплатный экземпляр на 20Мб. Для тестирования возможностей — хватит за глаза. А если понравится, то всегда можно проапгрейдиться на более серьезные решения.
После нажатия на стрелку далее и ввода параметров сервера БД (создать новый или использовать существующий логин/пароль администратора и прочая скукота), новый мобильный сервис начнет создаваться в облаке. Обычно это происходит крайне быстро, меньше чем за минуту. Когда служба создастся и вы зайдете в нее, то увидите что-то вроде этого окна:
Запомните его, оно нам еще пригодится далее.
Создание API
Чтобы создать свой первый облачный API, просто перейдите на вкладку API и нажмите кнопку Create a Custom API:
Если вы ранее работали с мобильными службами Windows Azure, то следующее окно будет вам знакомо. В нем необходимо задать название будущего API, а также один из четырех уровней доступа к различным его методам. Оставим все по умолчанию, тогда к нашему API смогут подключаться только те клиенты, у которых есть параметр авторизации:
Как только новый API создался, мы можем приступить к его редактированию. Изначально вы должны увидеть скрипт, похожий на этот:
В образовательных/тестовых целях я предлагаю слегка его изменить, чтобы получилось вот так:
Основным изменением в данном случае стало то, что в обработчике POST-запросов стали возвращаться данные в виде простой строки, а в GET добавилась переменная, и у ее объекта есть более одного поля. Я сделал так для наглядности, чтобы проиллюстрировать различные возможности работы с данными.
Использование API
Для данной статьи мы воспользуемся тестовым приложением, которое нам любезно предоставляет Windows Azure Mobile Services. Для этого вернемся на страницу Quick Create (это та самая, с облачком и молнией на пиктограмме), выберем Windows Phone 8 (хотя обратите внимание на богатый выбор) и нажмем Create A New Windows Phone App:
Создав нужную табличку (TodoItem) и скачав приложение по кнопке Download, откроем его в Visual Studio.
В первую очередь нас интересует две вещи. В файле App.xaml.cs есть строка примерно такого вида:
С помощью этого поля мы будем общаться с нашей новоиспеченной мобильной службой. Набор непонятных символов — это ApplicationKey, индивидуальный ключ вашей службы, хольте его и лелейте.
Давайте запустим приложение и посмотрим хотя бы, как оно выглядит:
Ну не хит апстора, но для начала неплохо. Давайте наделим его дополнительной логикой и вызовем наши API методы. Идем в файл MainPage.xaml.cs. От него я хочу добиться того, чтобы при нажатии на кнопку Save происходило обращение к сервисам, после чего полученный результат просто писался в консоль отладки. Для этого в конец метода InsertTodoItem добавьте следующий код:
Главным методом в этом коде можно назвать InvokeApiAsync. Он отвечает за вызов того или иного метода API. Этот метод перегружен и наделен различным набором параметров. В примере видно, что в случае с POST мы передаем аж 5 параметров, а в случае с GET всего 3. Это связано с тем, что метод для POST рассчитан на то, что результатом работы будет обычная строка (вспоминаем реализацию скрипта на бекенде), а вариант с GET — на работу с JSON объектом (результатом будет Newtonsoft.Json).
Если теперь запустить приложение и понажимать кнопку Save, то в Debug-консоли приложения будет видно что-то вроде этого:
Как у них
Я не просто так попросил обратить внимание на возможность выбора типа приложения на страничке Quick Create в панели управления Windows Azure. Дело в том, что нативный SDK для работы с мобильными службами написан не только для Windows устройств. Свои библиотеки выпущены и для iOS, и для Android, поэтому все то же самое можно использовать и на этих платформах. Вот пример кода на ObjectiveC, который будет делать примерно то же, что и в примере:
Как видите — «чистый» ObjectiveC, без мухляжа. Аналогично для Android, WinRT и даже для веб-версии (на HTML и JavaScript).
REST не зависит от платформы и языка. Вы можете написать REST API с любыми языками, которые обычно связаны с созданием сайта, такими как PHP, Python или Ruby. В архитектуре REST используются четыре общепринятых метода. Это методы создания , чтения , обновления и удаления (CRUD). Также возможно добавить более специализированные методы, такие как получение десяти самых популярных элементов или рекордов всех пользователей. Этого можно достичь, написав новый метод или используя параметр запроса, такой как /api/items?top=10 .
Использование djangorestframework для создания простого REST API
Мы будем использовать Django (Python MVC framework) и djangorestframework . Djangorestframework создается с использованием django (python) специально для предоставления данных через среду REST.
Для начала вам понадобится Python v2.7 или новее и Django 1.7.4 или новее. Если вы этого не сделаете, установите Python и Django сейчас.
Вы можете проверить свою установку, запустив командную строку и введя команду python . Все хорошо, вы должны увидеть информацию о версии. Продолжите, набрав:
Это подтверждает, что у вас установлен Django в вашей системе. Далее мы строим проект Django:
Это список созданных файлов и папок.
Вы можете проверить, все ли работает, как ожидалось, выполнив:
Который запускает веб-сервер разработки Django для тестирования. В случае успеха вы увидите:
Приведет к следующим файлам
Внутри файла models.py есть строка импорта from django.db import models . Добавьте следующий код к нему.
Это создает класс, который отображает имя, дату создания рыбы и, если строка данных активна или нет. Вы можете изменить тип поля, обратившись к соответствующей документации .
Теперь добавьте приложение fishes в файл marine/settings.py чтобы зарегистрировать его. Сделайте это в разделе INSTALLED_APPS , добавив fishes в список. Запустите python manage.py sql fishes чтобы увидеть предварительный просмотр схемы базы данных SQL, которая будет работать, когда мы активируем приложение.
Чтобы подтвердить создание соответствующих таблиц в базе данных sqlite по умолчанию, введите python manage.py migrate или python manage.py syncdb в старых версиях Django. Django создаст таблицы аутентификации по умолчанию и пустую таблицу fishes_fish в базе данных fishes_fish . В запросе будет указано, хотите ли вы создать суперпользователя, так как вы запускаете Django впервые.
Если по какой-либо причине вам не предлагается создать суперпользователя, введите в командной строке:
Следуйте инструкциям, чтобы создать учетную запись администратора. Django предоставляет встроенную страницу администратора, которая позволяет вставлять и изменять данные. Эту функцию необходимо активировать, отредактировав файл admin.py внутри папки fishes . Добавьте следующий код после from django.contrib import admin
Мы будем использовать созданную учетную запись для входа на страницу администратора. Запустите сервер разработки:
Откройте 127.0.0.1:8000/admin и введите идентификатор и пароль суперпользователя. Вы должны увидеть страницу администратора со списком Marine . Нажмите на Fishes чтобы добавить или изменить данные. Добавьте некоторые данные.
До этого момента мы создали работающий, но простой сайт Django. Теперь мы djangorestframework на сайт, загрузив и установив его . Одна ключевая вещь, которую нужно помнить, это добавить rest_framework в список INSTALLED_APPS в marine/settings.py и изменить urls.py на
Этот код включает маршрутизацию API, которая имеет решающее значение для `djangorestframework и использует регулярное выражение для установки действительных URL-адресов сайта.
Когда мы установили djangorestframework , это дало нам возможность использовать сериализаторы, которые объединяют данные, полученные из модели fish, в строковый формат, либо XML, либо JSON. Чтобы создать сериализатор для модели рыб, мы создаем файл в папке fishes и называем его serializers.py . Вот содержимое этого файла:
В файле views.py добавьте:
Вы можете найти исходный код приложения REST API на GitHub . Нет данных, поэтому вам нужно запустить python manage.py migrate или python manage.py syncdb на старых версиях Django после загрузки.
Мобильное приложение iOS
Далее мы пройдемся по ключевым шагам, необходимым для создания мобильного приложения, которое получает данные от API. Мы используем UITableView для отображения наших данных в списке. В XCode 6.3.1 (последняя версия на момент написания) создайте новый проект
Файл> Создать> Проект> Приложение iOS> Приложение Single View
- Наименование продукта : Рыбы
- Язык : Objective-C
- Устройства : iPhone (по умолчанию было Universal, включая iPhone и iPad)
- В настоящее время не используются основные данные.
Выберите место для сохранения вашего проекта и нажмите « Создать» . Мы будем работать с файлами, содержащимися в папке Fishes .
По умолчанию в проекте есть View Controller. Мы хотим показать данные из REST API в виде списка, поэтому вместо них будем использовать Table View Controller . Создайте новый набор файлов Objective-C ( Файл> Создать> Файл> Исходный код iOS> Какао Touch Class ).
- Класс : TableViewController
- Подкласс : UITableViewController
- Нам не нужен файл XIB
Сохраните эти новые файлы в папке Fishes .
Откройте Main.storyboard , перейдите в библиотеку объектов и перетащите объект Table View Controller на раскадровку. Выберите и удалите View Controller по умолчанию. Убедитесь, что в Инспекторе установлен флажок « Исходный контроллер вида» для выбранного Table View Controller представления.
Далее мы добавим код, который заставит это приложение что-то делать. Код демонстрирует использование простого NSArray для отображения данных, жестко закодированных в TableViewController.m . Замените все существующие функции на следующие.
Теперь мы можем протестировать это простое приложение. Выберите « Продукт»> «Выполнить» .
Затем нам нужно получить JSON из API- djangorestframework REST, который мы опубликовали с помощью djangorestframework . Мы создали объект fishJson с именем fishJson , зарегистрировав его на уровне @interface и синтезировав его с помощью @property и @synthesize . Это заменяет код для установщиков и получателей. Затем мы заменяем код, который у нас был в numberOfRowsInSection , где мы заменяем fishes на fishJson который содержит JSON из REST API. Снова замените любые существующие функции или объявления.
Мы должны убедиться, что этот метод запускается при запуске приложения, добавьте следующий viewDidLoad :
Здесь мы обновляем метод numberOfRowsInSection . Этот код гарантирует, что количество строк соответствует количеству элементов, содержащихся в массиве fishJson .
Обновите метод cellForRowAtIndexPath чтобы он cellForRowAtIndexPath записи из нашего REST-фида:
Теперь у нас есть работающее простое мобильное приложение для отображения данных, полученных из онлайн или локального REST API. Вы можете найти код для приложения iOS в том же хранилище выше. Этот учебник содержал много концепций и компонентов, которые типичны для приложений «реального мира». Если у вас возникли проблемы или у вас есть вопросы или комментарии, пожалуйста, дайте мне знать в комментариях ниже.
В настоящий момент отрасль Информационных технологий одна из быстроразвивающихся. Сам процесс развития — это всегда накопление большого количества знаний, которые необходимо постоянно обобщать и систематизировать. В свою очередь процесс систематизации порождает рост терминологической базы.
Почему это важно? Дело в том, что чем больше терминологический аппарат, тем сложнее человеку вне отрасли вникать в детали.
С технарями (исполнителями) — все понятно: они работают с технологиями и используют терминологию постоянно, ведь это существенно ускоряет коммуникации внутри команд. У бизнеса же (клиента) все эти «словечки» вызывают только дополнительные вопросы, такого вида: «Зачем это нужно? Почему это столько стоит? Можем ли мы обойтись без этого?»
Команда Stfalcon имеет большой опыт разработки мобильных приложений, и мы довольно часто сталкиваемся с вопросами, которые можно квалифицировать как «типичные». Один из таких «Зачем мобильному приложению API?»
Чтобы облегчить понимание этого вопроса, давайте в формате «просто о сложном» разберем, что же такое API (Application Programming Interface), какие функциональные задачи на него возложены, и почему мобильному приложению без него не обойтись.
Интерфейс
Начать разбирать понятие API лучше всего со слова интерфейс т.к. оно является основополагающим и имеет более широкий смысл. Чтобы было проще это сделать, давайте отойдем от мира инженерии программного обеспечения и вернемся к бытовым темам.
Ответьте на вопрос, какие функциональные задачи выполняет автомобиль.
Вероятней всего, первое, что придет в голову — перемещение человека из точки A в точку B. В целом, это и есть базовая функция, а вот что-то перевезти или, скажем, подзаработать — это уже второстепенные задачи.
Второй вопрос, за счет чего происходит движение, ускорение, торможение и прочие функции. Не вникая в детали на это можно ответить так: «Автомобиль, как транспортное средство, состоит из множества связанных между собой компонентов и на более высоком уровне их всего три, это: кузов, шасси и двигатель. В свою очередь, каждый из этих компонентов, состоит из более узкоспециализированных устройств и механизмов, которые довольно тесно взаимодействуют между собой. В результате этого взаимодействия мы и получаем от автомобиля то, что необходимо».
Современный автомобиль довольно серьезное инженерное решение, при этом водителю не обязательно разбираться со всей этой сложностью, она просто скрыта от глаз. И как понимаете, скрыта она за интерфейсом :)
Да, вы правильно поняли: руль, педаль акселератора, коробка передач, климат-контроль и даже ваша любимая магнитола — все это часть интерфейса, который предоставлен водителю для управления всей сложностью.
Интерфейс встречается в нашей жизни довольно часто:
- человек работающий за станком имеет в распоряжении всякие ручки, кнопки, дисплей и т.д.;
- когда вы переключаете каналы пультом от телевизора;
- когда вы используете на смартфоне голосовой набор,
- играете в приставку посредством джойстика,
- и даже когда играете на пианино.
Учитывая вышеприведенные примеры, попробуем дать определение этому понятию.
Интерфейс — это граница между двумя системами, представляющая из себя совокупность правил, методов и ограничений, по которым эти системы между собой взаимодействуют.
Если разбирать данное определение на примере автомобиля, то можно выделить две системы: человек и машина. Машина задает некие правила, соблюдая которые, человек может ей управлять.
API и RESTful API
Разобравшись с базовой составляющей термина, продолжим расшифровку остальных двух слов, а точнее Application Programming.
Само название намекает на принадлежность термина к программному обеспечению. Проводя аналогию с тем же автомобилем, можно прийти к выводу, что API — это опять-таки две системы и правила, просто в этом случае, в качестве систем выступают программные модули, веб-сервисы и т.д.
В принципе на этом можно было бы закончить с API, но было бы неправильным не упомянуть о RESTfull API. Дело в том, что API — описывает как бы явление. В свою же очередь RESTfull API (или просто REST API) — это один из подходов к реализации API.
Это важно понимать т.к. часто в диалогах используют для краткости API, предполагая, что реализовываться оно будет посредством RESTfull API.
Ответ на главный вопрос
Вооружившись знаниями, что такое интерфейс и даже немного коснувшись более узкоспециализированного понятии, как RESTfull API, нам будет гораздо проще ответить на главный вопрос «Зачем мобильному приложению API?».
Задач много, но какая же из них (а может все?) является причиной создания API? Ответ: никакая. Потому что все это можно реализовать и без API в рамках одного смартфона.
На самом деле первопричиной является многопользовательская природа мобильного приложения. Ведь как только появляется больше одного пользователя, сразу же возникает проблема обмена данными между ними.
Представьте ситуацию, пользователь изменил свое имя. Если бы данные о профиле хранились только на смартфоне, другой пользователь не смог бы узнать об этих изменениях.
Кроме обмена данных, есть и другие проблемы: что делать в случае утери смартфона или сброса настроек к заводским; как быть с поддержкой сотни различных устройств.
Все эти задачи решаются за счет централизации бизнес логики и вот как раз для доступа к ней и разрабатывается API (а точнее, как мы уже знаем, RESTfull API).
Еще один кейс, когда без API не обойтись. Вы хотите предоставлять клиентам доступ к данным или функциям за плату.
Для примера можно взять смс-агрегаторы, основной задачей которых является отправка sms. В этой ситуации разработчику нет необходимости разбираться во всей сложности устройства мобильных сетей. Все, что необходимо — это интегрироваться с API смс-агрегатора и для отправки, просто вызвать нужный API-метод.
Учитывая вышеописанное, делаем ключевой вывод: чтобы выполнять свои функции мобильное приложение обращается к внешнему серверу, который централизует бизнес логику (еще называют Backend).
Для доступа к серверу как раз и необходим API, то есть, некий набор правил по которым клиент, а точнее приложение будет к нему обращаться.
На практике это выглядит так. К примеру, вы хотите создать заказ. В этой ситуации, ваше Android или iOS приложение отправит команду серверу посредством API на создание заказа. Сервер выполнит запрос и сохранит в базу данных информацию, тем самым данные о заказе станут доступны другим пользователям.
Надеюсь, эта статья позволит Вам окончательно разобраться в этом вопросе.
Читайте также: