Как правильно настроить пространства имен при использовании веб-службы Transaction Exchange Server? - PullRequest
4 голосов
/ 05 мая 2011

Я пытаюсь использовать веб-сервис TxServer , но я получаю сообщение об ошибке

Неустранимая ошибка: неожиданный элемент (uri: "http://txserver.sut.softekpr.com/1", local:«транзакция») . Expected elements are <{} транзакция> `.

Я обнаружил, что XML, который генерирует Delphi, не работает со службой,
, но если я добавлю xmlns="" ктег транзакции, он работает.
Может ли кто-нибудь помочь мне добавить xmlns="" в тег транзакции?
Я хотел бы иметь: <transaction xmlns="">.

Кстати, я пытался изменить: InvRegistry.RegisterInvokeOptions(TypeInfo(TxServer), ioDocument); для всех io .. Опции, но это не работает.

<?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>
    <requestIVULoto xmlns="http://txserver.sut.softekpr.com/1">
      <transaction>
        <merchantId>00000000000</merchantId>
        <municipalTax>.01</municipalTax>
        <stateTax>.06</stateTax>
        <subTotal>1</subTotal>
        <tenderType>CASH</tenderType>
        <terminalId>POS02</terminalId>
        <terminalPassword/>
        <total>1.07</total>
        <txDate>2011-05-05T10:02:17.708Z</txDate>
        <txType>SALE</txType>
      </transaction>
    </requestIVULoto>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Ответы [ 3 ]

3 голосов
/ 08 декабря 2011

RemClassRegistry.RegisterXSClass(InstitutionCode, #0, 'InstitutionCode');

где InstitutionCode - это какое-то имя узла, #0 пустой символ, просто пустая строка '' не работает, она заменяется сгенерированным именем.

Это может быть проблема с widestring, но вы можете использовать вместо TXSString

2 голосов
/ 05 мая 2011

Используйте событие OnBeforePost для объекта RIO и просто отредактируйте исходящую строку. Это грязно, но работает.

procedure TMyHandler.RIO_BeforeExecute(const MethodName: string; var SOAPRequest: WideString);
begin
  SOAPRequest := StringReplace(SOAPRequest,'<transaction>','<transaction xmlns="">',[]);
end;

Вот пример подключения RIO через GUI: http://www.onlinedelphitraining.com/newsletters/webservices.htm

Вот обсуждение того, как сделать это в коде: THttprio onBeforeExecute, изменяющий запрос мыла

1 голос
/ 06 мая 2011

Затем попробуйте использовать компонент THTTPRIO, если он есть в вашем дистрибутиве Delphi, и попробуйте передать его в вызов метода GetTxServer.

...
var MyTxServer: TxServer;
begin
  MyTxServer := GetTxServer(True, '', HTTPRIO1); // HTTPRIO1 is your component
end;

И, как Крис упоминал ранее, вы можете изменитьзапрос в событии OnBeforeExecute (для этого компонента HTTPRIO);У меня есть D2009, так что у вас, вероятно, будут другие параметры, если они у вас вообще есть.

procedure TForm10.HTTPRIO1BeforeExecute(const MethodName: string;
  SOAPRequest: TStream);
var MyStringList: TStringList;

begin
  MyStringList := TStringList.Create;
  SOAPRequest.Position := 0;
  MyStringList.LoadFromStream(SOAPRequest);
  MyStringList.Text := StringReplace(MyStringList.Text, '<transaction>', '<transaction xmlns="">', [RfReplaceAll]);
  SOAPRequest.Position := 0;
  MyStringList.SaveToStream(SOAPRequest);
end;
...