Autor Beitrag
Guldi
Hält's aus hier
Beiträge: 11

Win XP
Delphi 6 Ent.
BeitragVerfasst: Do 27.12.07 23:41 
Hallo Zusammen

Ich versuche via SOAP auf Swissunihockey zuzugreifen, doch klappt dies nicht so wie ich will. Eifache Funktione klappen, aber die ich bräuchte, funktionieren nicht. Leider kann ich im Internet auch nichts zur Lösung finden. Könnte mir jemand einen Tipp geben?

Ich habe mit dem WDSL importer von Delphi 6 die Struktur importiert und versuchte die Funktionen zu benutzen (www.swissunihockey.c.../webservices/league).

WDSL Datei: www.swissunihockey.c...services/league?wsdl

Quellcode:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, league1;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var lg: league;
    s: string;
    lr : LeagueResponse;
    tr : TableResponse;

begin
    lg := getLeague(false);
    lr := lg.testSimple(1240,'AjxsUNpBeKKfjaKSTcIwRzC2fiM=');
    memo1.Text := lr.ServiceImplementation + lr.Copyright;
    s := lg.echo('test');
    memo1.Text := memo1.Text + s;
    tr := lg.TableLeague(1240,'AjxsUNpBeKKfjaKSTcIwRzC2fiM=',0,0,111,1);   //<- Fehler...
end;

end.


Moderiert von user profile iconUGrohne: Delphi-Tags hinzugefügt.
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 28.12.07 00:10 
Da ich mit WebServices in Delphi bisher nicht gearbeitet habe, kann ich Dir hier nicht helfen. Ich habe den WS aber mal in C# konsumiert mit folgendem Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
            Game game = new WpfTestApplication.ServiceReference1.Game();
            LeagueClient lc = new WpfTestApplication.ServiceReference1.LeagueClient();
            LeagueResponse lr = lc.testSimple(1240,"AjxsUNpBeKKfjaKSTcIwRzC2fiM=");
            TableResponse tr = lc.tableLeague(1240"AjxsUNpBeKKfjaKSTcIwRzC2fiM="001111);

und das funktionierte einwandfrei. Was für ein Fehler kommt überhaupt?
Guldi Threadstarter
Hält's aus hier
Beiträge: 11

Win XP
Delphi 6 Ent.
BeitragVerfasst: Fr 28.12.07 10:27 
Besten Dank für die schnelle Antwort

Es erscheint eine "Debugger Exception Notification" Meldung mit:
Project raised exception class EConvertError with message ''' is not a valid integer value'....

Habe auch den TCP Transfer überprüft und konnte eigentlich keine Fehler entdecken. Jede Abfrage wurde mit "HTTP/1.1 200 OK" bestätigt.
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: Fr 28.12.07 10:34 
user profile iconGuldi hat folgendes geschrieben:
Es erscheint eine "Debugger Exception Notification" Meldung mit:
Project raised exception class EConvertError with message ''' is not a valid integer value'....

Erscheint die meldung nur wenn du die Anwendung in der IDE startest?
Falls ja, dann hast du auch angewählt das du bei Exceptions benachrichtigt werden willst. Und da kann die IDE nicht unterschieden ob die Exception behandelt wird oder nicht.
Guldi Threadstarter
Hält's aus hier
Beiträge: 11

Win XP
Delphi 6 Ent.
BeitragVerfasst: Fr 28.12.07 10:56 
Die Meldung erscheint auch wenn ich das Programm auserhalb der Programmierumgebung starte, jedoch nur in Kurzform:
'' is not a valid integer value
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Fr 28.12.07 14:43 
Hallo

verwendest du wirklich D6, wie es in deinem Profil steht? wenn ja, dann bist du meiner meinung chancenlos.

Gugg dir mal in deiner importierten pas "Tableresponse" an:

Mit d2005 und den Soappatches sieht das so aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
  // ************************************************************************ //
  // Namespace : urn:league
  // ************************************************************************ //
  TableEntry = class(TRemotable)
  private
    FRank: Integer;
    ....
  published
    property Rank: Integer read FRank write FRank;
    ....
  end;

  ArrayOfTableEntry = array of TableEntry;      { "urn:league" }


  TableResponse = class(LeagueResponse)
  private
    FTable: ArrayOfTableEntry;
  public
    destructor Destroy; override;
  published
    property Table: ArrayOfTableEntry read FTable write FTable;
  end;


Bei dir müßte da irgendwelcher anderer Quark stehen, weil die alten Delphi-versionen nicht mit dynamischen arrays klarkommen. Für >d7 gab es dazu einen soappatch den du von der codegear-seite runterladen kannst. Ob du die auch mit D6 zum laufen bekommst, weiß ich nicht. Evtl hilft es dir, in der newsgroup zu delphi-webservices etwas nachzulesen.

