JSON-WSP - JSON-WSP

JSON-WSP (Протокол веб-службы JavaScript Object Notation) - это протокол веб-службы, который использует JSON[1] для описания услуги, запросов и ответов. Он вдохновлен JSON-RPC, но отсутствие спецификации описания сервиса с документацией в JSON-RPC спровоцировало разработку JSON-WSP.

Формат описания для JSON-WSP имеет ту же цель, что и WSDL имеет для МЫЛО или же IDL за CORBA, который должен описывать типы и методы, используемые в данной службе. Он также описывает отношения между типами (то есть вложенные типы) и определяет, какие типы ожидаются в качестве аргументов метода и какие типы пользователь может ожидать в качестве возвращаемых значений метода. Наконец, описание открывает возможность добавления документации по уровням обслуживания, метода, параметра и возврата.

Связь между клиентами и сервером JSON-WSP осуществляется с помощью HTTP ПОЧТОВЫЙ[2] запросы и ответы с объектами JSON в виде данных с типом содержимого application / json.[3]

Характеристики

JSON-WSP состоит из четырех спецификаций объекта JSON:

Технические характеристикиОписание
описаниеСпецификация описания услуги (например, WSDL ). В этой спецификации описаны методы, параметры методов, типы и возвращаемые типы. Он также поддерживает пользовательскую документацию по уровням услуг, методов и параметров.
запросСпецификация для запросов JSON. Он содержит информацию о том, какой метод должен быть вызван, и все аргументы для вызова метода. Аргументы в запросе должны подчиняться определению параметра того же метода, которое описано в соответствующем описании JSON-WSP.
откликСпецификация для ответов в формате JSON. Объект ответа содержит результат вызова метода службы. Тип возврата должен соответствовать определенному типу возврата того же метода в соответствующем описании JSON-WSP.
винаСпецификация ответов об ошибках JSON. Объект ошибки содержит код ошибки и строку ошибки. Информация об ошибке указывает, произошла ли ошибка на стороне клиента или сервера. В зависимости от инфраструктуры службы на стороне сервера может быть извлечена более подробная информация, например имя файла и номер строки, в которой произошла ошибка.

ПРИМЕЧАНИЕ. Спецификация JSON-WSP 1.0 все еще[когда? ] не окончательный. Пожалуйста, обратитесь к реальному примеру в этой статье, чтобы получить представление о том, как будет структурирована спецификация. Текущее состояние спецификации хранится на launchpad.net :.[4] Предложение RFC в настоящее время создается и, надеюсь, будет принято в течение пары месяцев.[когда? ]

Понимание обозначений спецификации

Строительные блоки

  • Если имя определяемого строительного блока начинается с rx-, это означает, что определение является регулярное выражение. В этих определениях квадратные скобки играют роль определения классы персонажей а круглые скобки определяют группы захвата.
  • Во всех остальных случаях квадратные скобки обозначают списки, а круглые скобки обозначают либо решение:[написание? ]:
    (d1 | d2 | ...)
    повторение 0-многие:
    ( ... )*
    повторение 1-много:
    ( ... )+
    или что-то необязательное:
    ( ... )?

Общие строительные блоки

<rx-freetext> = ".*"<rx-идентификатор> = "[a-zA-Z _] [a-zA-Z0-9 _] *"<rx-номер> = [0-9]+<rx-boolean> = (истина | ложь)<ключ> = <rx-идентификатор><примитивное значение> = ( <rx-freetext> | <rx-номер> | <rx-boolean> )<ценить> = (    <примитивное значение> |    [ ( <ценить>, )* ] |    { ( <ключ>: <ценить>, )* } )<имя-метода> = <rx-идентификатор><наименование услуги> = <rx-идентификатор>

Описание объекта базы данных

Дополнительные строительные блоки

<примитивный> = ("строка" | "число" | "с плавающей точкой" | "вложение")<сервис-локатор> = <строка, соответствующая rfc-1738><имя типа> = <rx-идентификатор><имя члена> = <rx-идентификатор><разнотипный> = ( <примитивный> | <имя типа> | [<примитивный>] | [<имя типа>] )<doc-строка> = <rx-freetext><имя-параметра> = <rx-идентификатор><порядок отмены> = <rx-номер><param-необязательный> = <rx-boolean>

Технические характеристики

{    "тип": "jsonwsp / описание",    "версия": "1.0",    "наименование услуги": <service-name>,    "URL": <service-locator>,    "типы": { (        <имя-типа>: { (            <имя-члена>: <multi-type> )+        } )*    },    "методы": { (        <имя-метода>: {            "doc_lines": [ ( <doc-string>, )* ],            "параметры": { (                <имя-параметра>: {                    "doc_lines": [ ( <doc-string>, )* ],                    "def_order": <def-order>,                    "тип": <multi-type>,                    "необязательный": <param-optional>                }, )*            },            "ret_info": {                "doc_lines": [ ( <doc-string>, )* ],                "тип": <multi-type>            }        } )+    }}

