vložil Radek Červinka
8. října 2019 14:08
Ačkoliv REST je momentálně na vrcholu popularity, sem tam je potřeba i SOAP.
Delphi podporuje SOAP od cca Delphi 5 (tj. rok 2000). Bohužel vždy podporoval jen RPC/encoded variantu, což se někdy jeví jako problém, zvláště pokud máte komunikovat se systémem, který podporuje SOAP pouze ve variantě Document/literal. Ukázka rozdílů Literal vs. Encoded, RPC- vs. Document.
Jediná rozumná implementace SOAP co znám pro variantu Document/literal (ale podporuje i RPC) pro Delphi je IndySOAP. Jedná se o open source knihovnu, dostupnou na IndySOAP, přičemž verze z SVN je unicode kompatibilní.
Je tam celkem dost příkladů, kdy pro rozhraní definujete interface, ale jen bych upozornil na drobnou (podstatnou) informaci
IKeyServer = Interface (IIdSoapInterface) ['{7C6A85A1-E623-4D6F-BA03-915BD49CE7D4}']
{!Encoding: Document;}
function GetNextKey ( AName : String ): integer; stdcall;
procedure ResetKey ( AUserName, APassword, AName : string; ANewValue : integer); stdcall;
procedure ListKeys(out VList : TKeyList); stdcall;
end;
Přepnutí mezi RPC a document mode je přes {!Encoding: Document;}, což mi chvilku trvalo. Jelikož knihovna má kořeny někdy kolem D5, kdy RTTI bylo v plenkách a o atributech se ani nezdálo, umožňuje přes preprocessor z adresáře tools (IdSoapTools.exe, pro starší verze delphi jako balíček do IDE) vygenerovat .res soubor s něčím jako je moderní RTTI (včetně uvedeného Encoding). Podle zdrojáků by to mělo jít i bez toho exe za pomocí normálního moderního RTTI, ale moc jsem to nerozchodil.
Každopádně je to mně známá jediná možnost jak dosáhnout na Document/literal a zadarmo (update: myslel jsem pro server, pro klient možné řešení v komentářích). Toto není návod, spíše takový hint.