Mit D2005 klappt dein code, ohne Fehler.

Gruß Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Guldi Threadstarter
Hält's aus hier
Beiträge: 11

Win XP
Delphi 6 Ent.
BeitragVerfasst: Mo 31.12.07 09:01 
Besten Dank Frank für den Hinweis

Die generierte Stelle aus der WSDL Datei sieht exakt gleich aus bei mir. Jedoch habe ich noch die D6 version. Nebenbei habe ich auch D7 aber nur die Personal Edition.

Ich hab mich mal umgeschaut und bin auf einen anderen Weg gekommen. Habe die ganze Geschichte mal mit dem MSSOAP Toolkit versucht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Button1Click(Sender: TObject);
var
  c: Variant;
  tt:string;
  v: variant;
  i:integer;
begin
  c := CreateOleObject('MSSOAP.SoapClient30');
  c.mssoapinit('http://www.swissunihockey.ch/weblounge/webservices/league?wsdl');
  tt:=c.echo('hallo');
  memo1.Text:=tt;
  v := c.testSimple(1240,'AjxsUNpBeKKfjaKSTcIwRzC2fiM=');
  i:=vartype(v);  //vartype = Dispatch
  v := c.TableLeague(1240,'AjxsUNpBeKKfjaKSTcIwRzC2fiM=',0,0,111,1);
  i:=vartype(v);  //vartype = Dispatch
end;


Soweit scheint alles ohne Fehler zu laufen. Nur habe ich keine Erfahrung mit den Variant Typen. Gibt es irgendwo ein Schlaues Tutorial? Oder kann mir jemand schnell ein Beispiel geben für die Funktion 'testSimple' wie man die Werte aus der Variablen holen kann?

Besten Dank

Guldi
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: Mo 31.12.07 10:21 
user profile iconGuldi hat folgendes geschrieben:
Nur habe ich keine Erfahrung mit den Variant Typen. Gibt es irgendwo ein Schlaues Tutorial? Oder kann mir jemand schnell ein Beispiel geben für die Funktion 'testSimple' wie man die Werte aus der Variablen holen kann?


ausblenden Delphi-Quelltext
1:
memo1.Text := v.ServiceImplementation + v.Copyright;					
Guldi Threadstarter
Hält's aus hier
Beiträge: 11

Win XP
Delphi 6 Ent.
BeitragVerfasst: Mo 31.12.07 10:45 
Besten Dank Bernhard

Irgendetwas mache ich noch falsch. Der Aufruf führt zum Fehler "Die Methode 'ServiceImplementation' wird vom Automatisierungsobjakt nicht unterstützt".

Hat dies eventuell mit D6 bzw. D7 zu tun?
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Mo 31.12.07 11:16 
zu deiner anderen Variante kann ich dir leider nix sagen, du kannst aber nochmal folgendes probieren:

pack eine httprio kompo mit auf die form und fülle beforeexecute und afterexecute

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
procedure TForm1.HTTPRIO1BeforeExecute(const MethodName: string;
  var SOAPRequest: WideString);
Var sl:TStrings;
begin
  sl:=TStringList.Create;
  try
    sl.Text:=SOAPRequest;
    sl.SaveToFile('e:\guldi-Request.xml');
  finally
    sl.free;
  end;
end;

procedure TForm1.HTTPRIO1AfterExecute(const MethodName: string;
  SOAPResponse: TStream);
Var sl:TStrings;
begin
  sl:=TStringList.Create;
  try
    SOAPResponse.Position:=0;
    sl.LoadFromStream(SOAPResponse);
    sl.SaveToFile('e:\guldi-Response.xml');
  finally
    sl.free;
  end;
end;


ändere deinen Aufruf wie folgt und übergib den Rio mit:
ausblenden Delphi-Quelltext
1:
    lg := getLeague(false,'',HTTPRIO1);					


und vergleiche die beiden Dateien mit denen im Anhang, wo liegen dann die Unterschiede in den beiden xml-Dateien (der request wäre da am wichtigsten, Response muß ja das gleiche sein)?
In den beiden Ereignissen kannst du dann gewisse Dinge wieder "gradebiegen". Ich selbst habe in einem meiner Projekte das Problem, das die Schemen-angaben nicht richtig sind und muß die ändern.

bitte die Anhänge von .txt in .xml umbennen (wird sonst vom DF als Anhang geblockt)
Einloggen, um Attachments anzusehen!
_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
Guldi Threadstarter
Hält's aus hier
Beiträge: 11

Win XP
Delphi 6 Ent.
BeitragVerfasst: Mo 31.12.07 12:42 
Hallo Keldorn

Besten Dank für Deine Hilfe

Der Request ist exakt der selbe. Der Response unterscheidet sich in position der ID's. Weiss nicht, ab das etwas ausmacht. Hier mal der mitschnitt:
Einloggen, um Attachments anzusehen!