Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   HTTP Get XML Datei empfangen (https://www.delphipraxis.net/185092-http-get-xml-datei-empfangen.html)

LaCosaMia 14. Mai 2015 15:47

HTTP Get XML Datei empfangen
 
Hallo zusammen,

mein Name ist Stefan und ich bin neu hier. Ich Programmiere schon einige Zeit mit Delphi, und brauche bei meinem jetzigen Projekt die Hilfe der Community.
Ich soll einen Web Service in Delphi programmieren, welcher eine XML Datei annimmt, welche sich im Body eines Streams befindet.
Eine Umsetzuung in C# ist mir soweit mal gelungen, nur leider ist mit C# dann die Validierung des Contents sehr aufwendig.
Daher nun mein Versuch den Service mit Delphi abzubilden, da ich hier schon die nötigen Plausibilitätsprüfungen habe.

In C# habe ich es wie folgt gelöst:

Code:

StreamReader stream = new StreamReader(Request.InputStream);
{
     XmlDocument xml = new XmlDocument();

     xml.LoadXml(stream.ReadToEnd());

     string n = string.Format("Test-{0:yyyy-MM-dd_hh-mm-ss-tt}.xml",DateTime.Now);

     xml.Save(path + @n);
     fileUploaded = true;    
           
               
            }
Wie könnte ich das mit Delphi lösen ?
Die XMl Datei wird per POST an den Webservice geschickt.

Danke

vagtler 14. Mai 2015 15:53

AW: HTTP Get XML Datei empfangen
 
GET oder POST? Was denn nun?

LaCosaMia 14. Mai 2015 16:12

AW: HTTP Get XML Datei empfangen
 
Verschickt wird die Datei mit POST.
Empfangen will ich sie mit GET ?! :?

Sir Rufo 14. Mai 2015 16:15

AW: HTTP Get XML Datei empfangen
 
Zitat:

Zitat von LaCosaMia (Beitrag 1301519)
Verschickt wird die Datei mit POST.
Empfangen will ich sie mit GET ?! :?

Sind die Blumen künstlich? - Natürlich! - Äh, wie jetzt, natürlich oder künstlich? - Natürlich künstlich!

Kommunikation ist schon was feines ...

LaCosaMia 14. Mai 2015 16:19

AW: HTTP Get XML Datei empfangen
 
Ja, irgwendwie etwas schwierig.

Die XML wird wie bereits beschrieben im Body per POST an den Web Service übertragen.
Das ich als Empfänger den Stream mit GET annehme, war bisher meine Annahme.

Helft mir auf die Sprünge.

vagtler 14. Mai 2015 16:20

AW: HTTP Get XML Datei empfangen
 
Zitat:

Zitat von LaCosaMia (Beitrag 1301519)
Verschickt wird die Datei mit POST.
Empfangen will ich sie mit GET ?! :?

Vielleicht sollten wir erst einmal ganz von vorne anfangen: https://www.google.de/webhp?q=http%20tutorial

Sir Rufo 14. Mai 2015 16:20

AW: HTTP Get XML Datei empfangen
 
Ja das ist falsch :mrgreen:

LaCosaMia 14. Mai 2015 16:22

AW: HTTP Get XML Datei empfangen
 
Ja, da war ich wohl mit GET etwas voreilig. :stupid:

Sorry.

Ich muss den Input Stream annehmen. Mit welcher Komponente könnte ich das am besten realisieren ?

vagtler 14. Mai 2015 16:27

AW: HTTP Get XML Datei empfangen
 
TIdHttpServer stellt Dir einen Stream zur Verfügung.

LaCosaMia 14. Mai 2015 16:36

AW: HTTP Get XML Datei empfangen
 
Kann ich den TIdHttpServer auch in Form eines Web Services nutzen ?
Der Web Service soll hinterher auf einem Apache laufen.

Danke für die Hilfe.

vagtler 14. Mai 2015 16:39

AW: HTTP Get XML Datei empfangen
 
Das ist der Zeitpunkt, wo wir vielleicht noch einmal auf Anfang gehen sollten.

Was sind Deine genauen Anforderungen?

LaCosaMia 14. Mai 2015 17:04

AW: HTTP Get XML Datei empfangen
 
Die Datei wird über einen Client, auf welchen ich keinen Einfluß habe, per HTTP POST im Body an den Web Service übertragen.

Nun muss ich mit einem Web Service oder CGI Anwendung diesen UTF8 Stream annehmen und weiterverarbeiten. Mit C# habe ich das ja schon gut hinbekommen, lediglich die Weiterverarbeitung des Stream bzw. der XML Datei ist in C# für mich etwas schwierig.

War das detailiert genug?

vagtler 14. Mai 2015 17:43

AW: HTTP Get XML Datei empfangen
 
Zitat:

Zitat von LaCosaMia (Beitrag 1301533)
[...] War das detailiert genug?

Nein. Nicht mal ansatzweise.

Was verstehst Du unter einem Webservice? https://en.wikipedia.org/wiki/Web_service

Sollst Du eine RESTful-Architektur realisieren, oder doch lieber SOAP-basiert? Oder vielleicht irgendwas selbst gebrautes?

Dann sprichst Du plötzlich von einer Datei. Oben hast Du noch von einem XML im Body gesprochen. Das ist nicht dasselbe.

Und dann kommen auch noch Buzzwords wie Apache, CGI und UTF8-Stream vor, ohne sie näher zu erläutern.

Von fehlenden Plattformangaben z.B. ganz zu schweigen - wobei das daran liegen mag, dass ich nicht mal ansatzweise auf die Idee kommen würde, Apache unter Windows zu betreiben.

LaCosaMia 14. Mai 2015 17:57

AW: HTTP Get XML Datei empfangen
 
Ok, fangen wir von vorne an.

- Der Apache läuft auf einem Windowsrechner (ist so, kann ich erstmal nicht auf den IIS umstellen)
- Es wird vom Client eine XML Struktur per POST im Body an den Web Service (reden wir gleich nochmal darüber) als UTF8-Stream geschickt.
- In C# habe ich den Stream angenommen und wieder als XML File abgespeichert.
- Spontan würde ich RESTful sagen, da ich lediglich eine Methode, das Annehmen des Streams brauche.

Besser?

LaCosaMia 14. Mai 2015 17:59

AW: HTTP Get XML Datei empfangen
 
Es geht im ersten Schritt lediglich um die Übertragung des Streams.

vagtler 14. Mai 2015 18:30

AW: HTTP Get XML Datei empfangen
 
Welche Rolle spielt der Apache? Wofür brauchst Du den?

Und welcher Stream soll wohin übertragen werden?

LaCosaMia 14. Mai 2015 18:45

AW: HTTP Get XML Datei empfangen
 
Der Stream soll vom Client an den Server übertragen werden, daher auch der Webserver. Dieses ganze Konstrukt wurde vor ca. 10 Jahren mit einer Aspx Seite designed.
Ich muss nur den Stream annehmen und weiterverarbeiten. Aber als Web Service.

mkinzler 14. Mai 2015 18:54

AW: HTTP Get XML Datei empfangen
 
Eine .Net Webseite auf einem Apache?
Wie wird der Stream dorthin übertragen?
Das verwendete Verfahren ist irgendwie verwirrend.
Für die Weiterverarbeitung würde sich da eher eine .Net Sprache anbieten. Wie wird/soll der Stream an dein Programm/Apachemodul/ISAPI-Modul weitergeleitet werden?

LaCosaMia 14. Mai 2015 18:59

AW: HTTP Get XML Datei empfangen
 
Aspx Seite läuft mit Mono auf dem Apache. Nicht mein Konzept :-D

Bekomme ich das mit Delphi nicht gut hin?

Es gibt zur Weiterverabeitung der XML Datei, welche aus dem Stream entsteht, schon so viele Delphi Komponenten, dass ein Umstieg auf C# schmerzlich wäre.

mkinzler 14. Mai 2015 19:04

AW: HTTP Get XML Datei empfangen
 
Wie groß ist die XML-Datei ( die in einem Stream übertragen wird und nicht aus einem besteht). Wie soll diese weiterverarbeitet werden?

LaCosaMia 14. Mai 2015 19:09

AW: HTTP Get XML Datei empfangen
 
Zitat:

Zitat von mkinzler (Beitrag 1301553)
( die in einem Stream übertragen wird und nicht aus einem besteht).

Richtig :)

