URL, кодирующий тело верблюда - PullRequest
4 голосов
/ 10 января 2011

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 10 января 2011

Хорошо, я укусила пулю. Я создал 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>

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

2 голосов
/ 22 февраля 2013

Вы также можете использовать Groovy язык, как это:

<?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>
...