Описания

<указатель-службы>:URL-адрес конечной точки службы, который принимает объекты запроса JSON-WSP POST.

<имя-службы>:Имя службы чувствительно к регистру. Он идентифицирует конкретную службу, доступную на определенном сервере.

doc_lines:Каждая строка документа, содержащаяся в списке doc_lines, отражает одну строку документации, которая относится к родительскому объекту doc_lines ..

Объект запроса

Объект запроса содержит информацию о том, какой метод вызывать и с какими аргументами вызывать метод. Он также хранит информацию о своем типе и версии.

Необязательный зеркало значение может использоваться для отправки информации от клиента, которая затем будет отражена сервером и возвращена без изменений в объекте ответа отражение ценить. Эта функция позволяет клиентам отправлять несколько запросов к методу и отправлять значения идентификации запроса, которые могут быть перехвачены обработчиком ответа клиента. Это часто необходимо из javascript, если сервером одновременно обрабатывается более одного запроса, а порядок ответа неизвестен клиенту.

Технические характеристики

{    "тип": "jsonwsp / запрос",    "версия": "1.0",    "имя метода": <method-name>,    "аргументы": { ( <ключ>: <значение>, )* }(,    "зеркало": <value> )?}

Объект ответа

Технические характеристики

В отражение значение - это неизменное серверное отражение объекта запроса зеркало ценить. Он помечен как необязательный, потому что именно клиент контролирует с помощью запроса, есть ли он там или нет.

{    "тип": "jsonwsp / ответ",    "версия": "1.0",    "наименование услуги": <service-name>,    "имя метода": <method-name>,    "результат": <значение> (,    "отражение": <value> )?}

Объект ответа на ошибку

Дополнительные строительные блоки

<код неисправности> = ("несовместимый" | "клиент" | "сервер")<строка ошибки> = <rx-freetext><имя файла ошибки> = <rx-freetext><вина-льняное> = <rx-номер>

Технические характеристики

{    "тип": "jsonwsp / fault",    "версия": "1.0",    "вина": {        "код": <fault-code>,        "нить": <fault-string>,        ("деталь": [ ( <fault-string>, )* ] ,)?        ("имя файла": <fault-filename>,)?        ("льняное": <fault-lineno>,)?    }(,    "отражение": <value> )?}

Описания

<код-ошибки>:Значения возможных кодов неисправностей:

  • «несовместимо»: клиентская версия JSON-WSP несовместима с серверной версией JSON-WSP. Обычно этот тип кода ошибки возникает, если между клиентом и сервером есть разница в основной версии.
  • «server»: ошибка произошла на стороне сервера после того, как запрос клиента был успешно обработан.
  • "client": запрос клиентов не может быть обработан сервером из-за неправильного формата или отсутствия необходимых аргументов и т. д.

Пример из реального мира

Описание

{    "тип": "jsonwsp / описание",    "версия": "1.0",    "наименование услуги": «UserService»,    "url": "http://testladon.org:80/proxy.php?path=UserService/jsonwsp",    "типы": {        "Группа": {            "group_id": "номер",            "показать имя": "нить",            "имя": "нить",            "члены": ["Пользователь"]        },        "Пользователь": {            "имя пользователя": "нить",            "ID пользователя": "номер",            "мобильный": "нить",            "возраст": "номер",            "собственное имя": "нить",            "фамилия": "нить"        },        "CreateUserResponse": {            "ID пользователя": "номер",            "успех": "логическое"        }    },    "методы": {        "listUsers": {            "doc_lines": [«Список пользователей, у которых есть имя пользователя, given_name или фамилия, которые соответствуют заданному фильтру».],            "параметры": {                "name_filter": {                    "def_order": 1,                    "doc_lines": [«Строка, используемая для фильтрации результирующего списка пользователей».],                    "тип": "нить",                    "необязательный": ложный                }            },            "ret_info": {                "doc_lines": [«Список пользователей».],                "тип": ["Пользователь"]            }        },        "listGroups": {            "doc_lines": [«Список групп, имя или отображаемое имя которых соответствует заданному фильтру».],            "параметры": {                "name_filter": {                    "def_order": 1,                    "doc_lines": [«Строка, используемая для фильтрации результирующего списка групп».],                    "тип": "нить",                    "необязательный": ложный                }            },            "ret_info": {                "doc_lines": [«Список групп».],                "тип": ["Группа"]            }        },        "Создать пользователя": {            "doc_lines": [«Создайте новую учетную запись пользователя».],            "параметры": {                "имя пользователя": {                    "def_order": 1,                    "doc_lines": [«Уникальное имя пользователя для новой учетной записи».],                    "тип": "нить",                    "необязательный": ложный                },                "собственное имя": {                    "def_order": 2,                    "doc_lines": ["Имя."],                    "тип": "нить",                    "необязательный": ложный                },                "фамилия": {                    "def_order": 3,                    "doc_lines": ["Фамилия."],                    "тип": "нить",                    "необязательный": ложный                },                "мобильный": {                    "def_order": 4,                    "doc_lines": [«Необязательный номер мобильного телефона».],                    "тип": "нить",                    "необязательный": истинный                },                "возраст": {                    "def_order": 5,                    "doc_lines": [«Необязательный возраст лица, стоящего за аккаунтом»],                    "тип": "номер",                    "необязательный": истинный                }            },            "ret_info": {                "doc_lines": [],                "тип": «CreateUserResponse»            }        }    }}

