# Datei kodiert zu Webservice senden



## Charlie123 (24. Mai 2011)

Hallo,

ich habe noch nicht allzu viel Erfahrung mit Java gesammelt und bin gerade dabei einen Webservice zu programmieren.
Hier ein paar wichtige Angaben dazu:

-Der Service soll eine XML-Datei von einem Client erhalten. 

-Ich habe bereits einen Client mit JFileChooser zum Auswählen einer solchen XML-Datei erstellt und erhalte dadurch eine Referenz auf das File-Objekt. 

-Jetzt habe ich gesehen, dass der Webservice in der Methode, die die XML-Datei erwartet, entweder einen String mit dem Pfad der Datei braucht oder aber einen String, der den Inhalt der Datei direkt enthält. 

Nun meine Frage:

Bisher habe ich den kompletten Inhalt einer XML-Datei beim Client ausgelesen und dann dem Service als String gesendet.

Effektiver wäre es doch bestimmt die Datei verschlüsselt zu versenden, gerade bei größeren oder ?
Dazu habe ich schon diverse Hinweise bezüglich einer Möglichkeit so eine Datei binär (?) zu codieren gelesen, aber das war meist nicht gerade anfängerfreundlich geschrieben.

Mein Problem ist, wie ich so eine Codierung umsetzen kann und was man dann statt dem String, der den Dateiinhalt enthält, als Typ für den Parameter für die vom Service erwartete Datei angeben soll. 

Wenn mir jemand dazu ein einfaches Beispiel geben könnte, wäre mir sehr geholfen.

Vielen Dank an alle, die bereit sind mir zu helfen =)


----------



## Gast2 (24. Mai 2011)

Ersteinmal solltest du dir den Unterschied zwischen "verschlüsselt" und "kodieren" klar machen.

Und nein - warum sollte es effizienter sein das XML Dokument zu verschlüsseln oder in ein anderes Datenformat zu umzurechnen? Das würd nur dann Sinn machen wenn du den XML Overhead entfernst und nur die Nutzdaten schickst. Ich denke aber nicht das dies die Aufgabe ist.

Den request im XML Format zu schicken ist bei einem Webservice eigentlich normal. Den Overhead durch die XML Datenstruktur wird dabei bewusst in kauf genommen. Es gibt natürlich auch andere Möglichkeiten, aber du solltest dir erstmal klar machen was du eigentlich willst/sollst.


----------



## SlaterB (24. Mai 2011)

es geht um eine richtige XML-Datei, nicht unbedingt den WebService-Request an sich, soweit ich das sehe,
Zippen wäre in jedem Fall ne gute Idee wie bei allen großen Textdateien


----------



## Charlie123 (24. Mai 2011)

Ich beschreibe es nochmal genauer:

Es soll von einem Client aus eine mit dem JFileChooser ausgewählte lokale XML-Datei zu einem Webservice übertragen werden.
Dies könnte man theoretisch ja in unterschiedlichen Formen machen:

1) Man liest die XML-Datei mit einem Reader aus und speichert den kompletten Inhalt in einem String und überträgt diesen dann zum Webservice. (DAS MACHE ICH BISHER)

2)Ich mache irgendwas mit der File-Referenz, die ich nach der Benutzung des JFileChoosers habe, um diese umzuwandeln und übertrage die Datei dann in dieser Form. (DA ICH NICHT GENAU WEISS, WAS MAN MIT DER FILE ANSTELLEN KANN, FRAGE ICH HIER DANACH, ES SOLL NICHT VERSCHLÜSSELT SEIN, ALSO KEINE SICHERHEITSASPEKTE, SONDERN EHER KOMPRIMIERT, EBEN SO, DASS ICH NICHT DEN KOMPLETTEN TEXTINHALT DER DATEI SCHICKEN MUSS, WENN ES EFFIZIENTER GEHT. DIE FRAGE IST AUCH, WIE ICH BEIM SERVICE DIE DATEI DANN WIEDER IN DIE URSPRÜNGLICHE FORM BEKOMME)

3)Ich bezweifle, dass man die File-Referenz selbst übertragen kann, da sie ja auf ein Objekt auf dem lokalen Heap zeigt oder geht das bei Benutzung eines Webservices???

Hoffe es ist nun ein wenig klarer geworden, was das Problem ist.


----------



## SlaterB (24. Mai 2011)

du wirst doch schonmal von einen Zip gehört haben?
da du auf mein Posting nicht reagiert hast, wiederhole ich selbiges: Zip ist kleiner als nicht Zip

Galileo Computing :: Java ist auch eine Insel – 17.8 Datenkompression *
heraus kommt wahrscheinlich ein byte[], da musst du wissen ob du das geeignet übertragen kannst,

evtl. mit Base64-Encoding in einen String umwandeln


----------



