Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Webservice : Datenstruktur zurückgeben (https://www.delphipraxis.net/150337-webservice-datenstruktur-zurueckgeben.html)

moelski 14. Apr 2010 08:40


Webservice : Datenstruktur zurückgeben
 
Moin !

Hier findet sich eine ganz nette Anleitung zu einem Stand Alone Webservice:
http://www.digicoast.com/delphi_soap_standalone.html

Das funzt auch soweit ganz super.

Nun würde ich aber gerne eine Struktur zurückliefern. Einfach XML zurückgeben funktioniert nicht.

Kann mir jemand einen kurzen Hinweis geben wie ich das anstelle?

BsP:
Ich möchte über den Webservice eine Processliste abrufen.
Das könnte so aussehen:
XML-Code:
<Process1>
  <State>running</State>
  <lastState>Decode</lastState>
</Process1>
<Process2>
  <State>Stopped</State>
  <lastState>N/A</lastState>
</Process2>
Nur wie kriege ich das als Rückgabewert eines Funktionsaufrufes hin? :gruebel:

DataCool 14. Apr 2010 09:46

Re: Webservice : Datenstruktur zurückgeben
 
Moin Moin,

ich hatte mir die von Dir beschriebene Anleitung auch schon mal angesehen, weil mich das Thema auch interessiert hat.
Allerdings bin ich noch nicht dazu gekommen das ganze unter D2010 zu implementieren/zu testen.
Mit welcher Delphi Version hast Du das ganze umgesetzt ?

Zu Deiner Frage:
Wnn ich das richtig sehe müßtest Du eigentlich nur eine 2 Methode
analog zu HelloWord erstellen z.B. "getXMLData2" und in dieser Methode
dann Deine "XML-Struktur" als String zurück liefern.
result := '<Process1>'+13#10+'<State>running</State>'+ ... usw.

Greetz Data

moelski 14. Apr 2010 10:04

Re: Webservice : Datenstruktur zurückgeben
 
Moin !

Zitat:

Mit welcher Delphi Version hast Du das ganze umgesetzt ?
D2010 Prof.
Funzt super wenn man vorher Indy updated aus dem SVN ...

Zitat:

und in dieser Methode
dann Deine "XML-Struktur" als String zurück liefern.
Nö. Das is ma ment genau der falsche Ansatz.
Damit kann ein Webservice Client nichts anfangen / nicht auswerten.
Zudem wird das XML nicht sauber in der SOAP Message dargestellt.


Ich weiss aber nun wie es geht :)

Hier ist es beschrieben: http://exposureroom.com/members/skumar/tutorials/post/3

Zunächst muss das Interface erweitert werden:
Delphi-Quellcode:
unit DatasetXMLIntf;

interface

uses
  Types, XSBuiltIns, uFieldInfo;

type
  IDatasetXML = interface(IInvokable)
    ['{C7785514-F56F-40AD-B943-950A162296BE}']
    function GetDatasetAsXML(const SelectSQL: WideString): WideString; stdcall;
    function GetSchemaInfo(const TableName: WideString): TFieldInfoArray; stdcall;
  end;

implementation

uses
  InvokeRegistry;

initialization
  InvRegistry.RegisterInterface(TypeInfo(IDatasetXML), '', '');

end.
Und dann muss man natürlich die Struktur definieren:

Delphi-Quellcode:
unit uFieldInfo;

interface

uses
  InvokeRegistry, XSBuiltIns;

type
  TFieldInfo = class(TRemotable)
  private
    FIsKeyField: Boolean;
    FFieldSize: Integer;
    FFieldName: string;
    FFieldType: string;
  published
    property FieldName: string read FFieldName write FFieldName;
    property FieldType: string read FFieldType write FFieldType;
    property FieldSize: Integer read FFieldSize write FFieldSize;
    property IsKeyField: Boolean read FIsKeyField write FIsKeyField;
  end;

  TFieldInfoArray =  array of TFieldInfo;


implementation

initialization
  RemClassRegistry.RegisterXSClass(TFieldInfo, '', 'TFieldInfo', '');
  RemTypeRegistry.RegisterXSInfo(TypeInfo(TFieldInfoArray), '', 'TFieldInfoArray');

finalization
  RemClassRegistry.UnRegisterXSClass(TFieldInfo);
  RemTypeRegistry.UnRegisterXSInfo(TypeInfo(TFieldInfoArray));
end.

So und dann muss man das natürlich noch implementieren. Das geht dann in etwa so:
Delphi-Quellcode:
  function TMyAppServerSoapDataModule.GetSchemaInfo(const TableName: WideString): TFieldInfoArray; stdcall;
  var i: Integer;
  begin
      SetLength(Result, 1);
      for i := 0 to 1 -1 do
      begin
        Result[i] := TFieldInfo.Create;
        Result[i].FieldName := 'Hallo Feld';
        Result[i].FieldType := 'GetEnumName';
        Result[i].FieldSize := 1234;
        Result[i].IsKeyField := False;
      end; { for i := 0 to Dataset.FieldCount -1 do }
  end;

Hoffe geholfen zu haben :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 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