Статьи

JSON-схема в WADL

Между другими работами я недавно просматривал спецификацию WADL с целью устранения некоторых проблем с документацией с целью создания обновленной версии. Одной из причин, по которой очевидно, было отсутствие какой-либо поддержки грамматики для языков, отличных от XML, — да, вы можете использовать отображение из XML-схемы JSON <->, но для пуриста JSON это будет менее чем приятно.

Поэтому я начал смотреть на то, как можно было бы присоединить грамматику JSON-Schema к документу JSON в WADL-описании службы. Это еще не спецификация; но предложение о том, как это может работать последовательно.

Сейчас я в основном работаю с Джерси, поэтому давайте посмотрим, что Джерси будет генерировать в настоящее время для сервиса, который возвращает и XML, и JSON. Таким образом, сервис здесь реализован с использованием привязки JAX-B, поэтому они оба используют похожую структуру, определенную ссылкой XML-Schema в include.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<application xmlns="http://wadl.dev.java.net/2009/02">
    <doc xmlns:jersey="http://jersey.java.net/" jersey:generatedBy="Jersey: 1.16-SNAPSHOT 10/26/2012 09:28 AM"/>
    <grammars>
        <include href="xsd0.xsd">
            <doc title="Generated" xml:lang="en"/>
        </include>
    </grammars>
    <resources base="http://localhost/">
        <resource path="/root">
            <method id="hello" name="PUT">
                <request>
                    <representation xmlns:m="urn:message" element="m:requestMessage"  mediaType="application/json" />
                    <representation xmlns:m="urn:message" element="m:requestMessage" mediaType="application/xml" />
                </request>
                <response>
                    <representation xmlns:m="urn:message" element="m:responseMessage" mediaType="application/json"/>
                    <representation xmlns:m="urn:message" element="m:responseMessage" mediaType="application/xml" />
                </response>
            </method>
        </resource>
    </resources>
</application>

Итак, первое, что мы рассмотрели, — это повторно использовать существующее свойство элемента, которое определяется как QName, в элементе представления для ссылки на импортированную JSON-схему. Здесь показано как с, так и с другой стороны, произвольное пространство имен может быть рассмотрено отдельно от элементов XML без пространства имен.

01
02
03
04
05
06
07
08
09
10
11
12
<grammars>
        <include href="xsd0.xsd" />
        <include href="application.wadl/responseMessage" />
    </grammars>
 
    <representation element="responseMessage" mediaType="application/json"/>
 
Or
 
    <representation
        element="json:responseMessage" mediaType="application/json" />

Проблема заключается в том, что спецификация JSON-Schema в ее нынешнем виде не имеет понятия свойства name, поэтому каждая JSON-Schema уникально идентифицируется по своему URI. Также из моего прочтения спецификации каждая JSON-схема содержит определение не более одного документа, а не нескольких типов / документов, которые могут содержаться в XML-схеме.

Поэтому следующим лучшим предложением было бы просто использовать часть «имени файла» URI в качестве прокси для URI; но, конечно, это не обязательно будет уникальным. Я видел, например, правительство США и Yahoo, которые публикуют свой собственный «адресный» микроформат.

Лучшее решение этой проблемы — ввести новый атрибут, к счастью, с учетом этого была разработана спецификация WADL, которая имеет тип URI, который можно использовать для прямой ссылки на определения JSON-схемы. Поэтому вместо прямого импорта в предыдущем примере мы имеем свойство URI для самого элемента. Имя атрибута « byndby »получено из предложения JSON-Schema и соответствует значению rel, используемому для ссылок на атомы в спецификации.

01
02
03
04
05
06
07
08
09
10
11
    xmlns:m="urn:message"
 
    <grammars>
        <include href="xsd0.xsd" />
    </grammars>
 
    <representation
        mediaType="application/json"
        element="m:responseMessage"
        json:describedby="application.wadl/responseMessage" />

Второстепенное преимущество заключается в том, что этот формат обратно совместим с инструментами, основанными на грамматике XML-схемы. Хотя это, вероятно, интересно только людям, которые работают с инструментами для тестирования / тестирования, такими как я.

Если у вас есть определение JSON-схемы, то некоторые пользователи захотят покончить с XML все вместе, поэтому, наконец, вот простое сопоставление WADL с документом JSON, который содержит только информацию о JSON-схеме. Сергей Бреёзкин предположил, что отображение JSON покажет только грамматику json, и я подхожу к такому мышлению. Мне было бы интересно услышать о сценарии использования для отображения JSON, который хотел бы получить доступ к XML-схеме.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
   "doc":{
      "@generatedBy":"Jersey: 1.16-SNAPSHOT 10/26/2012 09:28 AM"
   },
   "resources":{
      "@base":"http://localhost/",
      "resource":{
         "@path":"/root",
         "method":{
            "@id":"hello",
            "@name":"PUT",
            "request":{
               "representation":[
                  {
                     "@mediaType":"application/json",
                     "@describedby":"application.wadl/requestMessage"
                  }
               ]
            },
            "response":{
               "representation":[
                  {
                     "@mediaType":"application/json",
                     "@describedby":"application.wadl/responseMessage"
                  }
               ]
            }
         }
      }
   }
}

В настоящее время я использую mime-тип «application / vnd.sun.wadl + json» для того, чтобы это сопоставление соответствовало стандартному MIM-типу WADL. Я подозреваю, что мы хотели бы изменить это в будущем; но это подойдет для начала.

Так что это все очень интересно, но вы не можете поиграть с этим, если у вас нет примера реализации. У меня есть кое-что, работающее как для серверной части, так и для генератора Java-клиентов в Джерси и wadl2java соответственно, и это будет темой моего следующего поста. Я работал с Павлом Бучеком в команде из Джерси над этими реализациями и предложением WADL, большое спасибо ему за то, что он поддержал меня.