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>