JSON-WSP - JSON-WSP
Было предложено, чтобы эта статья была слился в JSON. (Обсуждать) Предлагается с августа 2020 года. |
Эта статья поднимает множество проблем. Пожалуйста помоги Улучши это или обсудите эти вопросы на страница обсуждения. (Узнайте, как и когда удалить эти сообщения-шаблоны) (Узнайте, как и когда удалить этот шаблон сообщения)
|
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--
Смотрите также
- JSON-RPC Вызов удаленной процедуры на основе JSON
- Схема JSON
Рекомендации
- ^ «ECMAScript - спецификация языка 2017» (PDF). Ecma-international.org. Архивировано из оригинал (PDF) 12 апреля 2015 г.. Получено 28 января 2018.
- ^ Рой, Филдинг; Джулиан, Решке. «Протокол передачи гипертекста (HTTP / 1.1): семантика и содержание». Tools.ietf.org. Получено 28 января 2018.
- ^ «Архивная копия». Архивировано из оригинал на 2011-07-17. Получено 2011-02-14.CS1 maint: заархивированная копия как заголовок (связь)
- ^ [1][мертвая ссылка ]