2010-03-10 70 views

Respuesta

3

no sé es posible el envío de formularios de varios ejemplares que utilizan el componente de HTTP.

Si necesita la solución alternativa, puede crear POJO Spring Bean que utiliza Apache Http Client (y su MultipartPostMethod). A continuación, puede enrutar su mensaje a ese bean:

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

Gracias, eso es lo que esencialmente he hecho. Ahora funciona. –

+0

@KaiSternad: ¿puede explicar cómo lo hizo con cierto detalle? –

+0

@AbhishekRanjan Lo siento, desafortunadamente no recuerdo los detalles. Ha sido un tiempo. –

0

¿Tiene que estar usando Camel?

Apache FileUpload hace esto, sencillamente, http://commons.apache.org/fileupload/using.html

+1

Sí, tiene que ser camello. Además, Apache Fileupload es un componente del lado del servidor. Necesito subir archivos de camello a un servidor que ya sabe cómo procesar cargas de varias partes. He recurrido a encapsular la parte de carga en un bean separado. Hubiera sido bueno, sin embargo, hacerlo funcionar de la caja. –

0

¿Podría por favor proporcionar más detalles cómo desea que la forma multiparte llegue al camello apache?

¿Debería ser alguna forma en una página web que se envíe directamente a la ruta Camel? ¿O AMQ cola? Sugiero que compruebe Apache HTTP y Apache Jetty componentes.

2

Siempre que su cuerpo de mensaje esté en formato multipart/form-data, puede usar el componente http de Camel para POSTARLO a otro servidor. El truco es configurar el tipo de contenido correctamente y establecer el método de petición para ser 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" 

    [email protected] 
    --__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> 

Obviamente, el cuerpo ejemplo anterior no es tan útil porque es todos los datos estáticos. Hay varias maneras de construir el cuerpo: he utilizado la salida XSLT en modo texto, una expresión con guiones (por ejemplo, < groovy> ... </groovy>) y un Spring bean. XSLT funciona bien cuando el cuerpo de mensaje entrante ya es un documento 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> 

Usted tiene que tener cuidado con espacios en blanco extra, sin embargo. ¡Espero que esto ayude!

1

que había trabajando en un proyecto web por debajo de características:

  1. Formulario de acceso: la gente entra y se puede cargar el archivo; (Camel: Jetty, Http, JDBC)

  2. Cargar formulario; subir servlet: si las personas pueden iniciar sesión; puede cargar archivos xml a ftp o servidor web; (Camel: archivo)

3.El archivo está validado por mi archivo .xsd; (Camel: Validator)

  1. El archivo es comprobado por mi archivo de esquema .xsl; (Camel: XSLT)

Fui creado proyecto web por mi IDE favorito (IntelliJ IDEA por Jetbrains); Describo parte de mi escenario con el código fuente y espero que esto sea útil ☺

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> 

En primer lugar hay que crear la base de datos y la tabla de inicio de sesión; luego agrega algunos datos de muestra; por ejemplo añadir estos archivos:

2) schema.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) prueba de data.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) config primavera-context.xml

Entonces , puede usar bases de datos integradas como derby, H2, mysql u otras. Añadir a continuación config para el archivo de configuración de primavera:

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

5) camello context.xml

Ahora, puede ejecutar su proyecto; antes hay que agregar esta ruta a su contexto de camello:

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

Cuando ejecuta nuestro proyecto; Se mostró la página index.html y puede poner los cuadros de texto de nombre de usuario y contraseña y enviar su formulario.

En realidad, Camel escuchaba este puerto de escolta y obtenía la información de su publicación. Puede obtener esta información por el encabezado de Camel como '$ {in.header.user}'.

Como puedes ver, configuré mi consulta de selección en Camel's Body, por lo que el resultado de la selección también se almacena en Camel's Body. quiero leer mi resultado y tiene algunas decisiones, por esta razón, añado procesador de camello de la siguiente manera:

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); 
    } 
} 

}

En LoginProcessor he comprobado el cuerpo y si el nombre de usuario y la contraseña son válidos; Agregue la propiedad del encabezado de Camel y su nombre por 'nombre' por nombre de campo de la tabla. De lo contrario, establezca el valor nulo en la propiedad del encabezado de Camel.

Regrese al archivo xml de contexto de Camel y continúe con la ruta. Si el encabezado de Camel es nulo; redireccionar usuario a la página fail.html; de lo contrario, redirija a la página que obtiene el archivo del usuario (archivo.html).

Nota: la propiedad bridgeEndpoint Está configurando el punto final http para ser bridgeEndpoint lo que significa que la URL de solicitud se actualizará con el URI de solicitud.

Cuestiones relacionadas