Получить тело Http в Apache Camel не работает, если тип содержимого не представлен

Работая с apache camel, я нашел кое-что интересное, кое-что, что я должен исправить в моем случае... Итак, у меня есть маршрут POST, который работает с разными типами URL-адресов и т. д., я имею в виду, что я должен получить тело http внутри моего процессора.

Я должен быть в состоянии прочитать, например, это:

curl -X POST -d'a=b'  http://localhost:8080/........  (DOESN'T WORK)

или (что то же самое)

curl -X POST --data 'a=b'  http://localhost:8080/........ (DOESN'T WORK)

И это не работает! Но работает, когда я добавляю заголовок Content-type в запрос:

curl -X POST -H"Content-type: application/json" -X POST -d'a=b'  http://localhost:8080/........  (WORKS)

или ДАЖЕ НЕДЕЙСТВИТЕЛЬНО (!!)

curl -X POST -H"Content-type: xxxxxxx" -X POST -d'a=b'  http://localhost:8080/........ (WORKS)

это РАБОТАЕТ!

(На всякий случай, как я получаю тело в коде в Processor):

String mainBody = exchange.getIn().getBody(String.class);
if(mainBody == null || mainBody.isEmpty()) {
    LOG.error("EMPTY!");
} else {
    LOG.error("FOUND " + mainBody);
}

Странная вещь? Во время отладки понял, что Content-type по умолчанию — application/x-www-form-urlencoded. И когда я делаю

curl -X POST -H"Content-type: application/x-www-form-urlencoded" -X POST -d'a=b'  http://localhost:8080/........ (DOESN'T WORK)

это тоже не работает.

Итак, моя проблема заключается в том, как заставить его работать всегда? У меня нет каких-то специальных форматов, типов контента и т. Д., Моя вещь должна просто перенаправлять все тело третьей стороне и использовать все типы контента (даже если они не указаны). Как я могу это сделать?

P.S. Моя конфигурация XML

<rests id="rests" xmlns="http://camel.apache.org/schema/spring">
    <rest id="rest-custom">
     .....
       <post uri="/?matchOnUriPrefix=true&amp;bridgeEndpoint=true" method="POST">
            <description>....</description>
            <route>
                <process ref="unknownPostRedirectProcessor" />
                <to uri="direct:commonRoute" />
            </route>
        </post>
    </rest>

Этот «пост» перехватывает все почтовые запросы и работает нормально, за исключением описанной проблемы.


person Den Doeson    schedule 11.02.2020    source источник
comment
какова ваша конфигурация остальных компонентов?   -  person Sunand Padmanabhan    schedule 12.02.2020
comment
Отредактировал мой вопрос   -  person Den Doeson    schedule 12.02.2020


Ответы (1)


Используйте curl -v, чтобы увидеть, как curl вставляет Content-Type: application/x-www-form-urlencoded по умолчанию для метода POST.

Попробуйте установить для свойства обмена Exchange.SKIP_WWW_FORM_URLENCODED значение true, чтобы Camel не привязывал параметры запроса к заголовкам Camel, если вам нужен доступ к необработанному телу HTTP-запроса.

person Zoran Regvart    schedule 28.02.2020
comment
@DenDoeson взгляните на метод Exchange::setProperty - person Zoran Regvart; 04.03.2020