Einzelnen Beitrag anzeigen

Maekkelrajter

Registriert seit: 8. Mär 2017
Ort: Köln
156 Beiträge
 
Delphi 12 Athens
 
#6

AW: Problem bei JSON-Abfrage

  Alt 20. Sep 2020, 23:33
Kannst du mal als Beispiel das JSON für eine funktionierende Antwort hier posten? Das müsste noch wesentlich eleganter gehen.

Auch deine aktuelle Lösung für die Authentifizierung würde ich gerne mal sehen (natürlich ohne echte Daten). Da ist oft auch noch Raum für Vereinfachungen.
Ich war ja froh, als ich das Ding endlich am laufen hatte. Ich zweifele auch nicht im geringsten daran dass der Code noch verbesserungsfähig ist. Hier also die Authentifizierungs Routinen, die ich übrigens zum Teil aus dem Beispiel-Programm abgekupfert habe:
Delphi-Quellcode:

{
type
    TSpManager = class(TForm)
    [...]
    IdHTTPServer1: TIdHTTPServer;
    OAuth2Authenticator1: TOAuth2Authenticator;
    RESTClient1: TRESTClient;
    RESTRequest1: TRESTRequest;
    RESTResponse1: TRESTResponse;
    procedure IdHTTPServer1CommandGet(AContext: TIdContext;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
    [...]
}


Procedure TSpManager.SendData(s:string);
 var
    CDStruct: TCopyDataStruct;
    copytext: ansistring;
begin
  copytext:= s;
  begin
    CDStruct.dwData:= 0;
    CDStruct.cbData:= length(Copytext) + 1;
    CDStruct.lpData:= @CopyText[1];
    SendMessage(MainHandle, WM_COPYDATA,1,integer(@CDStruct));
  end;
end;


Procedure TSpManager.AuthorizeSpotifyAccess;
begin
  IdHTTPServer1.Active := True;
  OAuth2Authenticator1.ResetToDefaults;
  OAuth2Authenticator1.ClientID := Stcf.AccessData.clientID; // Bei der Registrierung von Spotify zugeteilt (lokal gespeichert)
  OAuth2Authenticator1.ClientSecret := Stcf.AccessData.ClientSecret; // Bei der Registrierung von Spotify zugeteilt (lokal gespeichert)
  OAuth2Authenticator1.AuthorizationEndpoint := 'https://accounts.spotify.com/authorize';
  // Bereiche, auf die Benutzerzugriff erlaubt sein soll
  OAuth2Authenticator1.Scope := 'playlist-read-private user-read-private user-library-read';
  // Weiterleitungsseite mit dem aktuellen AUTORISIERUNGSCODE
  OAuth2Authenticator1.RedirectionEndpoint := 'http://localhost:9090';
  // Die Definition des URI zum Generieren des AUTORISIERUNGSCODES
  ShellExecute(0, 'OPEN', PChar(Self.OAuth2Authenticator1.AuthorizationRequestURI), '', '', SW_SHOWNORMAL);
end;


procedure TSpManager.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
  var s:string;
begin
  // Abfrage-String validiert
  if (ARequestInfo.Params.IndexOfName('code') = -1) then Exit;
  // Definition des ACCESS CODE, den wir von der Weiterleitungsseite abrufen
  OAuth2Authenticator1.AuthCode := ARequestInfo.Params.Values['code'];
  // End-point für die Generierung des ACCESS TOKEN
  OAuth2Authenticator1.AccessTokenEndpoint := 'https://accounts.spotify.com/api/token';
  // Definieren des ACCESS TOKEN aus dem AUTORISIERUNGSCODE
  OAuth2Authenticator1.ChangeAuthCodeToAccesToken;
  // Antwort an den Browser
  AResponseInfo.ContentText := '<html><body><script language=javascript>window.close();</script>Vielen Dank, dass Sie den Zugriff erlaubt haben!</body></html>';
  // Operation erfolgreich!
  s:= OAuth2Authenticator1.AccessToken;
  SendData(s); // Schickt die Daten nur zur Information an das Hauptfenster;
  FAuthorized:= s <> ''; // Boolean als Flag
end;
Im Anhang ein JSON mit Playlist-Daten, das Spotify nach einem Request mit dem accesspoint '/v1/playlists/{playlist_id}' liefert. Für meine Zwecke werden nur wenige Daten ausgelesen und in Zieldateien geschrieben (wenn vorhanden)
Für Anregungen und Verbesserungsvorschläge bin ich ausgesprochen dankbar!

Gruß LP
Miniaturansicht angehängter Grafiken
screenshot200920_2.jpg  
Angehängte Dateien
Dateityp: txt RESTResponse_Content.txt (31,8 KB, 28x aufgerufen)

Geändert von Maekkelrajter (20. Sep 2020 um 23:41 Uhr)
  Mit Zitat antworten Zitat