web2py обеспечивает поддержку различных протоколов, таких как XML, JSON, RSS, CSV, XMLRPC, JSONRPC, AMFRPC и SOAP. Каждый из этих протоколов поддерживается несколькими способами, и мы делаем различие между —
- Визуализация вывода функции в заданном формате.
- Удаленные вызовы процедур.
Предоставление словаря
Рассмотрим следующий код, который поддерживает количество сеансов.
def count(): session.counter = (session.counter or 0) + 1 return dict(counter = session.counter, now = request.now)
Вышеуказанная функция увеличивает количество подсчетов по мере того, как пользователь посещает страницу. Предположим, что данная функция определена в контроллере «default.py» приложения web2py. Страницу можно запросить по следующему URL — http://127.0.0.1:8000/app/default/count
web2py может отображать вышеупомянутую страницу в разных протоколах и добавляя расширение к URL, например:
http://127.0.0.1:8000/app/default/count.html
http://127.0.0.1:8000/app/default/count.xml
http://127.0.0.1:8000/app/default/count.json
Словарь, возвращаемый вышеуказанным действием, будет отображаться в HTML, XML и JSON.
Удаленные вызовы процедур
Фреймворк web2py предоставляет механизм, который преобразует функцию в веб-сервис. Механизм, описанный здесь, отличается от механизма, описанного ранее, потому что —
- Включение аргументов в функцию.
- Функция должна быть определена в модели.
- Он обеспечивает более строгое соглашение об именах URL.
- Он работает для фиксированного набора протоколов и легко расширяется.
- Чтобы использовать эту функцию, необходимо импортировать и инициировать объект службы.
Для реализации этого механизма сначала необходимо импортировать и создать экземпляр объекта службы.
from gluon.tools import Service service = Service()
Это реализовано в файле модели «db.py» в приложении скаффолдинга. Модель Db.py является моделью по умолчанию в среде web2py, которая взаимодействует с базой данных и контроллером для достижения желаемого результата для пользователей.
После внедрения сервис в модели может быть доступен с контроллеров по мере необходимости.
В следующем примере показаны различные реализации удаленных вызовов процедур с использованием веб-служб и многое другое.
Веб-сервисы
Веб-службы могут быть определены как стандартизированный способ интеграции веб-приложений с использованием таких протоколов, как XML, SOAP, WSDL и UDDI.
web2py поддерживает большинство из них, но интеграция будет довольно сложной.
Использование JSON-сервиса web2py с помощью jQuery
Есть много способов вернуть форму JSON web2py, но здесь мы рассмотрим случай службы JSON. Например —
def consumer():return dict()@service.json def get_days():return ["Sun", "Mon", "Tues", "Wed", "Thurs", "Fri", "Sat"] def call():return service()
Здесь мы наблюдаем, что —
-
функция просто возвращает пустой словарь для отображения представления, которое будет использовать службу.
-
get_days определяет сервис, а вызов функции предоставляет все зарегистрированные сервисы.
-
get_days не обязательно должен быть в контроллере и может быть в модели.
-
Вызов всегда в контроллере скаффолдинга default.py.
функция просто возвращает пустой словарь для отображения представления, которое будет использовать службу.
get_days определяет сервис, а вызов функции предоставляет все зарегистрированные сервисы.
get_days не обязательно должен быть в контроллере и может быть в модели.
Вызов всегда в контроллере скаффолдинга default.py.
Взгляд с потребителем действия следующие:
{{extend 'layout.html'}} <div id = "target"></div> <script> jQuery.getJSON("{{= URL('call',args = ['json','get_days'])}}", function(msg){ jQuery.each(msg, function(){ jQuery("#target"). append(this + "<br />"); } ) } ); </script>
Первый аргумент jQuery.getJSON — это URL-адрес следующей службы: http://127.0.0.1:8000/app/default/call/json/get_days.
Это всегда следует шаблону —
http://<domain>/<app>/<controller>/call/<type>/<service>
URL находится между {{…}} , потому что он разрешается на стороне сервера, а все остальное выполняется на стороне клиента. Второй аргумент jQuery.getJSON — это обратный вызов, которому будет передан ответ JSON.
В этом случае обратный вызов зацикливается на каждом элементе в ответе (список дней недели в виде строк) и добавляет каждую строку, а затем <br/> к <div id = «target»> .
Таким образом, web2py управляет реализацией веб-сервисов, используя jQuery.getJSON .