URL-кодирование тела Camel Exchange

Мне нужна помощь с этим вопросом.

Я использую компонент http://camel.apache.org/http.html, как показано здесь, но у меня проблемы, потому что тело, которое я отправляю, имеет неэкранированные амперсанды. Это приводит к тому, что строка запроса на принимающем сервере разбивает сообщение на несколько параметров сообщения.

Я знаю, что могу создавать скомпилированные маршруты в java, но я должен использовать диалект spring xml, чтобы новые маршруты можно было создавать/изменять в файлах конфигурации без перекомпиляции.

Короче говоря, я хотел бы URL-кодировать свойство ${body} на моем маршруте, используя диалект весны, как показано в (очевидно, недопустимом) псевдокоде ниже.

<setBody inheritErrorHandler="true" id="setBody2">
    <simple>name=<urlencode>${body}</urlencode></simple>
</setBody>

person timsabat    schedule 10.01.2011    source источник


Ответы (2)


Хорошо, я укусил пулю. Я создал java POJO

package com.wufoo.camel;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import org.apache.log4j.Logger;

public class PayloadEncoder {
    public String getEncodedBody(String body) throws UnsupportedEncodingException {
        Logger mylogger = Logger.getLogger("log4j.logger.org.apache.camel");
        mylogger.info("Appending payload and URL Encoding");
        String encodedBody = new StringBuffer()
            .append("payload=")
            .append(URLEncoder.encode(body, "UTF-8")).toString();
        return encodedBody;
    }
}

Затем вставил его в контекст

<bean id="payloadEncoder" class="com.wufoo.camel.PayloadEncoder" />

И, наконец, использовал преобразование для кодирования тела

<transform>
    <method bean="payloadEncoder" method="getEncodedBody"/>
</transform>

Это работает. Если кто-нибудь может сказать мне, что не так с этим подходом, пожалуйста, дайте мне знать.

person timsabat    schedule 10.01.2011

Вы также можете использовать заводной язык, например:

<?xml version="1.0" encoding="UTF-8"?>
    <blueprint
    xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
    http://www.osgi.org/xmlns/blueprint/v1.0.0
    http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">
    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <route>
            <from uri="file:camel/input"/>
            <log message="Moving ${file:name} to the output directory"/>
            <setBody>
                <groovy>
                    "name=" + URLEncoder.encode(request.getBody(String.class));
                </groovy>   
            </setBody>
            <to uri="file:camel/output"/>
        </route>
    </camelContext>
</blueprint>
person Jaakko Salmela    schedule 21.02.2013