Между другими работами я недавно просматривал спецификацию 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" ?> < 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 > < 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 xmlns:json="http://wadl.dev.java.net/2009/02/json" < 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:json="http://wadl.dev.java.net/2009/02/json-schema" 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" :{ "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, большое спасибо ему за то, что он поддержал меня.