Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / пространство имен в SOAP / 8 сообщений из 8, страница 1 из 1
04.02.2012, 16:17
    #37647057
GodFather
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пространство имен в SOAP
Добрый день!
При обращении к web-сервису формируется (автоматически при помощи SOAP) следующая xml:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
 <?xml version="1.0" ?> 
- <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <SOAP-ENV:Body>
- <getPatientInfo xmlns="http://webservice.interaction.medicalhistory.fors.ru/">
  <caseRecordNum>801949</caseRecordNum> 
  </getPatientInfo>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>



Подскажите, как явно указать пространство имен к тегу <caseRecordNum> чтоб получилось:

Код: xml
1.
<caseRecordNum xmlns="">






предоставляю код модуля и сгенерированного wsdl

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure TForm1.Button2Click(Sender: TObject);
var l: patientInformation ;
     m: string;
    i: Integer;
begin
  HTTPRIO1.WSDLLocation := 'http://fors-vyatka.ru:9900/interaction/lisService?wsdl';
  HTTPRIO1.Service := 'LisService';
  HTTPRIO1.Port := 'LisServicePort';
  l := patientInformation.Create;

 
  l := (HTTPRIO1 as LisService).getPatientInfo(Edit1.Text) ; //здесь как раз передается значение тега <caseRecordNum>

 Memo1.Lines.Add(l.fio);

 l.Free;
end;



wsdl:

Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL     : C:\Users\&#213;&#224;&#235;&#232;&#235;\Desktop\&#202;&#232;&#240;&#238;&#226; &#206;&#202;&#193; &#203;&#200;&#209;-&#204;&#200;&#209;\lisService.xml
// Encoding : UTF-8
// Version  : 1.0
// (03.02.2012 12:10:47 - 1.33.2.5)
// ************************************************************************ //

unit lisService1;

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.
  // ************************************************************************ //
  // !:string          - "http://www.w3.org/2001/XMLSchema"
  // !:dateTime        - "http://www.w3.org/2001/XMLSchema"

  patientInformation   = class;                 { "http://webservice.interaction.medicalhistory.fors.ru/" }



  // ************************************************************************ //
  // Namespace : http://webservice.interaction.medicalhistory.fors.ru/
  // ************************************************************************ //
  patientInformation = class(TRemotable)
  private
    Faddress: WideString;
    FbirthDate: TXSDateTime;
    Ffio: WideString;
    Finsurance: WideString;
    Fpolis: WideString;
    Fsex: WideString;
  public
    destructor Destroy; override;
  published
    property address: WideString read Faddress write Faddress;
    property birthDate: TXSDateTime read FbirthDate write FbirthDate;
    property fio: WideString read Ffio write Ffio;
    property insurance: WideString read Finsurance write Finsurance;
    property polis: WideString read Fpolis write Fpolis;
    property sex: WideString read Fsex write Fsex;
  end;


  // ************************************************************************ //
  // Namespace : http://webservice.interaction.medicalhistory.fors.ru/
  // transport : http://schemas.xmlsoap.org/soap/http
  // style     : document
  // binding   : LisServiceServiceSoapBinding
  // service   : LisService
  // port      : LisServicePort
  // URL       : http://fors-vyatka.ru:9900/interaction/lisService
  // ************************************************************************ //
  LisService = interface(IInvokable)
  ['{7979BD2C-7EAE-7E07-CD57-C56D346D7067}']
    function  getPatientInfo(const caseRecordNum: WideString): patientInformation; stdcall;
  end;

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


implementation

function GetLisService(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): LisService;
const
  defWSDL = 'C:\Users\&#213;&#224;&#235;&#232;&#235;\Desktop\&#202;&#232;&#240;&#238;&#226; &#206;&#202;&#193; &#203;&#200;&#209;-&#204;&#200;&#209;\lisService.xml';
  defURL  = 'http://fors-vyatka.ru:9900/interaction/lisService';
  defSvc  = 'LisService';
  defPrt  = 'LisServicePort';
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 LisService);
    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;


