CherryPy - Веб-службы
Веб-сервис - это набор веб-компонентов, которые помогают в обмене данными между приложением или системами, который также включает открытые протоколы и стандарты. Его можно опубликовать, использовать и найти в Интернете.
Веб-сервисы бывают разных типов, например RWS (RESTfUL Web Service), WSDL, SOAP и многие другие.
REST - передача репрезентативного состояния
Тип протокола удаленного доступа, который передает состояние от клиента к серверу, который может использоваться для управления состоянием вместо вызова удаленных процедур.
Не определяет какую-либо конкретную кодировку или структуру, а также способы возврата полезных сообщений об ошибках.
Использует «глаголы» HTTP для выполнения операций передачи состояния.
Ресурсы однозначно идентифицируются с помощью URL.
Это не API, а транспортный уровень API.
REST поддерживает номенклатуру ресурсов в сети и предоставляет унифицированный механизм для выполнения операций с этими ресурсами. Каждый ресурс идентифицируется по крайней мере одним идентификатором. Если инфраструктура REST реализована на основе HTTP, эти идентификаторы называютсяUniform Resource Identifiers (URIs).
Ниже приведены два общих подмножества набора URI:
Подмножество | Полная форма | пример |
---|---|---|
URL | Единый указатель ресурсов | http://www.gmail.com/ |
URN | Единое имя ресурса | урна: isbn: 0-201-71088-9 урна: uuid: 13e8cf26-2a25-11db-8693-000ae4ea7d46 |
Прежде чем разбираться в реализации архитектуры CherryPy, давайте сосредоточимся на архитектуре CherryPy.
CherryPy включает следующие три компонента -
cherrypy.engine - Он контролирует запуск / завершение процесса и обработку событий.
cherrypy.server - Он настраивает и контролирует сервер WSGI или HTTP.
cherrypy.tools - Набор утилит, которые ортогональны обработке HTTP-запроса.
REST интерфейс через CherryPy
Веб-сервис RESTful реализует каждый раздел архитектуры CherryPy с помощью следующего:
- Authentication
- Authorization
- Structure
- Encapsulation
- Обработка ошибок
Аутентификация
Аутентификация помогает в проверке подлинности пользователей, с которыми мы взаимодействуем. CherryPy включает инструменты для обработки каждого метода аутентификации.
def authenticate():
if not hasattr(cherrypy.request, 'user') or cherrypy.request.user is None:
# < Do stuff to look up your users >
cherrypy.request.authorized = False # This only authenticates.
Authz must be handled separately.
cherrypy.request.unauthorized_reasons = []
cherrypy.request.authorization_queries = []
cherrypy.tools.authenticate = \
cherrypy.Tool('before_handler', authenticate, priority=10)
Вышеупомянутая функция Authenticate () поможет проверить существование клиентов или пользователей. Встроенные инструменты помогают систематически завершить процесс.
Авторизация
Авторизация помогает поддерживать работоспособность процесса через URI. Этот процесс также помогает преобразовывать объекты по лидам пользователя.
def authorize_all():
cherrypy.request.authorized = 'authorize_all'
cherrypy.tools.authorize_all = cherrypy.Tool('before_handler', authorize_all, priority=11)
def is_authorized():
if not cherrypy.request.authorized:
raise cherrypy.HTTPError("403 Forbidden",
','.join(cherrypy.request.unauthorized_reasons))
cherrypy.tools.is_authorized = cherrypy.Tool('before_handler', is_authorized,
priority = 49)
cherrypy.config.update({
'tools.is_authorized.on': True,
'tools.authorize_all.on': True
})
Встроенные инструменты авторизации помогают систематически обрабатывать подпрограммы, как упоминалось в предыдущем примере.
Структура
Поддержание структуры API помогает снизить нагрузку на отображение URI приложения. Всегда необходимо поддерживать доступность и чистоту API. Базовая структура API для фреймворка CherryPy должна иметь следующее:
- Учетные записи и пользователь
- Autoresponder
- Contact
- File
- Folder
- Список и поле
- Сообщение и пакет
Инкапсуляция
Инкапсуляция помогает в создании API, который является легким, читаемым и доступным для различных клиентов. Список элементов вместе с созданием, получением, обновлением и удалением требует инкапсуляции API.
Обработка ошибок
Этот процесс управляет ошибками, если таковые имеются, если API не работает по определенному инстинкту. Например, 400 соответствует неверному запросу, а 403 - неавторизованному запросу.
пример
Рассмотрим следующее в качестве примера ошибок базы данных, проверки или приложения.
import cherrypy
import json
def error_page_default(status, message, traceback, version):
ret = {
'status': status,
'version': version,
'message': [message],
'traceback': traceback
}
return json.dumps(ret)
class Root:
_cp_config = {'error_page.default': error_page_default}
@cherrypy.expose
def index(self):
raise cherrypy.HTTPError(500, "Internal Sever Error")
cherrypy.quickstart(Root())
Приведенный выше код даст следующий результат -
Управление API (Application Programming Interface) через CherryPy легко благодаря встроенным инструментам доступа.
HTTP-методы
Список методов HTTP, которые работают с ресурсами, выглядит следующим образом:
S.No | HTTP-метод и работа |
---|---|
1. | HEAD Извлекает метаданные ресурса. |
2. | GET Извлекает метаданные и контент ресурса. |
3. | POST Запрашивает сервер создать новый ресурс с использованием данных, содержащихся в теле запроса. |
4. | PUT Запрашивает сервер заменить существующий ресурс на тот, который заключен в теле запроса. |
5. | DELETE Запрашивает сервер удалить ресурс, идентифицированный этим URI. |
6. | OPTIONS Запрашивает сервер вернуть подробную информацию о возможностях глобально или конкретно по отношению к ресурсу. |
Протокол публикации Atom (APP)
Приложение возникло в сообществе Atom как протокол прикладного уровня поверх HTTP, позволяющий публиковать и редактировать веб-ресурсы. Единица сообщений между сервером приложения и клиентом основана на формате XML-документа Atom.
Протокол публикации Atom определяет набор операций между службой APP и пользовательским агентом с использованием HTTP и его механизмов, а также формата XML-документа Atom в качестве единицы сообщений.
APP сначала определяет служебный документ, который предоставляет пользовательскому агенту URI различных коллекций, обслуживаемых службой APP.
пример
Давайте рассмотрим пример, чтобы продемонстрировать, как работает приложение -
<?xml version = "1.0" encoding = "UTF-8"?>
<service xmlns = "http://purl.org/atom/app#" xmlns:atom = "http://www.w3.org/2005/Atom">
<workspace>
<collection href = "http://host/service/atompub/album/">
<atom:title> Albums</atom:title>
<categories fixed = "yes">
<atom:category term = "friends" />
</categories>
</collection>
<collection href = "http://host/service/atompub/film/">
<atom:title>Films</atom:title>
<accept>image/png,image/jpeg</accept>
</collection>
</workspace>
</service>
APP указывает, как выполнять базовые операции CRUD с членом коллекции или самой коллекцией с помощью методов HTTP, как описано в следующей таблице:
Операция | HTTP метод | Код состояния | Содержание |
---|---|---|---|
Получить | ПОЛУЧИТЬ | 200 | Запись Atom, представляющая ресурс |
Создайте | ПОСЛЕ | 201 | URI вновь созданного ресурса через заголовки Location и Content-Location. |
Обновить | ПОЛОЖИТЬ | 200 | Запись Atom, представляющая ресурс |
удалять | УДАЛЯТЬ | 200 | Никто |