2010-03-10 114 views

risposta

3

non so è possibile inviare moduli a più parti utilizzando il componente HTTP.

Se è necessaria la soluzione alternativa, è possibile creare POJO Spring Bean che utilizza Apache Http Client (e il relativo MultipartPostMethod). Poi si può instradare il messaggio a quella di fagioli:

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

Grazie, è quello che essenzialmente ho fatto. Ora funziona. –

+0

@KaiSternad: puoi spiegare come lo hai fatto in qualche dettaglio? –

+0

@AbhishekRanjan Mi dispiace, purtroppo non ricordo i dettagli. È passato un po 'di tempo. –

0

Deve usare Camel?

Apache Caricamento file fa questo semplicemente http://commons.apache.org/fileupload/using.html

+1

Sì, deve essere cammello. Inoltre, Apache Fileupload è un componente lato server. Ho bisogno di caricare file da cammello su un server che già sa come elaborare caricamenti di più parti. Ho fatto ricorso all'incapsulamento della parte di caricamento in un bean separato. Sarebbe stato comunque carino farlo funzionare fuori dagli schemi. –

0

La prego di fornire maggiori dettagli come vuoi modulo multipart raggiungere cammello apache?

Dovrebbe esserci qualche modulo su una pagina Web che invia direttamente al percorso Camel? O coda AMQ? Ti suggerisco di controllare i componenti Apache HTTP e Apache Jetty.

2

Fintanto che il corpo del messaggio è in formato multipart/form-data, è possibile utilizzare il componente http Camel per inviarlo a un altro server. Il trucco è di impostare il Content-Type correttamente e impostare il metodo di richiesta di essere 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> 

Ovviamente, il corpo esempio di cui sopra non è che utile, perché è di tutti i dati statici. Esistono diversi modi per costruire il corpo: ho utilizzato l'output XSLT in modalità testo, un'espressione basata su script (ad esempio < groovy> ... </groovy>) e un bean Spring. XSLT funziona bene quando il corpo del messaggio in entrata è già 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> 

Si ha bisogno di stare attenti a spazi bianchi in più, però. Spero che questo ti aiuti!

1

avevo lavorando su un progetto web sotto le caratteristiche:

  1. Login Form: la gente login e può caricare il file; (Camel: Jetty, Http, JDBC)

  2. Modulo di caricamento; upload servlet: se le persone possono accedere; può caricare file xml su ftp o web server; (Camel: file)

3. File è convalidato dal mio file .xsd; (Camel: Validator)

  1. Il file è controllato dal file di schema .xsl; (Camel: XSLT)

Sono stato creare un progetto web dal mio IDE preferito (IntelliJ IDEA da Jetbrains); Descrivo parte del mio scenario con codice sorgente e spero che questo sia utile ☺

1) indice.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> 

In primo luogo è necessario creare database e la tabella di login; quindi aggiungere alcuni dati di esempio; per esempio aggiungere questi file:

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

Poi , è possibile utilizzare database incorporati come derby, H2, mysql o altri. Aggiungere al di sotto di configurazione nel file di configurazione di 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) cammello context.xml

Ora, è possibile eseguire il progetto; prima di fare questo è necessario aggiungere questa strada per il contesto di cammello:

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

Quando si esegue il nostro progetto; è stata mostrata la pagina index.html e puoi inserire le caselle di testo username e password e inviare il modulo.

In realtà Camel stava ascoltando questo porticciolo e ha ricevuto le informazioni sul tuo post. Puoi ottenere queste informazioni dall'intestazione di Camel come "$ {in.header.user}".

Come potete vedere, ho impostato la mia query di selezione in Camel's Body, quindi il risultato selezionato è anche memorizzato in Camel's Body. voglio leggere il mio risultato e ottenuto alcune decisioni, per questo motivo aggiungo processore Camel come di seguito:

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

}

In LoginProcessor ho controllato il corpo e se username e password di input sono validi; Aggiungi la proprietà di intestazione di Camel e il nome di 'nome' per nome di campo della tabella. Altrimenti imposta un valore nullo nella proprietà dell'intestazione di Camel.

Torna al file xml del contesto Camel e continua il percorso. Se l'intestazione di Camel è nullo; reindirizzare l'utente alla pagina fail.html; altrimenti reindirizza alla pagina che ottiene il file dall'utente (file.html).

Nota: proprietà bridgeEndpoint Si sta impostando l'endpoint http come bridgeEndpoint, il che significa che l'URL della richiesta verrà aggiornato con l'URI della richiesta.