Allegro Rest API – problem z pobraniem access_token

0

Witam
Próbuję zrobić interfejs w Delphi (RAD Studio 10.3) do połączenia z REST Allegro . Proszę o pomoc - nie wiem jak rozpocząć. Napisałem procedurę:

procedure TForm1.Button5Click(Sender: TObject);
begin
 client_id:='xxx';
  client_secret:='xxx';

  Restrequest.Client:=restclient;
  RestClient.BaseURL := 'https://allegro.pl';
  RestRequest.Method := TRESTRequestMethod.rmPOST;
  RestRequest.Resource := 'auth/oauth/device';
  RestRequest.AddParameter('Authorization','Basic '+TNetEncoding.Base64.encode(client_id+':'+client_secret),TRESTRequestParameterKind.pkHTTPHEADER);
  RestRequest.AddParameter('Content-Type','application/x-www-form-urlencoded',TRESTRequestParameterKind.pkHTTPHEADER);
  RestRequest.AddParameter('client_id',client_id,TRESTRequestParameterKind.pkGETorPOST);
  RestClient.ContentType:='application/x-www-form-urlencoded';
  RestRequest.Execute;
  Memo1.Text := RestResponse.Content;
end;

Po wywołaniu procedury memo wyświetla html strony z informacją, że nie można wyświetlić strony. Nie wiem co jeszcze źle robię. Wiem, że w wyniku powinienem uzyskać access_token, ale nie mam już pomysłu co mam zrobić.

1

Wygląda na to, że poprawnie wysyłasz dane choć testowałbym raczej na bezpieczniej platformie sandbox RestClient1.BaseURL := 'https://allegro.pl.allegrosandbox.pl/'; ale to nie ma znaczenia. Dlaczego 404? Prawdopodobnie nie wgrałeś bibliotek odpowiedzialnych za obsługę SSL do katalogu aplikacji https://indy.fulgan.com/SSL/openssl-1.0.2q-i386-win32.zip (potrzebne są tylko biblioteki DLL)

0

Wklejenie bibliotek nie pomogło. Dołączam w załączniku projekt i proszę o pomoc.

0

Tu jest podobny wątek: Allegro Rest Api - pierwsze kroki

1

@archiwald przecież nie wkleiłeś bibliotek, znaczy są ale w folderze projektu a mają być tam gdzie plik EXE.

1

Ech @archiwald ty masz 401 Unauthorized a nie 404 Not Found

Więc tak :
Pierszy błąd w ten sposób nie uzyskasz poprawnego Base64 do autoryzacji. Trzeba go utworzyć TBase64Encoding z parametrem CharsPerLine na 0.

TNetEncoding.Base64.encode(client_id+':'+client_secret)

Drugi sprawa RestRequest nadgorliwie koduje znaki specjalne choćby często występujący w stringu zakodowanym Base64 znak =' i wychodzi kaszana. Trzeba mu "powiedzieć" aby tego nie robił.

Przetestowany działający kod:

const
  CLIENT_ID ='xxxx';
  CLIENT_SECRET ='xxxx';
var
  sEndodedAuth: string;
begin
  with TBase64Encoding.Create(0) do
  begin
    sEndodedAuth:= Encode(CLIENT_ID + ':' + CLIENT_SECRET);
    Free;
  end;
  Restrequest1.Client:= RestClient1;
  RestClient1.BaseURL:= 'https://allegro.pl/';
  RestRequest1.Method:= TRESTRequestMethod.rmPOST;
  RestRequest1.Resource:= 'auth/oauth/device';
  RestRequest1.AddParameter('Authorization', 'Basic ' +  sEndodedAuth,
    TRESTRequestParameterKind.pkHTTPHEADER, [TRESTRequestParameterOption.poDoNotEncode]);
  RestRequest1.AddParameter('Content-Type','application/x-www-form-urlencoded',
    TRESTRequestParameterKind.pkHTTPHEADER, [TRESTRequestParameterOption.poDoNotEncode]);
  RestRequest1.AddParameter('client_id', CLIENT_ID, TRESTRequestParameterKind.pkGETorPOST);
  RestClient1.ContentType:='application/x-www-form-urlencoded';
  RestRequest1.Execute;
  Memo1.Text:= RestResponse1.Content;
end;
0
kAzek napisał(a):

Wygląda na to, że poprawnie wysyłasz dane choć testowałbym raczej na bezpieczniej platformie sandbox RestClient1.BaseURL := 'https://allegro.pl.allegrosandbox.pl/'; ale to nie ma znaczenia. Dlaczego 404? Prawdopodobnie nie wgrałeś bibliotek odpowiedzialnych za obsługę SSL do katalogu aplikacji https://indy.fulgan.com/SSL/openssl-1.0.2q-i386-win32.zip (potrzebne są tylko biblioteki DLL)

Kod 404 nie ma nic wspólnego z SSL.. TRESTClient nie wymaga żadnych bibliotek, w dokumentacji macie jasno napisane:

http://docwiki.embarcadero.com/RADStudio/Rio/en/REST_Client_Library

Kluczowy fragment:

This allows it to leverage the OS's ability to automatically resolve and deal with SSL/TLS/HTTPS.

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