powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / SOAP
2 сообщений из 2, страница 1 из 1
SOAP
    #39730787
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Есть парочка довольно неприятных вопросов касательно SOAP:
1. Как сделать так, чтобы из пришедшего сообщения бал создан TRemotable класс? Проблема в том, что Delphi по умолчанию хочет видеть:

Код: xml
1.
2.
3.
4.
5.
<Body>
  <MethodName>
    <request>...</request>
  </MethodName>
</Body>



А что делать если узел request отсутствует? Я в объявлении параметров метода в интерфейсе перечислил все интересующие меня узлы класса и таким образом данные я вытащил (благо их у меня 4). Но что делать если параметров 20-30?

2. Можно ли как-то программно задать имя узла ответа, отличное от "return"? В исходниках SOAP вроде return подставляется по умолчанию, но возможно я чего-то не знаю... Быть может нужно как-то обновить SOAP?
Ответ хочется получить вида:

Код: xml
1.
2.
3.
<Body>
  <callback>...</callback>
</Body>



где callback является произвольным классом TRemotable.
...
Рейтинг: 0 / 0
SOAP
    #39731087
Freddie26
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что ж отвечу сам себе... :(
1.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
type
  //чисто для примера
  TAnyClass = class(TRemotable)
  end;

  TMyMethodName = class(TRemotable)
  private
    FValue: string;
    FValue1: string;
    FValue2: TAnyClass; //TRemotable
  published
    property Value: string read FValue write FValue;
    property Value1: string read FValue1 write FValue1;
    property Value2: TAnyClass read FValue2 write FValue2;

  IService = interface(IInvokable)
  ['{142D96DA-E392-54E1-734D-037251A81D64}']
    procedure MyMethodName(TheirMethodName: TMyMethodName;
      out callbackResponse: TcallbackResponse); stdcall;


initialization
  InvRegistry.RegisterMethodInfo(TypeInfo(IService), 'MyMethodName', 'TheirMethodName', '');
  //здесь регистрируем (внимание!) ПЕРВЫЙ параметр нашего TRemotable класса
  //Регистрация остальных параметров для парсинга класса не нужна
  //P.S. если вам всё же надо зарегистрировать остальные методы, делайте это в обратном порядке, т.е. первый метод должен быть записан последним
  //InvRegistry.RegisterParamInfo(TypeInfo(IService), 'MyMethodName', 'TheirMethodName', 'Value2', '');
  //InvRegistry.RegisterParamInfo(TypeInfo(IService), 'MyMethodName', 'TheirMethodName', 'Value1', '');
  InvRegistry.RegisterParamInfo(TypeInfo(IService), 'MyMethodName', 'TheirMethodName', 'Value', '');

  RemClassRegistry.RegisterXSClass(TMyMethodName, 'http:/tempuri.org/', 'TheirMethodName');
  RemClassRegistry.RegisterSerializeOptions(TMyMethodName, [xoHolderClass]);
  
  //регистрировать класс для решения вопроса #2 нет необходимости, но я зарегистрировал
  RemClassRegistry.RegisterXSClass(TCallbackResponse, 'http:/tempuri.org/', 'callbackResponse', 'callbackResponse');



2. Для того чтобы задать собственное имя узла ответа достаточно указать дерективу OUT параметру. Для этого мне пришлось сделать свою функцию процедурой и второй параметр, который был раньше результатом стал OUT. Пример во вложении выше.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / SOAP
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]