Веб-служба REST, принимающая СООБЩЕНИЕ с помощью Restlet - Лучшая практика
-
22-07-2019 - |
Вопрос
У меня есть свой ресурс, и они типичный переопределенный метод для обработки запросов POST.
public void acceptRepresentation(Representation rep) {
if (MediaType.APPLICATION_XML.equals(rep.getMediaType())) {
//Do stuff here
}
else {
//complain!
}
}
Что я хочу знать, так это наилучшую практику обработки моего пакета XML.Я вижу много примеров использования Формы - но наверняка есть способ работать с самим объектом представления или преобразовать его в какой-нибудь полезный XML-объект???
Любая помощь о том, как вы должны и выполняете синтаксический анализ входящего XML в вашем ресурсе, очень ценится.
Решение
Это скорее ответ, который я искал. Благодаря Тьерри Буало за ответ:
Вы можете использовать два вида XML представления " ;: DomRepresentation и SaxRepresentation. Вы можете инстанцировать их обоих с размещенное представление. Например.: DomRepresentation xmlRep = new DomRepresentation (Rep); р>
DomRepresentation дает вам доступ к документу Dom. SaxRepresentation позволяет разбирать XML документ с вашим собственным ContentHandler. Смотрите Javadocs здесь 1 и здесь 2.
<Ол>http://www.restlet.org/documentation/1.1/api/org/restlet/res ource / DomRepresentat ion.html
Ол>
Другие советы
В настоящее время мы делаем это с помощью RESTeasy, альтернативной реализации JAX-RS. Мы используем привязки (аннотации) JAXB для сопоставления между XML и объектами POJO нашей модели и указываем JAXB-провайдера для JAX-RS, чтобы он знал, как это сделать. Это описано в нашем RESTful веб-сервисы в Java EE со статьей RESTEasy (JAX-RS) , которая может помочь.
Обновление: для Restlet, JAXB расширение может быть то, что вам нужно.
С помощью метода presentation.getText ()
вы можете получить строку, которая может быть передана в SAX-парсер или dom-ридер.
@Simon E
Я не понимаю: какую реализацию REST для Java вы используете?
Итак, я просто приведу пример использования JAX-RS (реализация на Джерси)
Серверная часть (метод некоторого класса REST):
@POST
@Path("/upload")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_PLAIN)
public static Response upload(
@FormParam("name") String name,
@FormParam("content") String content)
throws Exception {
// NOTE: you get your content as String
// (do something here)
return Response.ok().build();
}
Клиентская часть (метод некоторого теста JUnit):
@Test
public void uploadFile()
throws Exception {
String address = "http://0.0.0.0:8000/r/upload";
WebResource r = Client.create().resource(address);
Form form = new Form();
form.add("name", "test");
form.add("content", "SOME CONTENT GOES HERE");
String s = r.post(String.class, form);
System.out.println(s);
}
Вот и все !!!
В случае проблем с импортом:
Серверу нужны javax.ws.rs. * И javax.ws.rs.core. *
Клиенту нужен com.sun.jersey.api.client. * И
com.sun.jersey.api.representation. *
В любом случае, я бы посоветовал вам использовать JAX-RS, а не альтернативные реализации, потому что JAX-RS будет частью Предстоящий Java EE 6
Это та же самая процедура даже в restlet 2.0??
Я использую restlet 2.0m6, и вот фрагмент кода, который я использую -
@Сообщение
процесс публичного представительства (представительская организация)
{
попробуй
{
DomRepresentation dom = новое DomRepresentation(сущность);
Document d = dom.getDocument();
.
.
} перехват (Исключение e)
{ e.printStackTrace();}
и он выдает исключение с нулевым указателем в строке dom.getDocument().Это означает, что на самом деле никаких данных не поступало.
И мой бит flex выглядит примерно так - var service :HTTPService = новый HTTPService();service.method="ОПУБЛИКОВАТЬ";service.ContentType="приложение/xml" service.url=url-адрес;токен var :AsyncToken = service.send(параметры);
где params - это XML-объект.