![]() |
Webservice : Datenstruktur zurückgeben
Moin !
Hier findet sich eine ganz nette Anleitung zu einem Stand Alone Webservice: ![]() 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:
Nur wie kriege ich das als Rückgabewert eines Funktionsaufrufes hin? :gruebel:
<Process1>
<State>running</State> <lastState>Decode</lastState> </Process1> <Process2> <State>Stopped</State> <lastState>N/A</lastState> </Process2> |
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 |
Re: Webservice : Datenstruktur zurückgeben
Moin !
Zitat:
Funzt super wenn man vorher Indy updated aus dem SVN ... Zitat:
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: ![]() Zunächst muss das Interface erweitert werden:
Delphi-Quellcode:
Und dann muss man natürlich die Struktur definieren:
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.
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