Использование основанной на JSON Schema проверки в функционально насыщенных интернет-приложениях

Повышение надежности с помощью JSV и Dojo

Сложные AJAX-приложения могут взаимодействовать с сотнями различных JSON-сервисов, что вызывает необходимость проверки на стороне клиента. В данной статье сравнивается несколько библиотек основанной на JSON Schema проверки. Узнайте, как использовать библиотеки для проверки JSON-объектов. В качестве бонуса загрузите пример программы, которая поможет вам создавать собственные схемы и проверять по ним объекты.

Ник Мейнард, консультант по технологиям Web 2.0, IBM

Ник Мейнард (Nick Maynard) работает в группе Business Solutions Team подразделения IBM Software Lab в Херсли (Великобритания). Специализируется на Dojo, Ajax, Web-программировании, Web-сервисах и Linux. Связаться с ним можно по адресу nick.maynard@uk.ibm.com.



25.06.2012

Обзор

AJAX-приложения зависят от JSON-сервисов, результаты работы которых должны соответствовать ожиданиям. Если сервисы предоставляют ответы в непредусмотренном формате или с неправильным содержимым, поведение приложения может стать непредсказуемым. В случае сложных приложений можно смягчить риск непредсказуемого поведения, реализуя специализированные процедуры для проверки получаемых от сервисов данных. В качестве альтернативы для проверки входных данных можно использовать JSON Schema.

Часто используемые сокращения

  • HTML: Hypertext Markup Language (язык разметки гипертекста)
  • JSON: JavaScript Object Notation (система обозначений объектов JavaScript)
  • JSV: JSON Schema Validator (программа проверки JSON Schema)

JSON Schema – это проект стандарта, специфицирующего JSON-формат для определения структуры JSON-данных. На момент написания данной статьи самой последней версией была draft-03 (см. раздел Ресурсы).

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

Загрузите примеры, используемые в данной статье.


Выбор библиотеки для приложения

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

Таблица 1. Библиотеки основанной на JSON Schema проверки для JavaScript
Библиотека (автор)Поддержка версий проектаПриблизительный размер библиотеки
JSV: JSON Schema Validator (Гари Корт (Gary Court))draft-01, draft-02, draft-03120 КБ
json-schema (Крис Зип (Kris Zyp))draft-0310 КБ (требует CommonJS)
dojox.json.schema (Крис Зип (Kris Zyp))draft-0210 КБ (требует Dojo)
schema.js (Андреас Калш (Andreas Kalsch))draft-02 (неполная)10 КБ (требует CommonJS)

Приложение, основанное на Dojo, может использовать библиотеку dojox.json.schema, поскольку она включена в инструментальный пакет. Приложение, которое должно поддерживать несколько версий (проектов) стандарта, может использовать JSV.

Библиотека dojox.json.schema является ответвлением json-schema, поэтому используется аналогично. Библиотеку schema.js использует только подмножество draft-02. В статье основное внимание уделяется примерам использования dojox.json.schema и JSV.


Использование dojox.json.schema

В листинге 1 приведен фрагмент HTML-кода, проверяющего простой объект. Он предназначен для внедрения в HTML-элемент head.

Листинг 1. Простое использование dojox.json.schema
<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.7.0/dojo/dojo.js"
    type="text/javascript"></script>

<script type="text/javascript">

    require(["dojox/json/schema"], function() {
        // Объект для проверки
        var successObj = { 
            "foo" : "bar"
        };
        var failureObj = {
            "foo" : 1234
        };
        
        // Schema
        var schema = { 
            "type": "object",
            "properties" : {
                "foo" : {
                    "type" : "string"
                }
            }
        };
        
        // Запуск проверки, которая должна пройти успешно
        // Измените эту строку, чтобы использовать failureObj для вывода ошибки
        var result = dojox.json.schema.validate(successObj, schema);
        
        // Проверка результатов
        if (result.valid) {
            // Успешное завершение, выполнить какие-то действия
            alert("Object is valid");
        } else {
            // Неудачное завершение – извлечь массив ошибок
            var errorArr = result.errors;
            alert("property : " + errorArr[0].property + "\nmessage :  " 
                + errorArr[0].message);
        }
    });
    
</script>

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

В листинге 2 приведен фрагмент HTML-кода, проверяющий простой объект. Он предназначен для внедрения в HTML-элемент head.

