Получить Http body в Apache Camel не работает, если тип контента не представлен - PullRequest
0 голосов
/ 11 февраля 2020

Работая с apache верблюдом, я нашел что-то интересное, что-то, что я должен исправить в моем случае ... Итак, у меня есть POST-маршрут, который работает на разных типах URL и т. Д. c, я имею в виду, я должен получить тело 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)

it WORKS !

(на всякий случай, как мне получить тело в коде в процессоре):

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)

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

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

PS Мой 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>

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

1 Ответ

0 голосов
/ 28 февраля 2020

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

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

...