Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / SOAP / 2 сообщений из 2, страница 1 из 1
09.11.2018, 17:27
    #39730787
Freddie26
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP
Добрый день!
Есть парочка довольно неприятных вопросов касательно 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
10.11.2018, 17:03
    #39731087
Freddie26
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SOAP
Что ж отвечу сам себе... :(
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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / SOAP / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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