Составная HTTP-публикация Apache Camel (загрузка файла)

StackOverflow https://stackoverflow.com/questions/2415708

  •  19-09-2019
  •  | 
  •  

Вопрос

Как я могу выполнять загрузку файлов из нескольких частей, используя HTTP-компонент Apache Camel?

Это было полезно?

Решение

Я не знаю, возможно ли отправлять составные формы с помощью HTTP-компонента.

Если вам нужен обходной путь, вы можете создать POJO Spring Bean, который использует Http-клиент Apache (и его MultipartPostMethod).Затем вы можете перенаправить свое сообщение на этот компонент:

from("activemq:uploadQueue").to("bean:myApacheHttpClientBean?method=sendMultiPart")

Другие советы

Пока текст вашего сообщения находится в формате multipart / form-data, вы можете использовать http-компонент Camel для ОТПРАВКИ его на другой сервер.Хитрость заключается в том, чтобы правильно настроить тип вашего контента и установить метод запроса на POST:

<route>
  <from uri="direct:start"/>
  <setBody>
    <![CDATA[
    --__MyCoolBoundary__
    Content-Disposition: form-data; name="name"

    Paul Mietz Egli
    --__MyCoolBoundary__
    Content-Disposition: form-data; name="email"

    paul@example.com
    --__MyCoolBoundary__--
    ]]>
  </setBody>
  <setHeader headerName="Content-Type">
    <constant>multipart/form-data; boundary="__MyCoolBoundary__"</constant>
  </setHeader>
  <setHeader headerName="CamelHttpMethod">
    <constant>POST</constant>
  </setHeader>
  <to uri="http://www.example.com/mywebservice.php"/>
</route>

Очевидно, что приведенный выше текст примера не настолько полезен, потому что это все статические данные.Существует несколько способов создания тела - я использовал вывод XSLT в текстовом режиме, написанное по сценарию выражение (например<groovy>...</groovy>), и весенняя фасоль.XSLT хорошо работает, когда тело вашего входящего сообщения уже является XML-документом:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
--__MyCoolBoundary__
Content-Disposition: form-data; name="name"

<xsl:value-of select="//name"/>
--__MyCoolBoundary__--
</xsl:stylesheet>

Однако вам нужно быть осторожным с дополнительными пробелами.Надеюсь, это поможет!

Я работал над веб-проектом с помощью следующих функций:

  1. Форма входа в систему:люди входят в систему и могут загрузить файл;(Верблюд:Причал, Http, JDBC)

  2. Форма для загрузки;загрузить сервлет:если люди могут войти в систему;может загружать xml-файл на ftp или веб-сервер;(Верблюд:файл)

3. Файл проверяется моим файлом .xsd;(Верблюд:Валидатор)

  1. Файл проверяется моим файлом схемы .xsl;(Верблюд:XSLT)

Я создавал веб-проект с помощью моей любимой IDE (IntelliJ IDEA by Реактивные Мозги);Я описываю часть моего сценария с исходным кодом и надеюсь, что это полезно ☺

1) index.html

<form action="http://0.0.0.0:8080/hello" method="post">

<fieldset title="Login" >

    username:<input type="text" id="user" name="user"/>
    password:<input type="password" id="pass" name="pass" />

    <input type="submit" id="submit" value="submit"/>

</fieldset>

Сначала вам нужно создать базу данных и таблицу входа в систему;затем добавьте несколько примеров данных;например, добавьте эти файлы:

2) схема.sql

DROP TABLE IF EXISTS CONTACT;
CREATE TABLE CONTACT (
   ID INT NOT NULL AUTO_INCREMENT
 , NAME VARCHAR(40) NOT NULL
 , USERNAME VARCHAR(40) NOT NULL
 , PASSWORD VARCHAR(60) NOT NULL
 , VERSION INT NOT NULL DEFAULT 0
 , UNIQUE UQ_CONTACT_1 (USERNAME)
 , PRIMARY KEY (ID));

