2010-03-10 23 views

Antwort

3

Ich weiß nicht, ist es möglich, mehrteiliger Formulare mit der HTTP-Komponente zu senden.

Wenn Sie die Problemumgehung benötigen, können Sie POJO Spring Bean erstellen, die den Apache Http Client (und seine MultipartPostMethod) verwendet. Dann können Sie Ihre Nachricht an diese Bohne weiterleiten:

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

Danke, das habe ich im Wesentlichen gemacht. Es funktioniert jetzt. –

+0

@KaiSternad: Können Sie erklären, wie Sie es im Detail gemacht haben? –

+0

@AbhishekRanjan Es tut mir leid, leider erinnere ich mich nicht an die Details. Es ist eine Weile her. –

0

Muss Camel verwendet werden?

Apache Dateiupload tut dies ganz einfach http://commons.apache.org/fileupload/using.html

+1

Ja, es muss Kamel sein. Außerdem ist Apache FileUpload eine serverseitige Komponente. Ich muss Dateien von Camel auf einen Server hochladen, der bereits weiß, wie man Multi-Teil-Uploads verarbeitet. Ich habe den Upload-Teil in eine separate Bean gekapselt. Es wäre aber schön gewesen, wenn es funktioniert hätte. –

0

Könnten Sie bitte mehr Details zur Verfügung stellen, wie wollen Sie mehrteilige Form erreichen Apache Kamel?

Sollte es ein Formular auf einer Webseite sein, die direkt an Camel Route senden? Oder AMQ-Warteschlange? Ich würde vorschlagen, Sie überprüfen Apache HTTP und Apache Jetty Komponenten.

2

Solange Ihr Nachrichtentext im Multipart-/Formdatenformat vorliegt, können Sie die Camel http-Komponente verwenden, um sie an einen anderen Server zu senden. Der Trick ist, Ihren Content-Type richtig zu setzen und die Request-Methode gesetzt POST sein:

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

Offensichtlich über das Beispiel Körper nicht so nützlich ist, weil es alle statischen Daten sind. Es gibt eine Reihe von Möglichkeiten, wie Sie den Körper konstruieren können - Ich habe XSLT verwendet, das im Textmodus ausgibt, einen skriptgesteuerten Ausdruck (z. B. < groovy> ... </groovy>) und eine Spring-Bohne. XSLT funktioniert gut, wenn Ihr eingehender Nachrichtentext ist bereits ein XML-Dokument:

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

brauchen Sie vorsichtig über zusätzliche Leerzeichen zu sein, aber. Hoffe das hilft!

1

ich auf einem Web-Projekt gearbeitet hatte von unten Features:

  1. Login Form: Menschen anmelden und die Datei laden können; (Camel: Jetty, Http, JDBC)

  2. Uploadformular; Servlet hochladen: wenn sich Leute einloggen können; kann XML-Datei auf ftp oder Webserver hochladen; (Camel: file)

3.file durch meine XSD-Datei überprüft wird; (Camel: Validator)

  1. Datei wird von meiner .xsl-Schemadatei überprüft; (Camel: XSLT)

Ich war Webprojekt von meinen Lieblings-IDE (IntelliJ IDEA von Jetbrains) schaffen; Ich beschreibe einen Teil meines Szenarios mit Quellcode und hoffe, das ist nützlich ☺

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> 

Zuerst Datenbank und Login-Tabelle erstellen haben; Fügen Sie dann einige Beispieldaten hinzu. zum Beispiel fügen Sie diese Dateien:

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 feder context.xml

Dann Sie können eingebettete Datenbanken wie Derby, H2, MySQL oder andere verwenden. In unter config Ihrer Feder-Konfigurationsdatei:

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

5) Kamel context.xml

Nun Sie Ihr Projekt ausführen können; bevor tun, dass Sie diesen Weg zu Ihrem Kamel Kontext hinzufügen:

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

Wenn Sie unser Projekt laufen; Die Seite index.html wurde angezeigt und Sie können die Textfelder Benutzername und Passwort eingeben und Ihr Formular senden.

Eigentlich hörte Camel diesen Anlegesteg und bekam Ihre Post Informationen. Sie können diese Informationen von Camels Header wie '$ {in.header.user}' erhalten.

Wie Sie sehen können, habe ich meine Select-Abfrage in Camel's Body gesetzt, damit das ausgewählte Ergebnis auch in Camels Body gespeichert wird. Ich möchte mein Ergebnis und bekam einige Entscheidungen aus diesem Grund lesen füge ich Camel Prozessor wie folgt:

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 ich den Körper überprüft und wenn Eingabe-Benutzername und Passwort gültig sind; Fügen Sie die Header-Eigenschaft von Camel hinzu und benennen Sie sie nach dem Namen der Tabelle. Andernfalls setzen Sie in der Header-Eigenschaft von Camel den Wert null.

Zurück zu Camel Context XML-Datei und die Route fortsetzen. Wenn der Header von Camel Null ist; Benutzer auf die Seite fail.html umleiten; andernfalls auf die Seite umleiten, die die Datei vom Benutzer abruft (file.html).

Hinweis: bridgeEndpoint-Eigenschaft Sie legen den HTTP-Endpunkt als bridgeEndpoint fest, was bedeutet, dass die Anfrage-URL mit dem Anfrage-URI aktualisiert wird.