AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array über SOAP

Ein Thema von campula · begonnen am 19. Jan 2011 · letzter Beitrag vom 20. Jan 2011
Antwort Antwort
campula

Registriert seit: 17. Jan 2011
6 Beiträge
 
#1

Array über SOAP

  Alt 19. Jan 2011, 23:38
Hallo,

ich experimentiere ein wenig SOAP herum. Inbesondere programmiere ich in Delphi einen Client, der einen Array empfängt. Doch ich scheitere daran, die empfangene Datenstruktur auszulesen.

Die Antwort des Servers siehe so aus:

Code:
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.example.de/soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:getAllSitesResponse>
<return xsi:type="SOAP-ENC:Struct">
<getAllSitesResult xsi:type="SOAP-ENC:Struct">
<AllSiteListElement SOAP-ENC:arrayType="SOAP-ENC:Struct[2]" xsi:type="SOAP-ENC:Array">
<item xsi:type="SOAP-ENC:Struct">
<idSite xsi:type="xsd:int">1</idSite>
<name xsi:type="xsd:string">siteA</name>
</item>
<item xsi:type="SOAP-ENC:Struct">
<idSite xsi:type="xsd:int">2</idSite>
<name xsi:type="xsd:string">siteB</name>
</item>
</AllSiteListElement>
</getAllSitesResult>
</return>
</ns1:getAllSitesResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Meine Unit sieht so aus:

Delphi-Quellcode:
// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL : http://www.example.de/soap/WebService.wsdl
// Encoding : UTF-8
// Version : 1.0
// (19.01.2011 13:23:21 - 1.33.2.5)
// ************************************************************************ //

unit WebService;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;


type

  // ************************************************************************ //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Borland types; however, they could also
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:AllSiteListElementArray - "http://www.example.de/soap/"
  // !:string - "http://www.w3.org/2001/XMLSchema"

  getAllSitesResult = class; { "http://www.example.de/soap/" }
  AllSiteListElement = class;


  // ************************************************************************ //
  // Namespace : http://www.example.de/soap/
  // Serializtn: [xoLiteralParam]
  // ************************************************************************ //

  AllSiteListElement = class(TRemotable)
  private
      FidSite : integer;
      Fname : string;
  public
// constructor Create; override;
  published
    property idSite : integer read FidSite write FidSite;
    property name : string read Fname write Fname;
  end;



  AllSiteListElementArray = array of AllSiteListElement;

  getAllSitesResult = class(TRemotable)
  public
    FAllSiteListElements: AllSiteListElementArray ;
    constructor Create; override;
  published
    property AllSiteListElements: AllSiteListElementArray read FAllSiteListElements write FAllSiteListElements;
  end;


  /// ******************************************************//



  // ************************************************************************ //
  // Namespace : http://www.example.de/soap/
  // soapAction: http://www.example.de/soap/getAllSites
  // transport : http://schemas.xmlsoap.org/soap/http
  // style : rpc
  // binding : MyWebServiceBinding
  // service : MyWebService
  // port : MyWebServicePort
  // URL : http://www.example.de/soap/server.php
  // ************************************************************************ //
  MyWebServicePortType = interface(IInvokable)
  ['{033B160A-CA94-84C0-538F-78C64F42662C}']
    function getAllSites(const name: WideString): getAllSitesResult; stdcall;
  end;

function GetMyWebServicePortType(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): MyWebServicePortType;


implementation

function GetMyWebServicePortType(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): MyWebServicePortType;
const
  defWSDL = 'http://www.example.de/soap/WebService.wsdl';
  defURL = 'http://www.example.de/soap/server.php';
  defSvc = 'MyWebService';
  defPrt = 'MyWebServicePort';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as MyWebServicePortType);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;


constructor getAllSitesResult.Create;
begin
  inherited Create;
  FSerializationOptions := [xoLiteralParam];
end;

initialization
  InvRegistry.RegisterInterface(TypeInfo(MyWebServicePortType), 'http://www.example.de/soap/', 'UTF-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(MyWebServicePortType), 'http://www.example.de/soap/getAllSites');
// InvRegistry.RegisterInvokeOptions(TypeInfo(MyWebServicePortType), ioLiteral);
  RemClassRegistry.RegisterXSClass(getAllSitesResult, 'http://www.example.de/soap/', 'AllSiteList');
  RemClassRegistry.RegisterSerializeOptions(getAllSitesResult, [xoLiteralParam]);

end.
Wenn ich jetzt den Server abfrage, bekomme ich eine leeres Array zurück:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  test : getAllSitesResult;
begin
  test := GetMyWebServicePortType(true).getAllSites('test');
  showmessage(inttostr(high(test.FAllSiteListElements)));

end;
Erkennt irgendwer, was ich falsch mache.

  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Array über SOAP

  Alt 20. Jan 2011, 07:30
Welche Delphi-Version? AFAIK können auch aktuelle Delphi-Versionen nicht den vollständigen SOAP-Umfang. Von sehr unvollständigen Implementierung in D6/7 ganz zu schweigen.

Muss es SOAP sein? Für viele Anwendungsfälle ist ein REST-Ansatz mit JSON die bessere Lösung.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
campula

Registriert seit: 17. Jan 2011
6 Beiträge
 
#3

AW: Array über SOAP

  Alt 20. Jan 2011, 09:53
Delphi 7
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Array über SOAP

  Alt 20. Jan 2011, 11:09
Dann vergiss die native SOAP-Implementierung. Hat zu viele Fehler bzw. ist veraltet.

Es gäbe noch die möglickeit per COM/Automatisierung die in Windows vorhandene SOAP-Unterstützung zu verwenden.
Frag mich aber nicht nach details. Ist zu lange her ...
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
campula

Registriert seit: 17. Jan 2011
6 Beiträge
 
#5

AW: Array über SOAP

  Alt 20. Jan 2011, 12:03
Hmm, trifft das auch auf JSON zu oder macht es unter Delphi 7 Sinn sich damit zu beschäftigen.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Array über SOAP

  Alt 20. Jan 2011, 12:06
Für D7 gibt es einige freie Implementierungen
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
campula

Registriert seit: 17. Jan 2011
6 Beiträge
 
#7

AW: Array über SOAP

  Alt 20. Jan 2011, 12:54
Scheint ja wirklich gar nicht so schlecht zu sein. Ich glaube sogar, mich schon einmal mit JSON in Verbindung mit Java beschäftigt zu haben. Muss ich mir mal am Wochenende genauer ansehen.

Auf jeden Fall vielen Dank für den Tipp.

Mike
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz