Диссертация. "Технология создания кроссплатформенных приложений с динамическим формированием структуры и контента"
Скачать 1.73 Mb.
|
ПРИЛОЖЕНИЕ 2 ОПИСАНИЕ API ДЛЯ СОЗДАНИЯ СКРИПТОВ ДЛЯ PROCEDURE Основной пакет для доступа к API - apps_api, включает в себя следующие модули: external.py fetch(url, method='GET', payload=None, headers={}, timeout=10) Совершает обращение по указанному URL. url - URL, по которому необходимо выполнить запрос; method - название HTTP метода для запроса; payload - данные, которые должны быть включены в тело запроса; headers - словарь HTTP-заголовков, которые необходимо прикрепить к запросу; timeout - время, по прошествии которого невыполненный запрос будет прерван. Возвращаемое значение - строка ответа от сервера cache.py cache_obj(key, value, time=0) Кэширует заданное значение в памяти сервера. key - ключ, по которому будет произведено кэширование значение value - объект, который необходимо закэшировать time - время, в течение которого объект будет храниться в кэше (либо всегда). get_cached_obj(key) Возвращает закэшированное значение. либо None, если по заданному ключу объект не был найден. key - ключ, по которому необходимо осуществлять поиск. storage.py class Model Класс, наследуясь из которого можно получать хранимые в серверной базе данных объекты. Подробная документация об использовании класса Model находится по ссылке: https://developers.google.com/ appengine/docs/python/ndb/ !62 ПРИЛОЖЕНИЕ 3 ПРИМЕР 1 ИСПОЛНЯЕМОГО СКРИПТА ДЛЯ PROCEDURE НА ЯЗЫКЕ PYTHON Получение и преобразование объектов из удаленной MySQL базы данных import MySQLdb import datetime __author__ = 'Quiker' def func(_id=None): def _serialize_value(val): if isinstance(val, datetime.datetime): return str(val).replace(' ', 'T') else: return val db = MySQLdb.connect(host='173.194.247.52', passwd='rootpswd', user='root', use_unicode=True, charset='utf8') cursor = db.cursor() cursor.execute('use app;') cursor.execute('SELECT * FROM Event %s;' % (('WHERE _id = %ld' % long(_id)) if _id is not None else '')) rows = cursor.fetchall() result = [] for row in rows: result.append(dict(zip(('_id', 'name', 'address', 'descr', 'date'), map(_serialize_value, row)))) db.close() return result !63 ПРИЛОЖЕНИЕ 4 ПРИМЕР 2 ИСПОЛНЯЕМОГО СКРИПТА ДЛЯ PROCEDURE НА ЯЗЫКЕ PYTHON Получение и преобразование объектов-фотографий из социальной сети Instagram для заданного пользователя import apps_api import json import urllib __author__ = 'quiker' def func(user): client_id = '4cf9d457f4e94932b2bd3c72484c6722' # user = '535783772' url = 'https://api.instagram.com/v1/users/%s/media/recent/? %s' % (user, urllib.urlencode({ 'client_id': client_id })) result = json.loads(apps_api.fetch(url)) data = result['data'] photos = list() for d in data: photos.append({ 'image': d['images']['standard_resolution']['url'] }) return photos !64 ПРИЛОЖЕНИЕ 5 ПРИМЕР СТРУКТУРЫ ПРИЛОЖЕНИЯ В ФОРМАТЕ JSON { "app_key": "541288da8b8584726550a6698ec289bffa619b8c", "entity_descriptions": [ { "id": "5066549580791808", "name": "Event", "properties": { "date": "datetime", "descr": "text", "name": "text", "address": "text" }, "version": 3, "changes": [ { "to": 2, "change": { "type": 4, "from": "description", "to": "descr" } }, { "to": 3, "change": { "type": 1, "col": "address", "col_type": "text" } } ] } ], "name": "Отделение ПИ", "pages": [ { "id": "6262818231812096", "type": 1, "name": "Event List", "bindings": [ { "id": "4855443348258816", "query": "", "entity": "5066549580791808", "type": 2, "property": "items" }, { "id": "5277655813324800", "value": "Info", "view": "5207287069147136", "type": 0, "property": "title" !65 }, { "id": "5418393301680128", "value": "[$name]", "view": "4644337115725824", "type": 0, "property": "text" }, { "view": "5207287069147136", "id": "5840605766746112", "action": { "id": "4714705859903488", "payload": { "event_id": "[$_id]" }, "type": 3, "value": "6333186975989760" }, "type": 4, "property": "action" }, { "id": "5981343255101440", "view": { "subviews": [ { "subviews": [], "background_color": "0xfafafa", "id": "4644337115725824", "font": { "style": 1, "size": 12 }, "text_color": "0x0", "frame": { "origin": { "y": 9, "x": 12 }, "size": { "height": 34, "width": 234 } }, "type": 3, "align": 0 }, { "subviews": [], "background_color": "0xfafafa", "id": "5770237022568448", "font": { "style": 2, "size": 10 }, "text_color": "0x0", "frame": { !66 "origin": { "y": 53, "x": 12 }, "size": { "height": 25, "width": 209 } }, "type": 3, "align": 0 }, { "subviews": [], "background_color": "0xfafafa", "id": "5207287069147136", "font": { "style": 1, "size": 10 }, "text_color": "0x4f6bdb", "frame": { "origin": { "y": 30, "x": 202 }, "size": { "height": 30, "width": 100 } }, "type": 5, "align": 2 } ], "background_color": "0xfafafa", "id": "6473924464345088", "name": "Event Cell", "frame": { "origin": { "y": 0, "x": 0 }, "size": { "height": 100, "width": 320 } }, "type": 0 }, "type": 3, "property": "item" }, { "id": "6544293208522752", "value": "[$address]", "view": "5770237022568448", "type": 0, !67 "property": "text" } ], "isStart": true }, { "id": "6333186975989760", "type": 0, "name": "Event Page", "bindings": [ { "id": "4925812092436480", "query": "_id == [#event_id]", "entity": "5066549580791808", "type": 2, "property": "item" }, { "id": "5136918324969472", "value": "RSVP", "view": "5348024557502464", "type": 0, "property": "title" }, { "id": "5488762045857792", "value": "[$name]", "view": "4785074604081152", "type": 0, "property": "text" }, { "view": "5348024557502464", "id": "5699868278390784", "action": { "id": "4573968371548160", "payload": {}, "type": 2, "value": "http://myrsvp.com/?event=[$_id]" }, "type": 4, "property": "action" }, { "id": "6051711999279104", "view": { "subviews": [ { "subviews": [], "background_color": "0xfafafa", "id": "4785074604081152", "font": { "style": 1, "size": 10 }, "text_color": "0x0", "frame": { "origin": { !68 "y": 20, "x": 43 }, "size": { "height": 36, "width": 226 } }, "type": 3, "align": 1 }, { "subviews": [], "background_color": "0xfafafa", "id": "5910974510923776", "font": { "style": 0, "size": 10 }, "text_color": "0x0", "frame": { "origin": { "y": 81, "x": 13 }, "size": { "height": 178, "width": 285 } }, "type": 3, "align": 0 }, { "subviews": [], "background_color": "0xfafafa", "id": "5348024557502464", "font": { "style": 1, "size": 10 }, "text_color": "0xa63030", "frame": { "origin": { "y": 276, "x": 108 }, "size": { "height": 30, "width": 100 } }, "type": 5, "align": 1 } ], "background_color": "0xfafafa", "id": "6192449487634432", !69 "name": "Single Event Template", "frame": { "origin": { "y": 0, "x": 0 }, "size": { "height": 480, "width": 320 } }, "type": 0 }, "type": 3, "property": "view" }, { "id": "6614661952700416", "value": "[$descr]\\nWill held at: [$address]", "view": "5910974510923776", "type": 0, "property": "text" } ], "isStart": false } ] } !70 ПРИЛОЖЕНИЕ 6 ОПИСАНИЕ СЕРВЕРНОГО API ТЕХНОЛОГИЧЕСКОЙ ПЛАТФОРМЫ 1. Получение конфигурации структуры приложения GET /api/app/APP_ID APP_ID - идентификатор приложения Параметры: * version (опционально) - номер последней синхронизированной локальной версии конфигурации, хранимой на клиенте Результат: JSON-сериализованное описание конфигурации и структуры приложения, включающее описание используемых страниц (Page) отображения, их связей, шаблонов, контекстов данных, а также описание моделей данных, необходимых для создания в рамках локального хранилища Пример результата представлен в приложении 5. 2. Вызов удаленной процедуры POST /api/procedure/PROCEDURE_ID/call PROCEDURE_ID - идентификатор процедуры для вызова Параметры: * args - JSON-сериализованный набор пар ключ-значение для аргументов процедуры Результат: JSON-сериализованный массив элементов типа dictionary, представляющих собой объекты модели, используемые для отображения посредством связей. 3. Получение объектов модели в соответствии с описанием EntityDescription GET /api/entities/ENTITY_DESCRIPTION_ID/all ENTITY_DESCRIPTION_ID - идентификатор описания модели !71 Результат: JSON-сериализованный массив элементов модели, используемых для отображения посредством связей и предназначенных для хранения в рамках локальной базы данных. !72 ПРИЛОЖЕНИЕ 7 ПРОГРАММНЫЙ КОД РАЗРАБОТАННОГО РЕШЕНИЯ Ввиду большого объема приложения код разработанного решения приводится в электронном виде на компакт-диске, прикрепленном к настоящему документу. !73 |