Einzelnen Beitrag anzeigen

Benutzerbild von LWChris
LWChris

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

AW: idHTTP - GET mit Header und Kompression

  Alt 28. Jul 2010, 13:09
So, danke an Matze, betrachtet das Thema als erledigt (falls es hier so ein System gibt). Jedenfalls für alle anderen (ich hasse es, wenn jemand als letzten Beitrag schreibt "Geht jetzt, danke" aber dann nicht mehr genau wie eigentlich), die ein ähnliches Problem haben (werden - Google wird in Zukunft dann weiterhelfen können), hier nochmal abschließend meine gesamte Discogs Unit, für euch sogar, entgegen meinem üblichen Programmierstil für meine privaten Programme, kommentiert.

Delphi-Quellcode:
unit U_Discogs;

interface

uses
  Classes, SysUtils, idHTTP, IdHTTPHeaderInfo, IdCompressorZLibEx,
  xmldom, XMLIntf, msxmldom, XMLDoc;

var
  Compressor: TIdCompressorZLibEx;
  DC_HTTP: TidHTTP;
  DC_XML: TXMLDocument;

function DC_SearchArtist(Name: String): Boolean;
function DC_SearchRelease(Name: String): Boolean;
// DC_SearchLabel könnte entsprechend hinzugefügt werden
// Ich persönlich brauche es momentan aber nicht

implementation

function MakeURL(SType, STerm: String): String;
begin
  STerm:=StringReplace(STerm,' ','+',[rfReplaceAll]);
// Eventuell muss der Suchterm für die API später noch weiter angepasst werden, z. B. mit TIdURI.URLEncode
  result:='http://www.discogs.com/search?type='+SType+'s&q='+STerm+'&f=xml&api_key=<API_Key>'; // URL erzeugen
end;

// Allgemeine Suchfunktion für alle Typen (SType)
function DC_SearchRequest(SType, Name: String): Boolean;
var Response: TStringStream;
begin
  Response := TStringStream.Create('');
  try
    DC_HTTP.Get(MakeURL(SType, Name), Response);
    DC_XML.LoadFromStream(Response,xetUTF_8);
    // Zugriff auf Ergebnis bei erfolgreicher Suche später über DC_XML
  except
    on E: Exception do
      DC_XML.XML.Text:='';
  end;
  Response.Free;
  result:=Pos(' stat="ok"',DC_XML.XML.Text)>0; // Erfolgsbestätigung
end;

// "Weiterleitungen" mit automatischem Suchparameter
// Auf diese Weiterleitungen könnte auch verzichtet werden
// Allerdings gibt es in meinem Projekt viele API-Units, die standardisierte function-Namen verwenden
function DC_SearchArtist(Name: String): Boolean;
begin
  result:=DC_SearchRequest('artist',Name);
end;

function DC_SearchRelease(Name: String): Boolean;
begin
  result:=DC_SearchRequest('release',Name);
end;

// Label-Suche ggf. entsprechend mit 'label' einfügen

// Die Zerlegung des Ergebnisses in meine TArtist, TAlbum und TSong-Klassen fehlt noch

initialization
  DC_HTTP:=TidHTTP.Create; // Allgemeine TidHTTP Komponente der Discogs-Unit
  Compressor:=TIdCompressorZLibEx.Create(DC_HTTP); // Discogs sendet gzip komprimiert
  DC_HTTP.Compressor:=Compressor;
  DC_HTTP.Request.AcceptEncoding:='gzip'; // GET Header mit "Accept-Encoding: gzip" versehen
  DC_XML:=TXMLDocument.Create(''); // Allgemeine TXMLDocument Komponente der Discogs-Unit

finalization
  // Beim Beenden die allgemeinen Objekte wieder freigeben
  DC_XML.Free;
  Compressor.Free;
  DC_HTTP.Free;

end.
Chris
Software: schnell, effektiv, günstig. Wähle zwei.
  Mit Zitat antworten Zitat