3) тестовые данные.sql

insert into contact (name, username, password) values ('ali', 'aliti', '123');
insert into contact (name, username, password) values ('shahab', 'shahab', '147');
insert into contact (name, username, password) values ('farhad', 'farhad', '159');

4) конфигурация spring-context.xml

Затем вы можете использовать встроенные базы данных, такие как derby, H2, mysql или другие.Добавьте нижеприведенную конфигурацию в свой конфигурационный файл spring:

<jdbc:embedded-database id="dataSource" type="H2">
    <jdbc:script location="classpath:schema.sql"/>
    <jdbc:script location="classpath:test-data.sql"/>
</jdbc:embedded-database>

5) camel-context.xml

Теперь вы можете запустить свой проект;прежде чем сделать это, вы должны добавить этот маршрут в свой контекст camel:

<route>
        <from uri="jetty:http://0.0.0.0:8080/hello"/>

        <setBody>
            <simple>
                select * from contact where USERNAME = '${in.header.user}' and PASSWORD = '${in.header.pass}'
            </simple>
        </setBody>

        <to uri="jdbc:dataSource"/>

        <process ref="loginProcessor"/>

        <log message=">>>header: ${in.header.name}"/>

        <choice>
            <when>
                <simple>${in.header.name} == null</simple>
                <to uri="jetty://http://localhost:9090/fail.html?bridgeEndpoint=true"/>
            </when>

            <otherwise>
                <to uri="jetty://http://localhost:9090/file.html?bridgeEndpoint=true"/>
            </otherwise>
        </choice>

Когда вы запускаете наш проект;index.html страница была показана, и вы можете ввести текстовые поля имени пользователя и пароля и отправить свою форму.

На самом деле Camel прослушивал этот jetty port и получил информацию о вашем сообщении.Вы можете получить эту информацию по заголовку Camel, например '${in.header.user}'.

Как вы можете видеть, я задал свой запрос select в теле Camel, таким образом, результат select также сохраняется в теле Camel.Я хочу прочитать свой результат и получить некоторые решения, по этой причине я добавляю процессор Camel, как показано ниже:

6) LoginProcessor.java

public class LoginProcessor implements Processor {
public void process(Exchange exchange) throws Exception {

    int size = ((ArrayList) exchange.getIn().getBody()).size();
    if (size > 0) {
        Object name = ((LinkedHashMap) (((ArrayList) exchange.getIn().getBody()).get(0))).get("NAME");
        System.out.println("welcome user: " + name);
        exchange.getOut().setHeader("name",name);
    } else {
        System.out.println("user or pass are invalid. ");
        exchange.getOut().setHeader("name",null);
    }
}

}

В LoginProcessor я проверил тело и, являются ли введенные имя пользователя и пароль действительными;Добавьте свойство заголовка Camel и назовите его ‘name’ по имени поля таблицы.В противном случае установите нулевое значение в свойстве заголовка Camel.

Вернитесь к XML-файлу контекста Camel и продолжайте маршрут.Если заголовок Camel равен null;перенаправить пользователя на fail.html страницу;в противном случае перенаправьте на страницу, которая получает файл от пользователя(file.html).

Примечание:Свойство bridgeEndpoint Вы устанавливаете конечную точку http в качестве bridgeEndpoint, что означает, что URL-адрес запроса будет обновлен с помощью URI запроса.

Обязательно ли для этого использовать Camel?

Apache Fileupload делает это довольно просто http://commons.apache.org/fileupload/using.html

Не могли бы вы, пожалуйста, предоставить более подробную информацию о том, как вы хотите, чтобы составная форма достигла apache camel?

Должна ли это быть какая-то форма на веб-странице, которая отправляется непосредственно на Camel route?Или очередь AMQ?Я бы посоветовал вам проверить Apache HTTP и Пристань Апачей Компоненты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top