Листинг 2. Простое использование JSV
<!-- Внимание! Для реального использования вы должны сами загрузить копии
библиотек. github – это не CDN. -->
<script src="https://raw.github.com/garycourt/JSV/master/lib/uri/uri.js"
    type="text/javascript"></script>
<script src="https://raw.github.com/garycourt/JSV/master/lib/jsv.js"
    type="text/javascript"></script>
<script src="https://raw.github.com/garycourt/JSV/master/lib/json-schema-draft-03.js"
    type="text/javascript"></script>

<script type="text/javascript">

        // Объект для проверки
        var successObj = { 
            "foo" : "bar"
        };
        var failureObj = {
            "foo" : 1234
        };
        
        // Schema
        var schema = { 
            "type": "object",
            "properties" : {
                "foo" : {
                    "type" : "string"
                }
            }
        };
        
        // Запуск проверки, которая должна пройти успешно
        var env = JSV.createEnvironment("json-schema-draft-03"); 
        // Измените эту строку, чтобы использовать failureObj для вывода ошибки
        var result = env.validate(successObj, schema);
        
        // Проверка результата
        if (result.errors.length === 0) {
            // Успешное завершение, выполнить какие-то действия
            alert("Object is valid");
        } else {
            // Неудачное завершение – извлечь массив ошибок
            var errorArr = result.errors;
            alert("uri : " + errorArr[0].uri + "\nmessage :  " 
                + errorArr[0].message);
        }

</script>

JSV предоставляет расширенную информацию об ошибках в массиве errors. Каждая ошибка может содержать следующие атрибуты:

  • message: понятное человеку сообщение об ошибке.
  • uri: URI дефектного объекта.
  • schemaUri: URI схемы, вызывающей неудачное завершение проверки.
  • Attribute: ограничение Schema, вызывающее неудачное завершение проверки.
  • Details: массив в свободной форме, содержащий дополнительную информацию, например ожидаемые значения.

Комбинирование основанной на JSON Schema проверки с XMLHttpRequest

При разработке сложных AJAX-приложений рассмотрите возможность использования вышеописанных методик для проверки AJAX-взаимодействий. Проверка объекта – это простая процедура, если схема представлена в виде JavaScript-объекта. Существуют разнообразные решения для получения объектов схемы.

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

  • Накладные расходы на загрузку страниц. Предварительная загрузка схем выглядит привлекательно, но может замедлить загрузку страницы.
  • Накладные расходы на AJAX-вызовы. Отложенная загрузка схем повлияет на первый вызов, использующий каждую схему. Проверка каждого взаимодействия может привести к снижению производительности. Подумайте о проверке только наиболее сложных сервисов.

Написание JSON Schema

Определение JSON Schema имеет множество нюансов, поэтому написание и тестирование схем может оказаться не простым делом. В статье содержится ссылку на программу JSON Schema Lint, которая поможет в создании и тестировании JSON Schema.

Советы и рекомендации

  • Проект JSON Schema Internet Draft (см. раздел Ресурсы) содержит полное описание спецификации JSON Schema и является бесценным ресурсом. Обязательно ознакомьтесь с последней версией проекта.
  • Подумайте об использовании JSON Schema для работы с сервисами документирования. Используйте атрибут description для описания свойств.
  • При написании схем соотносите потребности приложения и строгость проверки. В случае тщательной проверки можно полностью определить каждый атрибут, но это может привести к недолговечности сервиса, развивающегося с приложением. JSON Schema позволяет частичную проверку, что может оказаться полезным в данном случае.
  • Используйте расширенные возможности JSON Schema для ограничения свойств. Для этого можно использовать additionalProperties, enum, minItems, maxItems и т.д.
  • Если нужно разрешить свойству иметь несколько типов, можно использовать массив для их определения. В качестве альтернативы используйте тип any.

Заключение

В статье рассматривались способы основанной на JSON Schema проверки JavaScript-объектов с использованием двух библиотек. Также были даны советы по созданию библиотек проверки взаимодействий и рассмотрены передовые методики создания схем. В статье содержится ссылка на программу, которая поможет вам при создании и тестировании собственных схем.


Загрузка

ОписаниеИмяРазмер
Пример использования dojox.json.schemadojox_json_schema-example.html2 КБ
Пример использования JSVjsv-example.html2 КБ
Программа для создания и тестирования JSON Schemajsonschema.zip140 КБ

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Web-архитектура
ArticleID=822512
ArticleTitle=Использование основанной на JSON Schema проверки в функционально насыщенных интернет-приложениях
publish-date=06252012