![]() |
Daten von einem offenen WebService abholen - Wie?
Hallo Wissende,
ich würde gern von diesem WebService hier: ![]() Daten erhalten, weiss aber leider nicht, wie ich das in Delphi umsetzen kann. Soweit ich das verstehe, müsste ich mir wohl eine Instanz eines Webservices erzeugen und könnte dann mit den hier gebotenen Funktionen auf die abgefragten Daten zugreifen. Oder? Könnte mir bitte jemand erklären, wie das zu machen ist? |
Re: Daten von einem offenen WebService abholen - Wie?
Das tolle an Webservices sind doch die Beispiele ;)
Zum Beispiel das hier: ![]()
XML-Code:
Falls du keine Webservice-Kompo findest, kannst du auch einen HTTP-POST-Request losschicken und das Ergebnis durch einen XML-Parser jagen ;)
Es folgt ein Beispiel für eine SOAP 1.1-Anforderung und -Antwort. Die angezeigten Platzhalter müssen durch tatsächliche Werte ersetzt werden.
POST /Webservices/Sportsdata.asmx HTTP/1.1 Host: [url]www.openligadb.de[/url] Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://msiggi.de/Sportsdata/Webservices/GetLastMatch" <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <GetLastMatch xmlns="http://msiggi.de/Sportsdata/Webservices"> <leagueShortcut>string</leagueShortcut> </GetLastMatch> </soap:Body> </soap:Envelope> ...Antwort... Wobei das - zugegeben - wahrscheinlich der steinigste Weg ist, einen Webservie anzusprechen. Selber hab' ichs aber noch nicht gemacht... Ansonsten google mal nach ![]() |
Re: Daten von einem offenen WebService abholen - Wie?
Hallo,
erstmal vielen Dank für Deine Antwort. Die Beispiele habe ich gesehen, aber da ich sowas noch nicht gemacht habe, weiss ich leider nichts damit anzufangen. Ich habe die Indi-Komponenten und könnte natürlich einen HTTP-Post wegschicken. Aber ich dachte, dass irgendwie einfacher machen könnte. Mit welcher Komponente müsste ich denn anfangen? Ich brauch da wohl leider etwas Starthilfe. Sorry! |
Re: Daten von einem offenen WebService abholen - Wie?
Zitat:
![]() |
Re: Daten von einem offenen WebService abholen - Wie?
Zitat:
![]() Diese WSDL wird im ersten Schritt mit dem "WSDL Importer" aus Delphi verarbeitet. Ob das funktioniert, ist bei Delphi jedoch nicht hundertprozentig sicher, aber darin liegt gerade der Reiz :) - Im zweiten Schritt kann man den erzeugten Delphi-Code benutzen, um ein Port-Objekt zu erzeugen, dessen Methoden sich dann aufrufen lassen. Bei drbob24 und auf einigen anderen Seiten gibt es Tutorials. Cheers, |
Re: Daten von einem offenen WebService abholen - Wie?
Hallo,
also über den Importer wurde mir jede Menge Code erzeugt. Jetzt muss ich nur noch herausbekommen, wie ich den anwenden/benutzen kann, um an die Daten des WebServices heranzukommen. Wenn man´s weiss, ist es sicherlich einfach. In die Uses habe ich die erzeugte Unit schon eingebunden, aber woher weiss ich nunr, wie es weiter geht? Der Anbieter kennt sich leider nicht mit Delphi aus...Es ist sicher total einfach. drbob24.de konnte ich nicht finden... |
Re: Daten von einem offenen WebService abholen - Wie?
Ist ja auch
![]() |
Re: Daten von einem offenen WebService abholen - Wie?
Zitat:
![]() ![]() Bis denn Bommel |
Re: Daten von einem offenen WebService abholen - Wie?
Danke Bommel,
ich hatte früher schon mal in das Tut reingelesen, da ich eventuell vorhatte einen eigenen Webservice zu schreiben, es dann aberdoch gelassen, weil sich ein Projekt erledigt hatte. Nun habe ich dort mal reingelesen und versucht den WebService anzusprechen, aber irgendwo mache ich noch irgendwas falsch. Die nach dem Import erhaltene pas-Datei hier zu posten würde sicher den Rahmen sprengen, da 388 Zeilen. Folgendes mache ich derzeit, weil ich es mir so aus dem Tut hergeleitet habe.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var Data : SportsdataSoap; MatchDaten : ArrayOfMatchData; begin Data := GetSportsdataSoap(True,'http://www.openligadb.de/Webservices/Sportsdata.asmx?wsdl'); Data.GetMatchdataByGroupLeagueSaison(1,'bl1','2009'); MatchDaten := Data.GetMatchdataByGroupLeagueSaison(1,'bl1','2009'); Showmessage(MatchDaten[0].nameTeam1); end; Diese Fehlermeldung erhalte ich dabei: Im Projekt OpenLigaDB.exe ist eine Exception der Klasse ERemotableException aufgetreten. Meldung: 'Server was unable to process request. ---> Object reference not set to an instance of an object.'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. Ich komm einfach nicht weiter. Warum ist das schwierig? |
Re: Daten von einem offenen WebService abholen - Wie?
Eigentlich ist es vom Grundprinzip her gar nicht so schwierig. Ich habe gerade mal ein gaaaanz einfachen Test gemacht, der auch bei dir klappen sollte:
Delphi-Quellcode:
Da meldet er mir, dass er 45 Ligen gefunden hat. Diesen einfachen Test solltest du vielleicht auch mal machen. Dann siehst du schon mal (hoffentlich), dass der Web Service an sich richtig angesprochen werden kann. Alles weitere ist dann wohl "nur" noch ein Problem mit den Parametern des Befehls, den du eigentlich aufrufen willst.
procedure TForm1.Button1Click(Sender: TObject);
var Data : SportsdataSoap; MatchDaten : ArrayOfMatchData; leagArray: ArrayOfLeague; begin Data := GetSportsdataSoap; leagArray:=Data.GetAvailLeagues; MessageDlg(intToStr(length(leagArray))+' Ligen sind vorhanden.',mtInformation,[mbOk],0); end; Aber ich schau mal drauf, vielleicht findet sich da ja noch was... Bis denn Bommel |
Re: Daten von einem offenen WebService abholen - Wie?
Hm, kleiner Nachtrag, der mich aber eher ratlos macht: Den Befehl, den du eigentlich aufrufen willst, bekomme ich bei mir auch problemlos hin:
Delphi-Quellcode:
Klappt und liefert mir 9 Spiele.
procedure TForm1.Button1Click(Sender: TObject);
var Data : SportsdataSoap; MatchDaten : ArrayOfMatchData; leagArray: ArrayOfLeague; res: ArrayOfMatchData; begin Data := GetSportsdataSoap(True,'http://www.openligadb.de/Webservices/Sportsdata.asmx?wsdl'); leagArray:=Data.GetAvailLeagues; MessageDlg(intToStr(length(leagArray))+' Ligen sind vorhanden.',mtInformation,[mbOk],0); Res:=Data.GetMatchdataByGroupLeagueSaison(1,'bl1','2009'); MessageDlg(intToStr(length(res))+' Spiele sind vorhanden.',mtInformation,[mbOk],0); end; Letzter Ansatz, bevor ich befürchte, dass bei der Umsetzung des WSDL-Imports in deinem Delphi 7 ggf. noch Bugs gibt, die bei mir halt raus sind: Pack das ganze doch mal nicht schon ins "OnCreate" des Formulars, sondern zum Beipsiel in ein OnClick eines Buttons. Bei dem Create läuft das Programm ja ggf noch gar nicht "richtig". Bis denn Bommel |
Re: Daten von einem offenen WebService abholen - Wie?
Hallo
von codegear wurde einen ![]() Da ist auch ein neuer wsdl-Importer dabei, in der readme steht auch alles drin Probiers mal damit, ansonsten hänge mal deine generierte Pas vom Wsdl-Importer dran. Gruß Frank |
Re: Daten von einem offenen WebService abholen - Wie?
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, nach dem Button_Click erhalte ich ne Meldung ala 45 Ligen sind vorhanden.
Ich werde mal dem UpdateLink folgen und versuchen dat Dingen bei mir zum Laufen zu bringen. Ich hänge hier mal die Sportsdata.pas an, da bei es bei mir nach der Ligenmeldung wieder zu einer Fehlermeldung kommt. |
Re: Daten von einem offenen WebService abholen - Wie?
Also nach dem Update habe ich in dem Source-Ordner einen Ordner namens Soap_Upd angelegt. Dort habe ich die neuen Dateien reinkopiert, diesen Pfad als Suchpfad hinzugefügt und in den Projektoptionen unter Verzeichnisse/Bedingungen bei Bedingungen Definition: CLEANUP_SOAP_HEADERS;FIX_ELEM_NODE_NS eingetragen.
Ich erhalte wieder die 45 Ligen angezeigt und danach das hier: Im Projekt OpenLigaDB.exe ist eine Exception der Klasse ERemotableException aufgetreten. Meldung: 'Server was unable to process request. ---> Object reference not set to an instance of an object.'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. Nach der Meldung lande ich in Zeile 1489 der Unit OPToSOAPDomConv. Da ist noch was unrund. |
Re: Daten von einem offenen WebService abholen - Wie?
Liste der Anhänge anzeigen (Anzahl: 2)
also ich habe das ganze mit D2007 (Code aus Pos 11) auch probiert und es klappt alles.
du hast die wsdl aber auch nochmal mit dem neuen Importer importiert? (ich bin mir hier nicht mehr ganz sicher, wie das update war. Evtl habe ich da auch noich einen alten Stand in Erinnerung: ich konnte damals nicht mehr die Wsdl über delphi importieren, sondern mußte den importer direkt aufrufen. vielleicht ist das auch jetzt anders, ich weiß es nicht). delphi 7 habe ich nicht. Aber auch mit D2005 (meins müßte auf ungefähren Stand wie der soappatch sein) geht es. Wenn es immer noch nicht geht, wäre es evtl hilfreich, mal zu sehen, was Du überträgst: "Server was unable to process request." klingt ja eher danach, das beim Versenden was schief geht oder Du dort nicht verstanden wirst. du kannst dazu eine Httprio-Kompo mit auf die Form ziehen und dort im Oi unter httpwebnode beim Ereignis onbeforeExecute folgendes eintragen:
Delphi-Quellcode:
bei der zeile mit GetSportsdataSoap mußt du noch den Httprio mit übergeben.
procedure TForm3.HTTPRIO1BeforeExecute(const MethodName: string;
var SOAPRequest: WideString); Var sl:Tstringlist; begin sl:=TStringList.Create; try sl.text:=soaprequest; sl.SaveToFile('D:\Soaprequest.xml'); finally sl.free; end; end;
Delphi-Quellcode:
Sehen die übertragenden Daten anders aus als im Anhang?
Data := GetSportsdataSoap(True,'http://www.openligadb.de/Webservices/Sportsdata.asmx?wsdl',HTTPRIO1);
|
Re: Daten von einem offenen WebService abholen - Wie?
Liste der Anhänge anzeigen (Anzahl: 1)
Guten morgen,
also es geht immer noch nicht. Ich hatte zwar vergessen die Sportsdata.pas neu durch den Import zu createn, aber selbst nachdem ich das nachgeholt habe, wurde es nicht besser. Ich habe es bei einem Freund, der D2005 hat, versucht das Projekt zu erzeugen und habe dort exakt den gleichen Fehler. Hier mal mein Ergebnis aus Deinem Vorschlag:
Delphi-Quellcode:
<?xml version="1.0" ?>
- <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> - <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> - <NS1:GetMatchdataByGroupLeagueSaison xmlns:NS1="http://msiggi.de/Sportsdata/Webservices"> <groupOrderID xsi:type="xsd:int">1</groupOrderID> <leagueShortcut xsi:type="xsd:string">bl1</leagueShortcut> <leagueSaison xsi:type="xsd:string">2009</leagueSaison> </NS1:GetMatchdataByGroupLeagueSaison> </SOAP-ENV:Body> </SOAP-ENV:Envelope> Den Codevorschlag bezüglich des HTTPRio konnte ich nicht umsetzen, da ich auf meiner Form diese Komponente NICHT platziert habe. Ich hänge Euch mal mein aktuelles Projekt an, inkl. exe und xml-Datei. Vielleicht hilft das ja? |
Re: Daten von einem offenen WebService abholen - Wie?
Liste der Anhänge anzeigen (Anzahl: 1)
1. Ich denke, daß Du die wsdl nicht korrekt mit dem neuen importer importiert hast. die müßte für meine Begriffe anders aussehen (siehe Anhang), bzw probiere die mal.
ganz oben, wo Importieren steht, ist mit REV die Version von Importer angegeben, mit D2007: (27.08.2009 21:52:07 - - $Rev: 7300 $). Stelle wirklich nochmal sicher, daß das korrekt importiert ist und das du die neuen Soapunits verwendest (müßtest Du ja sehen, wo der Debugger bei der exception hinspringt) 2. Ansonsten, wenn es immer noch nicht geht: da sind wir nun am den Punkt an dem ich nicht weiter weiß. Genau vor dem Problem mit dem Namespaces stehe ich auch, aber ich habe keine Ahnung davon :-). Wenn jemand erklären könnte, warum das so erstellt wird oder für was das gut sein soll, wäre ich auch sehr dankbar. Siehst du die unterschiede in den beiden Soaprequest´s ? bei dir steht immer NS1 davor und auch das xsi:type steht bei mir nicht da. Ich habe keine Ahnung, wie man Delphi dazu bringen kann, das nicht zu tun. Das einzige, was mir damals dazu eingefallen ist, den Soaprequest einfach zu ändern. Wenn Du das onbeforeexecute wie folgt änderst und aus dem soaprequest das rauslöschst, was so (vielleicht) nicht hingehört :
Delphi-Quellcode:
geht es (mit deinem quelltext und deiner sportsdata.pas) aber mit D2007. Ohne die Änderung erhalte ich das gleiche Ergebnis und den gleichen Fehler wie Du. die stringlist ist ja nur zum debuggen, damit du einfach siehst, was wirklich übertragen wird.
procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string;
var SOAPRequest: WideString); Var sl:Tstringlist; begin sl:=TStringList.Create; try //einfach das löschen, was zu viel ist SOAPRequest:=StringReplace(SOAPRequest,'xsi:type="xsd:int"','',[rfReplaceAll,rfIgnoreCase]); SOAPRequest:=StringReplace(SOAPRequest,'xsi:type="xsd:string"','',[rfReplaceAll,rfIgnoreCase]); SOAPRequest:=StringReplace(SOAPRequest,'NS1:','',[rfReplaceAll,rfIgnoreCase]); SOAPRequest:=StringReplace(SOAPRequest,':NS1','',[rfReplaceAll,rfIgnoreCase]); sl.text:=soaprequest; sl.SaveToFile('D:\Soaprequest1.xml'); finally sl.free; end; end; Ich habe mir damals mit Programmen wie soapscope oder soapui beholfen, um zu sehen, was andere Progs übertragen und das dann umgesetzt. Gruß Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:51 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-2025 by Thomas Breitkreuz