Odebranie odpowiedzi POST XML za pomocą HTTPMethod

0

Witam. W poniższym kodzie udaje mi się wysłać prawidłowy POST z XML i otrzymuje też prawidłową odpowiedź z serwera (podglądając pakiety za pomocą Wireshark). Udało mi się wyświetlić nagłówek tej odpowiedzi ale nie jestem w stanie dobrać się do zawartości XML z odpowiedzi serwera. W stringach/plikach które uzyskuję, mam krzaki. Być może to coś prostego i mam przysłowiowe klapki na oczach, ale będę wdzięczny za udzieloną pomoc niedzielnemu programisty :-). Chcę to robić dalej w Synapse, bo udaje mi się w nim tworzyć prawidłowe pakiety dla serwera Chomika.
Pod kodem zamieszczam przykładową odpowiedź z serwera.

procedure chomik_zaloguj_box;

var
  I, Position : integer;
  Address, Command, FCookies, FPage, URLData, Str, RedirUrl : string;
  login1, login2, haslo_MD5, xml, URL, Params : String;
  idmd5 : TIdHashMessageDigest5;
  haslo_stream : TStream;


begin

  Mozilla_UserAgent = 'Mozilla/5.0';
  login : String = 'chomik_testowy1';
  haslo : String = 'Haslo1234';

  // hash'owanie hasla do MD5
  idmd5 := TIdHashMessageDigest5.Create;
  haslo_stream := TStringStream.Create(haslo) ;
   try
     haslo_MD5 := idmd5.AsHex(idmd5.HashValue(haslo_stream)) ;
     haslo_MD5 := LowerCase (haslo_MD5);
   finally
     haslo_stream.Free;
     idmd5.Free;
   end;
  // wynik hash'owania tego hasła 793b15d6174f3e2956a2f67b3f3a39b7

   // generowanie ciągu XML do pakietu HTTP dla logowania Abelhas
  xml := '<?xml version="1.0" encoding="UTF-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><Auth xmlns="http://chomikuj.pl/"><name>' + login + '</name><passHash>' + haslo_md5 + '</passHash><ver>4</ver><client><name>chomikbox</name><version>2.0.8</version></client></Auth></s:Body></s:Envelope>';
  SynHttp := THttpSend.Create;

  with SynHttp do
  begin
  Protocol := '1.1';
  KeepAlive := True;
  UserAgent := Mozilla_UserAgent;
  SynHttp.MimeType := 'text/xml;charset=utf-8';
  SynHttp.Headers.Add('SOAPAction: http://chomikuj.pl/IChomikBoxService/Auth');
  SynHttp.Headers.Add('Accept-Encoding: gzip');
  SynHttp.Headers.Add('Accept-Language: pl-PL,en,*');
  SynHttp.Headers.Add('');
  SynHttp.Headers.Add(xml);
  Document.Write(Pointer(xml)^, Length(xml));
  URLData := 'http://box.chomikuj.pl/services/ChomikBoxService.svc';
  HTTPMethod('POST', URLData);

  case ResultCode of
      200 :
        begin
          Headers.SaveToFile('E://01 zalogowany odpowiedz naglowek.txt'); // działa prawidłowo
          Document.SaveToFile('E://02 zalogowany_box.xml');                    // otrzymuje krzaki
          //Document.Write(Pointer(URLData)^, Length(URLData));
          FPage := StreamToString(Document);
          ShowMessage(synHTTP.ResultString);

          //Data.LoadFromStream(SynHttp.Document);
          //FPage := Data.Text;
          //Data.SaveToFile('E://04 zalogowany_box.xml');                      // otrzymuje krzaki

          Assign(Debug, 'E://03 zalogowany_box.xml');
          Rewrite(Debug);
          Writeln(Debug, FPage);
        end;

  else

      begin
        //SetLength(FPage, SynHttp.Document.Size);
        //SynHttp.Document.Read(PChar(FPage)^, Length(FPage));
        MessageBox(Application.Handle, PChar('Problem z łączem. Spróbuj jeszcze raz. BOX'), PChar(naglowek), MB_ICONERROR + MB_OK);
      end;

  end; // dla case

  end;

end;
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/xml; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Server: m30
X-Powered-By: ASP.NET
Date: Sat, 03 Oct 2015 22:41:55 GMT
Connection: close
Content-Length: 287

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><AuthResponse xmlns="http://chomikuj.pl/"><AuthResult xmlns:a="http://chomikuj.pl" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><a:status>Ok</a:status><a:errorMessage i:nil="true"/><a:hamsterId>19717347</a:hamsterId><a:publisherId i:nil="true"/><a:name>chomik_testowy1</a:name><a:token>bc99cedf-8f17-4202-bf04-485643855237</a:token></AuthResult></AuthResponse></s:Body></s:Envelope>
1

Czyli jak rozumiem zmienna FPage to "krzaki"? Bo nie mam teraz dostępu do swojego PC żeby wrzucić przykład mojego kodu do logowania na chomikuj.pl. Jednak czego się spodziewasz zamiast "krzaków", jeżeli zwrócone dane chcesz mieć encodowane jako gzip? Według mnie czysty tekst wtedy raczej nie jest zwracany. A i co do zapisu stringów do pliku w ramach podglądu. To polecam raczej użyć TStringList. Skoro już piszesz pod VCL. Po co stosować jakieś konstrukcje Assign rodem z - nie wiem - konsoli lub Turbo Pascala?

0
olesio napisał(a):

... Jednak czego się spodziewasz zamiast "krzaków", jeżeli zwrócone dane chcesz mieć encodowane jako gzip? Według mnie czysty tekst wtedy raczej nie jest zwracany. ...

I wszystko jasne. Po raz kolejny rady od olesio są w 100% trafne i pomocne. Ściągnąłem cały pakiet ZlibExGz, dodałem do uses, dwie linijki kodu i pakiet xml widzę już jako String. A wygląda to tak:

uses
	ZlibExGz;

// jakiś tam kod

	      // odebranie i rozpakowanie pakietu XML
          FPage := ReadStrFromStream(Document,Document.Size);
          FPage := GZDecompressStr(FPage);

          // zapis danych XML do pliku
          with TStringList.Create do
           try
            Add(FPage);
            SaveToFile('e:\01 logowanie xml.txt');
           finally
            Free;
          end;
 

Ciągle dają znać o sobie przyzwyczajenia z AutoIT. Tam od razu otrzymywałem rozpakowany pakiet i jak naiwny myślałem, że Synapse też tak potrafi.
Problem rozwiązany, temat do zamknięcia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1