如何在使用Transaction Exchange Server Web服务时正确获取命名空间?

时间:2011-05-05 14:13:12

标签: web-services delphi delphi-7

我正在尝试使用TxServer web service,但我收到了错误回复

  

解组错误:意外元素(uri:“http://txserver.sut.softekpr.com/1”,本地:“交易”). Expected elements are< {}事务>`。

我发现Delphi生成的XML不能与服务一起使用,
但如果我将xmlns=""添加到交易代码中,它就可以了 任何人都可以帮我添加xmlns=""到交易代码吗? 我想:<transaction xmlns="">

BTW我尝试将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 个答案:

答案 0 :(得分:3)

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

其中InstitutionCode是某个节点名称,#0为空字符,只是空字符串''无效,它被生成的名称替换。

宽字符串可能有问题,但您可以使用TXSString代替

答案 1 :(得分:2)

在RIO对象上使用OnBeforePost事件,只需编辑传出字符串即可。它很脏,但它有效。

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

以下是通过GUI方式挂接RIO的示例: http://www.onlinedelphitraining.com/newsletters/webservices.htm

以下是关于在代码中执行此操作的讨论: THttprio onBeforeExecute changing the soapRequest

答案 2 :(得分:1)

然后尝试使用THTTPRIO组件,如果你在Delphi发行版中有它,并尝试将其传递给GetTxServer方法调用。

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

正如Chris之前提到的,你可以在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;