destructor patientInformation.Destroy;
begin
  if Assigned(FbirthDate) then
    FbirthDate.Free;
  inherited Destroy;
end;

initialization

  InvRegistry.RegisterInterface(TypeInfo(LisService), 'http://webservice.interaction.medicalhistory.fors.ru/', 'UTF-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(LisService), '');
  InvRegistry.RegisterInvokeOptions(TypeInfo(LisService), ioDocument);
  RemClassRegistry.RegisterXSClass(patientInformation, 'http://webservice.interaction.medicalhistory.fors.ru/', 'patientInformation');

end.
...
Рейтинг: 0 / 0
04.02.2012, 16:34
    #37647072
vvm
vvm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пространство имен в SOAP
GodFather,

Ты на клиенте, при подключении хочешь изменить значение пространства имен?


Твой метод getPatientInfo() возвращает тип patientInformation, который регистрируется здесь:

RemClassRegistry.RegisterXSClass(patientInformation, 'http://webservice.interaction.medicalhistory.fors.ru/', 'patientInformation');


Тогда явно укажи значение во втором параметре, и все.
...
Рейтинг: 0 / 0
04.02.2012, 16:41
    #37647080
GodFather
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пространство имен в SOAP
vvmGodFather,

Ты на клиенте, при подключении хочешь изменить значение пространства имен?


Твой метод getPatientInfo() возвращает тип patientInformation, который регистрируется здесь:

RemClassRegistry.RegisterXSClass(patientInformation, 'http://webservice.interaction.medicalhistory.fors.ru/', 'patientInformation');


Тогда явно укажи значение во втором параметре, и все.

Мне нужно не для возвращаемого значения, а для caseRecordNum:
Код: pascal
1.
2.
3.
4.
LisService = interface(IInvokable)
  ['{7979BD2C-7EAE-7E07-CD57-C56D346D7067}']
    function  getPatientInfo(const caseRecordNum: WideString): patientInformation; stdcall;
  end;



потому что на данный момент у меня вот так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
<?xml version="1.0" ?> 
- <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <SOAP-ENV:Body>
- <getPatientInfo xmlns="http://webservice.interaction.medicalhistory.fors.ru/">
  <caseRecordNum>801949</caseRecordNum> 
  </getPatientInfo>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>



в данном случае caseRecordNum не наследует пространство имен из <getPatientInfo xmlns=" http://webservice.interaction.medicalhistory.fors.ru/">
...
Рейтинг: 0 / 0
04.02.2012, 17:34
    #37647110
vvm
vvm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пространство имен в SOAP
GodFather, извинения, не то прочитал.
...
А разве должно быть явно задано какое-нибудь xmlns для типа WideString?

Значение свойства xmlns="" - это разве не то же самое, что и когда не задано?
...
Рейтинг: 0 / 0
05.02.2012, 01:31
    #37647384
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пространство имен в SOAP
vvmЗначение свойства xmlns="" - это разве не то же самое, что и когда не задано?Нет. Когда пространство имен явно не указано, то узел находится в том же пространстве имен, что и родительский.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
05.08.2014, 13:06
    #38712965
пространство имен в SOAP
Здравстуйте, _Vasilisk_!
Столкнулся с такой же проблемой. Удалось ли решить ее без ручной обработки перед отправкой запроса? Буду признателен любой помощи.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
06.03.2020, 15:07
    #39935232
pda0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пространство имен в SOAP
Раз уж вопрос повторили пару лет спустя - отвечу, хоть прошло ещё шесть лет. Вдруг ещё кому пригодится.

Нет, вы никак не можете сделать это "красиво". Изучение исходников показало, что Delphi считает себя самой умной и если namespace передан пустым, то генерирует его вот таким. Никакие методы перекрыть невозможно, к сохранённым значениям не подобраться, они private, так что только вешать обработчики на THTTPRIO OnBeforeExecute и OnAfterExecute и править в них потоки с xml...
...
Рейтинг: 0 / 0
06.03.2020, 15:21
    #39935240
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
пространство имен в SOAP
pda0
к сохранённым значениям не подобраться, они private

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


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