Post XML with TidHttp Invalid request

问题描述 投票:0回答:1

[我正在尝试使用Delphi 2007发布XML文件以与WorldPay进行交易,但是我一直收到“无效请求”错误。

这是我的代码,我无法弄清楚自己在做什么错。

Var
  XDoc, ReturnStr:String;
  XMLToSend, resp: TStringStream;
  IdHTTP1:TIdHTTP;
  IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
begin   
  with Datam1.CCSetupTbl do
  begin
    XDoc := '<?xml version="1.0" encoding="UTF-8"?>' +
            '<TransactionSetup xmlns="https://certtransaction.elementexpress.com">' +
              '<Credentials>' +
                '<AccountID>' + FieldByName('M').AsString + '</AccountID>' +
                '<AccountToken>' + FieldByName('MW').AsString + '</AccountToken>' +
                '<AcceptorID>' + FieldByName('MP').AsString + '</AcceptorID>' +
              '</Credentials>' +
              '<Application>' +
                '<ApplicationID>00000</ApplicationID>' +
                '<ApplicationVersion>7.60.0</ApplicationVersion>' +
                '<ApplicationName>CPOS</ApplicationName>' +
              '</Application>' +
              '<TransactionSetup>' +
                '<TransactionSetupMethod>7</TransactionSetupMethod>' +
                '<Embedded>1</Embedded>' +
                '<CVVRequired>0</CVVRequired>' +
                '<AutoReturn>1</AutoReturn>' +
                '<ReturnURL>http://localhost</ReturnURL>' +
                '<CustomCss>body{margin-left: 50px;}</CustomCss>' +
              '</TransactionSetup>' +
              '<Transaction>' +
                '<TransactionAmount>1.00</TransactionAmount>' +
                '<MarketCode>0</MarketCode>' +
                '<ReferenceNumber>123456</ReferenceNumber>' +
                '<TicketNumber>123456</TicketNumber>' +
                '<PartialApprovedFlag>0</PartialApprovedFlag>' +
              '</Transaction>' +
              '<Terminal>' +
                '<TerminalID>01</TerminalID>' +
                '<TerminalType>0</TerminalType>' +
                '<CardholderPresentCode>0</CardholderPresentCode>' +
                '<CardInputCode>0</CardInputCode>' +
                '<TerminalCapabilityCode>0</TerminalCapabilityCode>' +
                '<TerminalEnvironmentCode>0</TerminalEnvironmentCode>' +
                '<CardPresentCode>0</CardPresentCode>' +
                '<MotoECICode>0</MotoECICode>' +
                '<CVVPresenceCode>0</CVVPresenceCode>' +
              '</Terminal>'+
              '<PaymentAccount>' +
                '<PaymentAccountType>1</PaymentAccountType>' +
                '<PaymentAccountReferenceNumber>' + CusAccount + '</PaymentAccountReferenceNumber>' +
              '</PaymentAccount>' +
            '</TransactionSetup>';
  end;
  Try
    IdHTTP1 := TIdHTTP.Create;
    with IdHTTP1 do
    begin
      Request.Accept := 'text/html';
      Request.ContentType := 'text/html';
      Request.CharSet := 'utf-8';
      Request.CacheControl := 'no-cache';
      ReadTimeout := 30000;
      ConnectTimeout := 30000;
      Request.BasicAuthentication := False;
      Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
      HTTPOptions := [hoForceEncodeParams];
    end;

    IdSSLIOHandlerSocketOpenSSL1:= TIdSSLIOHandlerSocketOpenSSL.Create;
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLVersions:= [sslvTLSv1_2];
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1_2;
    IdHttp1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
    XMLToSend := TStringStream.Create(XDoc);

    ReturnStr := IdHTTP1.Post('https://certtransaction.elementexpress.com', XMLToSend);
  finally
    IdHTTP1.Free;
    IdSSLIOHandlerSocketOpenSSL1.Free;
    XMLToSend.Free;
  end;
xml delphi-2007 indy10
1个回答
0
投票

嗯,对于初学者来说,您是在告诉服务器您要发布HTML而不是XML。对于XML,'text/html'是错误的Content-Type

第二,如果它们恰好包含任何保留字符,则您不会转义要插入XML中的值。您确实应该使用适当的XML库来准备您的帖子数据。

最后,您的异常处理的结构不是很好。

尝试以下方法:

Var
  XDoc, ReturnStr: String;
  XMLToSend: TStringStream;
  IdHTTP1: TIdHTTP;
  IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
begin   
  with Datam1.CCSetupTbl do
  begin
    XDoc := ...;
  end;
  IdHTTP1 := TIdHTTP.Create;
  try
    with IdHTTP1 do
    begin
      Request.Accept := 'text/html';
      Request.ContentType := 'text/xml'; // or 'application/xml', or whatever the server actually expects...
      Request.CharSet := 'utf-8';
      Request.CacheControl := 'no-cache';
      ReadTimeout := 30000;
      ConnectTimeout := 30000;
      Request.BasicAuthentication := False;
      Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
      HTTPOptions := [hoForceEncodeParams];
    end;

    IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP1);
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLVersions := [sslvTLSv1_2];
    IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;

    XMLToSend := TStringStream.Create(XDoc);
    try
      ReturnStr := IdHTTP1.Post('https://certtransaction.elementexpress.com', XMLToSend);
    finally
      XMLToSend.Free;
    end;
  finally
    IdHTTP1.Free;
  end;
© www.soinside.com 2019 - 2024. All rights reserved.