## musiKk (24. Mai 2011)

SlaterB hat gesagt.:


> evtl. mit Base64-Encoding in einen String umwandeln



...was das Ganze natürlich wieder um ein Drittel aufbläst. Die Methode muss nicht immer falsch sein, ich wills nur erwähnt haben.

Eine andere Möglichkeit wäre, bei der HTTP-Übertragung gzip (oder vergleichbar) als Content/Transfer Coding zu nutzen.

Alternativ können binäre Daten effizient per MTOM übertragen werden (googlen...). Das ist besonders für große Daten sinnvoll, da diese auch den XML-Parser entlasten und nicht komplett im RAM vorliegen müssen.


----------



## Charlie123 (26. Mai 2011)

Eure Anregungen bzgl. der Komprimierung haben mir schon geholfen. Danke dafür !

Ich frage mich aber noch als Einsteiger, ob ich in meinem Webservice auch eine Methode dieser Art bereitstellen kann:

public void machWas(File xmlFile) {...}

Ich habe in meinem Service folgenden Code vor der Klasse eingefügt:


```
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;

@WebService
@SOAPBinding(style=Style.RPC)
```

Wenn ich dann aus meiner Klasse mit Hilfe der shell und dem Befehl 
"wsimport -keep http://localhost:8080/webservice?wsdl" meine Interface Klassen für einen Client erzeuge, macht er mir aber aus dem Parameter "File" meiner Webservice Methode einen Parameter vom Typ "String" in dem Interface für den Client.

Ich möchte aber, dass mir der Client einfach seine File übergibt. Im Client hab ich ja wie in früheren Posts beschrieben etwas vom Typ File, nachdem der Benutzer mit dem JFileChooser eine Datei ausgewählt hat. 
Es wäre doch viel komfortabler für diesen, wenn er dem Service ohne weitere Bearbeitung dann das Resultat von JFileChooser übergeben könnte und halt nicht noch die Datei auslesen muss und alles in einen String steckt oder die Datei komprimieren lässt etc. 

ALSO DIE FRAGE:
Geht so etwas nicht ? Muss ich die XML-File immer auslesen oder komprimieren oder sonstiges, um sie einem Webservice zu übergeben oder kann man das gewünschte Ergebnis auf eine bestimmte Weise doch realisieren?

DANKE. Die Forenmitglieder sind wirklich sehr hilfsbereit und einfach spitze !


----------



## SlaterB (26. Mai 2011)

wie du den WebService dazu bringst, ein File zu übertragen, kann ich nicht sagen,
falls beliebige Java-Objekte überhaupt möglich sind, dann wäre File nicht weiter schwer, ist Serializable, enthält wirklich nur einen String, sonst nix,
den String zu übertragen und beim Server new File() aufzurufen ist aber auch keine Arbeit

viel interessanter ist natürlich der Aspekt dass es ausgeschlossen ist, dass der Server etwas mit dem File oder dem Dateipfad anfangen kann,

wenn ich jetzt hier als 'Client' einen String "c:/temp/test.txt" poste und du bist der WebService und liest dann, wie willst du dann an das File rankommen?
entfernte Rechner usw., das ist doch alles klar dass da nix geht,
Ausnahme 1: WebService auf selben Rechner mit gleichen Zugangsmöglichkeiten

Ausnahme 2: es besteht schon irgendein separates Konzept zur Dateiübertragung, etwa Netzwerkfreigabe, FTP oder sonst irgendeine vorhandene Verbindung über der der WebService selbstständig den Transfer der Datei beantragen kann,
dann ist das quasi eine Verschiebung der Aufgabe der Übertragung


----------



## Charlie123 (26. Mai 2011)

Also würdest du dafür argumentieren, dass der Client dann doch zusätzliche Arbeit erledigen muss und den Dateiinhalt als String übermitteln sollte, ob komprimiert oder nicht sei mal dahin gestellt.

Ich dachte es gebe eine Möglichkeit, dass der Client halt nur die Datei auswählen muss und sie direkt übertragen kann. Ansonsten muss ja jeder, der meinen Webservice benutzt erst einmal die Datei auslesen und dann als String übertragen, was ich mir ein wenig aufwändiger vorstelle, aber wenn es nicht anders geht, kann mans nicht ändern.

Danke für die Anmerkung


----------



## SlaterB (26. Mai 2011)

die Frage kann man schon stellen, nur sollte man sie bisschen intelligenter formulieren 

gibt es irgendeine Art automatischer Dateiübertragung? mir nicht bekannt,
im Gegensatz etwa zu HTML mit Benutzerinteraktion, da könnte man selber auf HTML-Ebene sowieso nix machen, 
da ist entweder eine Magie vorhanden oder nicht:
Variablen und Formulare - Wie funktioniert ein Datei-Upload über HTML-Formulare?


----------

