Apache верблюд, как отправить тело в формате "тело" - PullRequest
0 голосов
/ 10 апреля 2020

Используя Apache верблюд, у меня есть компонент Отдых. Это выглядит так:

    <post uri="/body" method="POST">
        <description>Here is post method</description>
        <param name="save" type="body" dataType="string"/>
        <route>
            <process ref="postRedirectProcessor" />
            <to uri="direct:commonRoute" />
        </route>
    </post>

И эта конечная точка обрабатывает точные запросы, например:

curl -i --data "b=hereisbody" http://localhost:8080/body (works fine, but I don't need it)

(я вижу, что это входит в postRedirectProcessor , и это нормально) , Но это не то, что я хочу. Я хочу, чтобы он обрабатывал запросы следующим образом:

curl -i --data "hereisbody" http://localhost:8080/body (doesn't work, causes 405)

Я имею в виду, формат «данных» , а не , как k = v & k2 = v2 , но это просто строка, как в примере (например, - данные "что-то" ).

Это вызывает исключение, оно не go в postRedirectProcessor.

2020-04-10 18:43:09,716 ERROR [http-nio-8080-exec-6] - ,,, - Servlet.service() for servlet [CamelServlet] in context with path [] threw exception
java.lang.IllegalArgumentException: Invalid parameter, expected to be a pair but was hereisbody
    at org.apache.camel.http.common.DefaultHttpBinding.readFormUrlEncodedBody(DefaultHttpBinding.java:272) ~[camel-http-common-2.24.3.jar:2.24.3]
    at org.apache.camel.http.common.DefaultHttpBinding.readRequest(DefaultHttpBinding.java:116) ~[camel-http-common-2.24.3.jar:2.24.3]
    at org.apache.camel.http.common.HttpMessage.<init>(HttpMessage.java:56) ~[camel-http-common-2.24.3.jar:2.24.3]
    at org.apache.camel.http.common.CamelServlet.doService(CamelServlet.java:187) ~[camel-http-common-2.24.3.jar:2.24.3]
    at org.apache.camel.http.common.CamelServlet.service(CamelServlet.java:79) ~[camel-http-common-2.24.3.jar:2.24.3]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.31.jar:9.0.31]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.31.jar:9.0.31]

Я думал, param type = "body" как в xml опубликовал, делает свое дело, но не повезло.

1 Ответ

1 голос
/ 10 апреля 2020

Curl отправляет данные в --data с заголовком Content-Type: application/x-www-form-urlencoded по умолчанию. См. Как разместить необработанные данные тела с помощью curl?

x-www-form-urlencoded должно быть в формате ключ / значение ( спецификация ). По этой причине возникает исключение.

Имя отделяется от значения =, а пары имя / значение отделяются друг от друга &.

Для отправки необработанных данных необходимо указать еще один Content-Type.

curl -v -i -H "Content-Type: text/plain" --data "hereisbody" http://localhost:8080/body
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...