Все то, что было показано до этого, выглядело неплохо. Однако на практике не очень часто приходится оперировать простыми типами данных, как это было показано в предыдущих примерах. Очень часто возникает необходимость вернуть сложный тип данных (например, объект).
На самом деле решение проблемы не представляет особых сложностей. Давайте попробуем ее решить. Итак, пусть нам необходимо создать сервис, возвращающий курс доллара за указанный промежуток времени.
Итак, курс доллара будет представлен следующим классом: TDollarRate = class public Cost:Integer; Date:TDateTime; constructor Create; end; constructor TDollarRate.Create; begin inherited Create; Cost:=20 + Random(5); Date:=DateToStr(DateTime.Now); end;
Перед добавлением WEB-метода объявим тип TDollarRates = Array of TDollarRate, в секцию uses добавим Borland.Vcl.SysUtils. Метод имеет вид:
[WebMethod] function GetRatesForDays (ADays:Integer):TDollarRates; function TWebService1.GetRatesForDays (ADays:Integer):TDollarRates; var i:Integer; begin SetLength(Result,ADays); for i:=ADays-1 downto 0 do Result[i]:=TDollarRate.Create; end;
Попробуем протестировать метод (рис 5).
Рис. 5 Тестирование метода, возвращающего массив объектов Результат превзошел все ожидания: <?xml version="1.0" encoding="utf-8" ?> - <ArrayOfTDollarRate xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/"> - <TDollarRate> <Cost>23 <Date>28.04.2004 </TDollarRate> - <TDollarRate> <Cost>23 <Date>28.04.2004 </TDollarRate> - <TDollarRate> <Cost>20 <Date>28.04.2004 </TDollarRate> </ArrayOfTDollarRate>
В процессе разработки этого примера мы были неприятно удивлены одной деталью (версия Delphi 8 7.1.1146.610): мы попытались объявить новый конструктор с параметрами: TDollarRate = class public Cost:Integer; Date:TDateTime; constructor Create(Adays:Integer); end; constructor TDollarRate.Create(Adays:Integer); var sDate:TDateTime; begin inherited Create; {Код} end;
и получили следующую ошибку при старте WEB-сервиса:
рис 6. Как же переопределить конструктор ?
Как сделать новый конструктор Default public в Delphi 8 не совсем понятно, однако выручило переименование конструктора следующим образом: TDollarRate = class public Cost:Integer; Date:String; constructor TDollarRate(Adays:Integer); end;
Результат работы стал таким: "?xml version="1.0" encoding="utf-8" ?> - <ArrayOfTDollarRate xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/"> - <TDollarRate> <Cost>21 <Date>26.04.2004 </TDollarRate> - <TDollarRate> <Cost>24 <Date>26.04.2004 </TDollarRate> </ArrayOfTDollarRate>
На этом описание WEB-методов завершается. Перед тем, как рассказать о том, каким образом клиентское приложение может взаимодействовать с нашим WEB-сервисом, а также каким образом оно будет "понимать" не только простые, но и "сложные" типы данных рассмотрим подробнее, из каких частей состоит WEB-сервис.