Die Datei ist ca. 3 KB groß.
In der Datei befinden sich Bestellparamter, welche auf Plausibilität geprüft werden.

mkinzler 14. Mai 2015 19:20

AW: HTTP Get XML Datei empfangen
 
Aber je nach Ergebnis muss ja die Weiterverarbeitung im .Net Programm erfolgen.
Wie erfolgt die Plausibilitätsprüfung?
Welche Komponenten sind den wichtig?

LaCosaMia 14. Mai 2015 19:29

AW: HTTP Get XML Datei empfangen
 
Die Plausibilitätsprüfung findet bisher im .net Programm noch gar nicht statt. Daher die Vorstellung es mit Delphi lösen zu können.
Die Prüfungen in Form von Delphi Komponenten bestehen, da es noch andere Transportwege für die Bestelldatei gibt.

Am geschicktesten wäre es so, wie ich es mit C# schon gelöst habe.
Ich nehme den HttpRequest.InputStream an und gebe nach der Prüfung mit Return ein Orderresponse zurück.

Danke

mkinzler 14. Mai 2015 19:39

AW: HTTP Get XML Datei empfangen
 
Dir zu Helfen ist schwer, da Du die Fragen irgendwie immer beantwortest ohne diese wirklich zu beantworten. Wenn die Frage war, wie die Plausibilitätsprüfung erfolgt was für Komponenten es sind, hast Du beidest mal geantwortet, warum Du das willst.

