Einzelnen Beitrag anzeigen

Benutzerbild von LWChris
LWChris

Registriert seit: 27. Jul 2010
Ort: Erkelenz
22 Beiträge
 
Turbo Delphi für Win32
 
#1

idHTTP - GET mit Header und Kompression

  Alt 27. Jul 2010, 05:01
Hallo zusammen,

ich habe bereits die ganze Nacht gegooglet und habe mit jetzt entschieden, DP beizutreten, da ich es ehrlich gesagt für das kompetenteste Forum halte bisher.

Ich hoffe, ihr könnt mir helfen.

Ich möchte gerne die Discogs API verwenden (API-Dokumentation falls jemand das Folgende selbst nachlesen will), um (für's erste einmal) Künstler nachzuschlagen.

Die API verlangt GET Abfragen, im Header "Accept-Encoding: gzip", und die Antwort kommt als gzip komprimiertes XML. Folgende Unit habe ich mir bisher dafür zusammengebastelt - leider ohne Erfolg, ich erhalte als Antwort immer "HTTP/1.1 200 OK"; die Bestätigung nützt mir aber nicht viel, ich möchte ja gerne an die Daten.

Vorab-Info, damit ihr euch nicht allzusehr einlesen müsst:
MakeURL erzeugt z. B. einen Link im Format
Code:
http://www.discogs.com/search?type=artists&q=metallica&f=xml&api_key=<API_Key>
Delphi-Quellcode:
unit U_Discogs;

interface

uses
  Classes, SysUtils, idHTTP, IdHTTPHeaderInfo, IdCompressorZLibEx;

var
  Compressor: TIdCompressorZLibEx;
  DC_HTTP: TidHTTP;

function DC_SearchArtist(Name: String): Boolean;

implementation

function MakeURL(SType, STerm: String): String;
begin
  STerm:=StringReplace(LowerCase(STerm),' ','+',[rfReplaceAll]);
  result:='http://www.discogs.com/search?type='+SType+'q='+STerm+'&f=xml&api_key=<API_Key>';
end;

function DC_SearchArtist(Name: String): Boolean;
var Response: TStringStream;
    ResponseT: String;
begin
  Response:=TStringStream.Create('');
  try
    with DC_HTTP.Request do
      begin
        Method:='GET';
        URL:=MakeURL('artists',Name);
        Host:='www.discogs.com';
        AcceptEncoding:='gzip';
      end;
    DC_HTTP.Get(MakeURL('artists',Name),Response);
    ResponseT:=Response.DataString;
  except
   on E: Exception do
     begin
       ResponseT:='';
     end;
  end;
  Response.Free;
  result:=Pos('<resp stat="ok"',ResponseT)=1;
end;

initialization
  DC_HTTP:=TidHTTP.Create;
  Compressor:=TIdCompressorZLibEx.Create(DC_HTTP);
  DC_HTTP.Compressor:=Compressor;

finalization
  Compressor.Free;
  DC_HTTP.Free;

end.
Kann mir jemand helfen, wie ich an die XML-Daten komme, bzw. sagen, was ich falsch mache? Ich bin noch sehr unerfahren auf dem Gebiet HTTP Get und Post (sowie im Delphi-Umgang mit XML, aber das ist ja sekundär, es würde mir ja schon reichen, wenn ich das XML-Ergebnis zunächst mal als Fließtext sehe).

Liegt der Fehler darin, dass ich TStringStream nehme und nicht etwa eine XML Komponente aus xmldom, XMLIntf, msxmldom bzw. XMLDoc (ich verwende immer alle 4 gleichzeitig, weil ich nie weiß, was wo implementiert ist)?

Ich hoffe, ihr könnt mir helfen.

Übrigens: den API-Key kann ich euch natürlich leider nicht geben. Aber ich bin gerne bereit, eure Vorschläge jedes mal im Programm auszuprobieren.

P.S.: Die Stichworte sind ja lustig, get ist zu allgemein, neue darf ich nicht verwenden, welche es schon gibt kann ich nicht einsehen. Sollte man vielleicht mal mit Vorschlägen versehen, damit man weiß, welche man verwenden darf.
Chris
  Mit Zitat antworten Zitat