Сервисный вызов 1

Запрос

{    "тип": "jsonwsp / запрос",    "версия": "1.0",    "имя метода": "Создать пользователя",    "аргументы": {        "имя пользователя": "Bettyw",        "собственное имя": "Бетти",        "фамилия": "Уилсон",        "мобильный": "555-3423444"    },    "зеркало": {        "я бы": 2    }}

Ответ

{    "тип": "jsonwsp / ответ",    "версия": "1.0",    "наименование услуги": «UserService»,    "имя метода": "Создать пользователя",    "результат": {        "ID пользователя": 324,        "успех": истинный    },    "отражение": {        "я бы": 2    }}

Сервисный вызов 2

Запрос

{    "тип": "jsonwsp / запрос",    "версия": "1.0",    "имя метода": "listUsers",    "аргументы": {        "name_filter": "Джек"    }}

Ответ

{    "тип": "jsonwsp / ответ",    "версия": "1.0",    "наименование услуги": «UserService»,    "имя метода": "listUsers",    "результат": [{        "имя пользователя": "джекп",        "ID пользователя": 153,        "мобильный": "555-377843",        "возраст": 34,        "собственное имя": "Джек",        "фамилия": "Петерсен"    }, {        "имя пользователя": "Брэдж",        "ID пользователя": 321,        "мобильный": "555-437546",        "возраст": 27,        "собственное имя": "Брэд",        "фамилия": "Джексон"    }]}

Вложения

В вложение Тип является новым в JSON-WSP. Его можно использовать в любом месте описания как примитивный тип. В запросах и ответах, содержащих вложения, формат сообщения должен быть multipart / related где вложения транспортируются как копии мультимедийного типа: приложение / октет-поток без Content-Transfer-Encoding (только необработанный двоичный код). Mimeparts должны иметь уникальный CONTENT-ID в заголовках объектов. Значения вложений в объектах запроса / ответа JSON-WSP должны соответствовать регулярному выражению «^ cid: (. +) $», Где группа захвата сопоставляется с одним из идентификаторов CONTENT-ID mimepart.

Пример описания услуги вложения

В следующем примере показано, как может выглядеть простое описание JSON-WSP с вложениями:

{    "тип": "jsonwsp / описание",    "версия": "1.0",    "URL": "http://mysite.com/TransferService/jsonwsp",    "наименование услуги": «ТрансферСервис»,    "типы": {        "Файл": {            "данные": "вложение",            "имя": "нить"        }    },    "методы": {        "загрузить": {            "ret_info": {                "doc_lines": [],                "тип": "номер"            },            "doc_lines": [],            "параметры": {                "входящий": {                    "def_order": 1,                    "doc_lines": [],                    "тип": [ "Файл" ],                    "необязательный": ложный                }            }        }    }}

Пример запроса на услугу прикрепления

Запрос к описанному выше методу upload может выглядеть так:

Тип содержимого:составной/связанные с;граница="2676ff6efebdb664f8f7ccb34f864e25"--2676ff6efebdb664f8f7ccb34f864e25Тип содержимого:заявление/json, charset = UTF-8Content-ID: body{    "тип": "jsonwsp / запрос",    "версия": "1.0",    "имя метода": "загрузить",    "аргументы": {        "входящий": [ {            "данные": "cid: img2354.png",            "имя": "face.png"        }, {            "данные": "cid: cv.pdf",            "имя": "cv.pdf"        } ]    }}--2676ff6efebdb664f8f7ccb34f864e25Тип содержимого:заявление/октет-потокContent-ID: img2354.png<png-image binary data>--2676ff6efebdb664f8f7ccb34f864e25Тип содержимого:заявление/октет-потокContent-ID: cv.pdf<pdf-image binary data>--2676ff6efebdb664f8f7ccb34f864e25--

Смотрите также

Рекомендации

  1. ^ «ECMAScript - спецификация языка 2017» (PDF). Ecma-international.org. Архивировано из оригинал (PDF) 12 апреля 2015 г.. Получено 28 января 2018.
  2. ^ Рой, Филдинг; Джулиан, Решке. «Протокол передачи гипертекста (HTTP / 1.1): семантика и содержание». Tools.ietf.org. Получено 28 января 2018.
  3. ^ «Архивная копия». Архивировано из оригинал на 2011-07-17. Получено 2011-02-14.CS1 maint: заархивированная копия как заголовок (связь)
  4. ^ [1][мертвая ссылка ]