Das es andere Bestellwege gibt ist hier zudem unerheblich. Du erzeugt einen Bruch im Vorgang, in dem du ein anderes Programm dazwischenschiebst.
Du kannst das Problem wie schon angedeutet über ein Stand alone Delphi-Programm (CLI oder WebServer) oder ein Webservermodul lösen ( dso oder iaspi) ein Webservermodul ist aber ein "Konsolenprogramm" da funktionieren keine (grafischen) Komponenten.

LaCosaMia 14. Mai 2015 19:59

AW: HTTP Get XML Datei empfangen
 
Die Prüfung findet in einer selbstgeschriebenen XML Komponente statt.
Wie muss der Web Service in Delphi aussehen, das ich adäquat zum C# Webservice den Http Input Stream annehmen kann?

LaCosaMia 14. Mai 2015 20:03

AW: HTTP Get XML Datei empfangen
 
Grafische Komponenten brauche ich keine.
Über eine Konsolenanwendung habe ich auch schon nachgedacht. Wie schaffe ich es, dass die Konsolenanwendung den Stream annimmt, welcher per HTTP Post versand wurde?

mkinzler 14. Mai 2015 20:04

AW: HTTP Get XML Datei empfangen
 
Kommt auf den c# Webservice an.

Aber ich würde mir eher überlegen, ob diese Vorgehensweise sinnvoll ist. U.U. schaftst Du Dir somit nur Probleme, abgesehen das Du unnötigerweise mehrfach das Gleiche machst ( wie z.B. das Parsen der XML. Ich würde die Plausibilitätsprüfung direkt in ASP.Net machen. Somit muß die XML-Struktur nur einmal geparst und interpretiert werden.

LaCosaMia 14. Mai 2015 20:06

AW: HTTP Get XML Datei empfangen
 
Ja, da muss ich mir nur noch etwas C# Knowhow anlesen.

Wird aber wahrscheinlich das einfachste sein.

Danke.

mjustin 14. Mai 2015 20:54

AW: HTTP Get XML Datei empfangen
 
Zitat:

Zitat von LaCosaMia (Beitrag 1301528)
Kann ich den TIdHttpServer auch in Form eines Web Services nutzen ?
Der Web Service soll hinterher auf einem Apache laufen.

Ja, man kann mit TIdHTTPServer auch ohne weiteres einen Web Service bauen. Dazu muss nur eine Methode implementiert werden, in der man auf den Stream des POST Requests zugreifen kann (siehe unten).

Ein TIdHTTPServer ist aber so wie der Apache HTTP Server ein eigenständiger TCP Server. Wenn man ihn mit einem bestehenden Apache verwenden will, dann ist die einfachste Möglichkeit den Apache als Reverse Proxy zu konfigurieren. Der Apache Server leitet dann externe Anfragen an den in Delphi geschriebenen Web Service weiter. Meist genügen dafür ein paar Zeilen in der Apache Konfiguration

Code:
...
ProxyRequests Off
ProxyPass /service http://localhost:8080/service/
ProxyPassReverse /service http://localhost:8080/service/
...
Der Apache kann dann parallel auch andere HTTP Requests bearbeiten, z.B. PHP oder statische Dokumente. Nur die Requests an den Web Service werden an die Delphi Anwendung 'delegiert'.

Die vom Client per POST gesendeten Stream Daten stehen in der PostStream Property des ARequestInfo Parameters des TIdHTTPServer Eventhandler.

Wenn man die Komponente zur Designzeit erzeugt hat und den OnCommandGet EventHandler anklickt, kann man den automatisch erzeugten Sourcecode um die eigene Behandlung ergänzen.

Delphi-Quellcode:
procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  ReceivedStream: TStream;
begin
  // weise den Stream meiner temporären Variable zu
  ReceivedStream := ARequestInfo.PostStream;
  // verwende den Stream
  ...
  // Freigeben des Streams ist nicht notwendig, der Stream wird von Indy freigegeben
  // xxxStream.Free;
 
end;
Anstatt den HTTP Server zur Designzeit zu erzeugen kann man ihn auch dynamisch - zur Laufzeit - erstellen. Man benötigt dann nicht mehr die Forms und andere Teile der VCL, was die Web Service Anwendung kleiner macht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz