Возникли проблемы с XML-RPC и Delphi - PullRequest
2 голосов
/ 02 сентября 2010
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack,
  IdIntercept, IdCookieManager, IdZLibCompressorBase, IdCompressorZLib, IdSSL,
  IdSSLOpenSSL;

type
  TForm2 = class(TForm)
    IdHTTP1: TIdHTTP;
    Button1: TButton;
    Memo1: TMemo; 
    IdCompressorZLib1: TIdCompressorZLib;
    IdCookieManager1: TIdCookieManager;
    IdConnectionIntercept1: TIdConnectionIntercept;
    IdIOHandlerStack1: TIdIOHandlerStack;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure StringToStream(const Text: string; Stream: TStream);
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.StringToStream(const Text: string; Stream: TStream);
begin
  Stream.Write(Text[1], Length(Text));
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  temp:string;
  SendStream: TStream;
  ResponseStream: TStream;
begin
    SendStream := TMemoryStream.Create;
    ResponseStream := TMemoryStream.Create;


    temp:=  '<?xml version="1.0"?>
<methodCall>
   <methodName>weblogUpdates.ping</methodName>
   <params>
      <param>
         <value>%WEBNAME%</value>
         </param>
      <param>
        <value>%WEBADDREESS%</value>
      </param>
      </params>
   </methodCall>'; // copied from text file where I was loading this

    temp:= StringReplace(temp, '%WEBNAME%', 'Generic Website Title',[rfReplaceAll, rfIgnoreCase]);
    temp:= StringReplace(temp, '%WEBADDREESS%', 'http://www.testingwebsite.com',[rfReplaceAll, rfIgnoreCase]);

    memo1.Lines.Add(temp);
    StringToStream(temp, SendStream); // convert to a stream
    SendStream.Position := 0;

    idhttp1.Request.Accept := '*/*';
    idhttp1.Request.ContentType := 'text/xml';
    idhttp1.Request.Connection := 'Keep-Alive';
    idhttp1.Request.ContentLength := Length(temp);
    memo1.lines.Add(idhttp1.Post('http://ping.feedburner.com', SendStream));
{
if FHostPort = 80 then
          Session.Post('http://' + FHostName + FEndPoint, SendStream,
            ResponseStream)
        else
          Session.Post('http://' + FHostName + ':' + IntToStr(FHostPort) +
            FEndPoint, SendStream, ResponseStream);

      if FSSLEnable then
        Session.Post('https://' + FHostName + ':' + IntToStr(FHostPort) +
          FEndPoint, SendStream, ResponseStream);

}
end;

end.

на DFM, я установил под idHTTP1 компрессор, CookieManager, Intercept и IOHandler.Я копирую необходимые DLL-файлы OpenSSL в папку проекта

Продолжаю получать сообщение об ошибке: Не удалось разобрать запрос XML-RPC: структуры документов XML должны начинаться и заканчиваться в одной и той же сущности

Любые идеикак это исправить?

Ответы [ 2 ]

2 голосов
/ 02 сентября 2010

это исключительная ситуация синтаксического анализатора xml, вероятно, выданная на стороне сервера.

, поскольку отправляемый вами xml действителен (однако вам действительно следует использовать библиотеку xml для его создания!), Скорее всего, ошибкаозначает, что поток, который получает сервер, усекается ... другими словами, длина заголовка содержимого меньше отправленных байтов.

Я предполагаю, что вы используете версию delphi с поддержкой юникода,длина вашего контента будет равна половине фактических отправленных байтов;изменить тип данных Text в StringToStream на AnsiString.

0 голосов
/ 02 сентября 2010

или ... Stream.Write (Text [1], (Length (Text) * SizeOf (Char))); ... temp: = '... encoding = "UTF-16"?>

...