Между другими работами я недавно просматривал спецификацию WADL с целью устранения некоторых проблем с документацией и создания обновленной версии. Одна из очевидных вещей заключалась в отсутствии какой-либо поддержки грамматики для языков, отличных от XML — да, вы можете использовать отображение из XML-схемы JSON <->, но для пуриста JSON это будет менее чем приятно.
Поэтому я начал смотреть на то, как можно было бы присоединить
грамматику JSON-Schema к документу JSON в WADL-описании службы. Это еще не спецификация; но предложение о том, как это может работать последовательно.
Сейчас я в основном работаю с Джерси, поэтому давайте посмотрим, что Джерси в настоящее время сгенерирует для сервиса, который возвращает XML и JSON. Таким образом, сервис здесь реализован с использованием привязки JAX-B, поэтому они оба используют похожую структуру, определенную ссылкой XML-Schema в include.
<?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 без пространства имен.
<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 для самого элемента. Имя атрибута »
byedby «получено из предложения JSON-Schema и соответствует значению rel, используемому для ссылок на атомы в спецификации.
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-схеме.
{
"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. Большое ему спасибо за то, что терпели меня.