Delphi: XML küldése szerver felé

Delphi: XML küldése szerver felé
2008-12-30T00:11:11+01:00
2008-12-31T19:20:22+01:00
2022-11-12T01:25:32+01:00
keem1
Nagy gondom van... A múltkor már frankón megkaptam a választ az XML fájl szerverről történő leszedésére.
Na most az a helyzet adódott, hogy az XML-t vissza is kellene küldeni, egy fogadó PHP-nak. Csakhogy itt elakadtam, olyan nagyon, hogy azt se tudom, merre induljak el. Addig eljutottam, hogy külföldi fórumon valami látszólag hasonló dologra a TIdTCPClient komponenst ajánlották. De ott se írták le, hogy tudnék adatot küldeni. Vajon ez tényleg jó útvonal? A szerver hogy kapja meg az XML-t? POST-on át? És ha túl nagy?
Szóval rengeteg a kérdés bennem... Segítsetek légyszi
Mutasd a teljes hozzászólást!
Mutasd a teljes hozzászólást!

  • Hmm.. ez jónak tűnik.
    Kezdtem azzal, hogy a titkosított átvitelt kivettem belőle.
    De kicsit ködös még ez a HTTP.POST() metódus.
    Nem világos, hogy hogyan mondom meg neki, melyik POST paraméterbe mit tegyen.
    Ha tehát én a POST klasszikus, webes űrlap-rendszerét venném, lenne egy ilyenem (csak szemléltetésképp):

    <form action="xmlupload.php"> <textarea name="xmlcontent"></textarea> <submit value="mehet"> </form>

    Gondolom ez világos, a mezőbe begépelem az XML-t, és szerveroldalon ez az "xmlcontent" változó tartalma lesz, ha PHP-ból nyerem ki az adatot, kb így:
    $xmldata = $_POST["xmlcontent"];

    Maradjunk akkor ennél a példánál, és tegyük fel, hogy az IdHTTP ennek az url-nek küldi a postot: http://localhost/xmlupload.php
    És én a Memo1 szövegét (Memo1.text), amibe az xml-t pötyögtem, ennek a fájlnak kívánom átadni POST-tal, az xmlcontent űrlapmezőn keresztül. Hogy tudom ezt az IdHTTP tudtára hozni?
    Mutasd a teljes hozzászólást!
  • Na, úgy néz ki, van egy TIdMultiPartFormDataStream objektum. Ezzel kísérletezgetek. Elég szűkszavú a külföldi fórum, ahol ráltaláltam, de talán csak megoldom valahogy.
    Mutasd a teljes hozzászólást!
  • Hátha valakinek szüksége van a végleges megoldásomra, megosztom mindenkivel!


    function SendXMLToRemoteServer(ManagerURL: string; XMLData: widestring; var ResponseText: string): integer; var HTTPClient: TIdHTTP; FormData: TIdMultiPartFormDataStream; Response: string; XMLResp: TXMLDocument; ResponseNode, root: IXMLNode; begin // Létrehozzuk az objektumokat FormData := TIdMultiPartFormDataStream.Create; HTTPClient := TIdHTTP.Create(HTTPClient); XMLResp:= TXMLDocument.Create(application); ResponseText:= ''; // Felparaméterezzük a küldendő űrlapot FormData.AddFormField('xmlcontent', XMLData); FormData.AddFormField('sender', 'kovacspista'); // Felparaméterezzük a HTTP objektumot HTTPClient.ReadTimeout := 10000; HTTPClient.ConnectTimeout := 10000; HTTPClient.Request.ContentType := 'multipart/form-data'; HTTPClient.HTTPOptions := []; // Elküldjük az űrlapot (benne az XML adattal) try Response:= HTTPClient.Post(ManagerURL, FormData); XMLResp.XML.Add(Response); XMLResp.Active:=true; root:=XMLResp.DocumentElement; // Beállítjuk a "result"-ra a szervertől érkezett státuszkódot ResponseNode:= root.ChildNodes.FindNode('response'); if ResponseNode.NodeValue = 'OK' then result:=200 else if ResponseNode.NodeValue = 'NOOP' then result:=101 else if ResponseNode.NodeValue = 'NODATA' then result:=102 else result:=103; try ResponseText := root.ChildNodes.FindNode('note').NodeValue; Except ResponseText := ''; end; Except result:=100; end; HTTPClient.Disconnect; // Felszabadítjuk az objektumokat HTTPClient.Free; FormData.Free; XMLResp.Free; end;

    Mivel próbáltam univerzálissá tenni, így a visszakapott státusz xml-t is feldolgozza a metódus, és ha van státuszkód, azt visszadobja visszatérési értékként (ha minden rendben volt, akkor 200, ha nincs művelet az xmlben 101, ha nincs adat, akkor 102 és így tovább).

    Nézzünk csak egy példát a használatára:


    procedure TForm1.Button1Click(Sender: TObject); var ServerResponse, UploadXML: string; begin UploadXML := 'ide egy tetszőleges tartalmú XML fájl kerül'; showmessage('A küldött XML feldolgozásának státuszkódja: '+SendRemoteXML('http://localhost/proba.php?action=uploadxml', UploadXML, ServerResponse)+#13+'A szerver üzenete: '+ServerResponse); end;

    A küldött XML tartalomra a proba.php mintafájlom az eredmény XML "response" csomópontra ráültette az "OK" értéket, a "note" csomópontra pedig az érkezett XML gyökércsomópont alatti csomópontok számát.

    Így az üzenetablakomban ez jelent meg:
    Katt!

    Ha esetleg kiegészítenétek valami hasznossal, vagy csak megjegyzést hozzáfűznétek, szívesen várom...

    A pontot pedig [ Káté lavinaindító válaszára adom, kinek ezúton szeretném nagyon-nagyon megköszönni a postolt linket
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd