我正在尝试使用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>
答案 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;