Рестлет, возвращающий 422 с Post ("xml") в DomRepresentation - PullRequest
0 голосов
/ 31 октября 2018

Я использую Реселлет ServerResource в приложении Restlet EE для обработки сообщения XML. Если я аннотирую @Post и принимаю параметр Представления, то принимаются text / xml и application / xml. Даже если изменить аннотацию на @Post ("xml"), оба типа принимаются. Если я изменяю параметр на DomRepresentation, то application / xml отклоняется с кодом состояния 422 и сообщением:

Сервер понимает тип содержимого объекта запроса, и синтаксис объекта запроса является правильным, но не смог обработать содержащиеся в нем инструкции

Я тестирую с Postman и просто меняю тип Body между необработанным XML (application / xml) и XML (text / xml). документация указывает , что org.restlet.ext.xml.DomRepresentation обрабатывает APPLICATION_ALL_XML, APPLICATION_XML и TEXT_XML.

Чего мне не хватает?

Это нормально для обоих:

@Post
public Representation doPost(Representation entity) {
    return entity;
}

Так это:

@Post("xml")
public Representation doPostXml(Representation entity) {
    return entity;
}

Возвращает 422:

@Post("xml")
public Representation doPostXml(DomRepresentation entity) {
    return entity;
}

DomRepresentation будет принимать документ xml при публикации в виде текста text, text / plain, text / xml и text / html, но не как application / xml.

Я попробовал XmlRepresentation.

@Post
public Representation doPost(XmlRepresentation entity) {
    return entity;
}

Ошибка 422 для текста / xml и application / xml. С текстом возвращается 415 и это сообщение:

Сервер отказывается обслуживать запрос, поскольку объект запроса находится в формате, который не поддерживается запрошенным ресурсом для запрошенного метода.

Restlet EE 2.3.12 от maven.restlet.com, размещенный в контейнере Tomcat 8.5 с использованием Java 1.8.

1 Ответ

0 голосов
/ 09 ноября 2018

Вот пример, который я представляю. Пожалуйста, сравните его с вашим кодом и HTTP-запросом и посмотрите, чего не хватает.

Окружающая среда: JDK 1.8
Уровень компилятора: Java 1.7
Файлы Jar: (1) org.restlet.ext.xml.jar (2) org.restlet.jar

Ниже приведен пример кода и HTTP-запрос, который я успешно выполнил.

Код:

package com.arzoo.resources;

import org.restlet.Server;
import org.restlet.data.Protocol;
import org.restlet.ext.xml.DomRepresentation;
import org.restlet.representation.Representation;
import org.restlet.resource.Post;
import org.restlet.resource.ServerResource;

public class TestXml extends ServerResource
{   public static void main(String[] args) throws Exception
    {   // Create the HTTP server and listen on port 8182
        new Server(Protocol.HTTP, 8182, TestXml.class).start();
    }

    @Post("xml")
    public Representation doPostXml(DomRepresentation entity)
    {   return entity;
    }
}

HTTP-запрос из командной строки:

~$ curl -i -H "Content-Type: application/xml" "http://localhost:8182" -d "<MyRoot/>"

HTTP-ответ:

HTTP/1.1 200 OK
Server: Restlet-Framework/2.3.12
Date: Fri, 09 Nov 2018 12:06:28 GMT
Transfer-encoding: chunked
Content-type: application/xml
Vary: Accept-Charset, Accept-Encoding, Accept-Language, Accept

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?><MyRoot/>
...