Allegro Rest Api - pierwsze kroki

Odpowiedz Nowy wątek
2019-02-08 23:24
0

Witam Was, webapi mam opanowane do perfekcji natomiast z REST nigdy nie miałem do czynienia ale po kolei. Wrzuciłem na formę 3 komponenty RestClient, RestRequest i RestResponse.
Z dokumentacji na allegro mniejwięcej tak wyglądać powinno zapytanie i to co powienienem otrzymać:

Przykładowy request do generowania kodu:

curl -X POST \
  'https://allegro.pl/auth/oauth/device' \
  -H 'Authorization: Basic base64(client_id:client_secret)' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'client_id={client_id}'


Przykładowy response:

{
        user_code: "cbt3zdu4g",                             -- kod użytkownika - zalecamy 
                                                            przedstawić te dane użytkownikowi 
                                                            w postaci XXX XXX XXX. Taka forma 
                                                            będzie dla niego czytelniejsza 
                                                            przy przepisywaniu.
        device_code: "645629715",                           -- kod aplikacji - niezbędny 
                                                            do uzyskania tokenu dostępowego
        expires_in: "3600"                                  -- liczba sekund, przez które ważne są
                                                            oba kody
        interval: “5”,                                      -- wymagany odstęp (w sekundach) 
                                                            pomiędzy kolejnymi zapytaniami o 
                                                            status autoryzacji. Jeśli będziesz 
                                                            odpytywać częściej otrzymasz 
                                                            odpowiedź o statusie HTTP 400 z 
                                                            kodem: "slow_down".
verification_uri: “https://allegro.pl/skojarz-aplikacje”,   -- adres do weryfikacji użytkownika
verification_uri_complete: “https://allegro.pl/skojarz-aplikacje?code=645629715”   
                                                            -- adres do weryfikacji dla użytkownika z 
                                                            wypełnionym kodem użytkownika
}

Tutaj mój kod w delphi:

procedure Test;
begin
  RestClient.BaseURL := 'https://allegro.pl.allegrosandbox.pl';

  RestRequest.Method := TRESTRequestMethod.rmPOST;
  RestRequest.Resource := 'auth/oauth/device';
  RestRequest.AddParameter('Authorization','Basic '+EncodeBase64(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);
  RestRequest.Execute;

  Memo1.Text := RestResponse.Content;
end;

Aplikacja zarejestrowana na allegro i taka sama nazwa aplikacji ustawiona w delphi. W odpowiedzi w memo1 otrzymuję "nie można wyświetlić strony + cała strona główna allegro w htmlu"
Gdzieś robię błąd ale brak mi już pomysłów. Odpowiedź powinna być zupełnie inna.

Pozostało 580 znaków

2019-02-09 10:49
0

słyszałem że WiRL jest bardzo dobry https://github.com/delphi-blocks/WiRL

Pozostało 580 znaków

2019-02-09 12:14
0

Ale komponenty raczej nie są problemem gdyż jak zmienię jedną literę w

RestRequest.Resource := 'auth/oauth/device';

to otrzymuję w memo1 prawidłowy komunikat: {"error":"unauthorized","error_description":"Full authentication is required to access this resource"}

edytowany 1x, ostatnio: Rafał D, 2019-02-09 12:15

Pozostało 580 znaków

2019-02-09 12:32
0

autoryzację masz robioną używając Base64, upewnij się że twoja funkcja base64 działa prawidłowo. Najlepiej zakoduj kawałek stringa tą funkcją i porównaj czy w wersji php (na jakiejś stronie) czy otrzymujesz ten sam wynik. Kiedyś miałem właśnie problem w podobnej sytuacji. Dodatkowo pisz kod używając UTF8 na wszelki wypadek.

Pozostało 580 znaków

2019-02-09 12:39
0

To była pierwsza czynność jaką sprawdziłem :) Używam tej funckji z modułu: Synacode

curl -X POST \
  'https://allegro.pl/auth/oauth/device' \
  -H 'Authorization: Basic base64(client_id:client_secret)' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'client_id={client_id}'

Przyznam szczerze że za bardzo nie wiem co oznacza w powyższym zapisie -H oraz -d

edytowany 2x, ostatnio: furious programming, 2019-02-09 14:37

Pozostało 580 znaków

2019-02-09 12:55
0

-H to Header czyli nagłówek
i tu popełniasz bład
-d to Data czyli dane (parametry) które wysyłasz metodą POST


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 1x, ostatnio: kAzek, 2019-02-09 12:55

Pozostało 580 znaków

2019-02-09 13:05
0

co do flag w cURL-u: https://curl.haxx.se/docs/manpage.html

Pozostało 580 znaków

2019-02-09 23:52
0

Napisałem taką procedurę w oparciu o Indy

procedure TForm2.Button1Click(Sender: TObject);
var
  Indy : TIdHTTP;
  IdSSL : TIdSSLIOHandlerSocketOpenSSL;
  Data : String;
  JSONToSend : TStringStream;
  Response: string;
begin
  Indy := TIdHTTP.Create(nil);
  try
    IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(Indy);
    IdSSL.SSLOptions.SSLVersions := [sslvTLSv1_2];
    Indy.IOHandler := IdSSL;
    Indy.Request.BasicAuthentication := False;
    Indy.Request.CustomHeaders.Values['Authorization'] := 'Basic '+EncodeBase64(client_id+':'+client_secret);
    Indy.Request.ContentType := 'application/x-www-form-urlencoded';
    Data := 'client_id='+client_id;
    JSONToSend := TStringStream.Create(Data,TEncoding.UTF8);
    try  
      Response := Indy.Post('https://allegro.pl.allegrosandbox.pl/auth/oauth/device',JSONToSend);
    finally
     JSONToSend.Free;
    end;    
     memo1.Text := Response;
  finally
    Indy.Free;
  end;
end;

I działa poprawnie zwraca to co potrzeba. Jednak jako że jestem uparty nadal nie potrafię sobie poradzić z kontrolkami Restclinet, restresponse. Teoretycznie nagłówek czyli header to jest to:


RestRequest.AddParameter('Authorization','Basic '+EncodeBase64(client_id+':'+client_secret),TRESTRequestParameterKind.pkHTTPHEADER);
RestRequest.AddParameter('Content-Type','application/x-www-form-urlencoded',TRESTRequestParameterKind.pkHTTPHEADER); 

natomiast dana to niby to

RestRequest.AddParameter('client_id',client_id,TRESTRequestParameterKind.pkGETorPOST);

Nawet próbuję wykorzystać Rest debugger od embarcadero i tam też nie mogę sobie poradzić. Gdzie się wprowadza nagłówki a gdzie dane?

edytowany 1x, ostatnio: Rafał D, 2019-02-10 00:06

Pozostało 580 znaków

2019-02-10 20:57
0

Już sobie poradziłem z RestClient, RestResponse, RestRequest. popełniałem banalny błąd aż wstyd się przyznać. Jednakże zostanę chyba przy rozwiązaniu z Indy gdyż program będzie lżejszy.

Napisz, proszę jaki to błąd, bo ja mam cały czas błąd 401 w przypadku Indy, a w przypadku RestClient - error connecting with SSL 1409442E - WN 2019-03-15 09:22

Pozostało 580 znaków

2019-03-15 09:27
WN
0

Napisz, proszę, jaki to błąd, bo korzystając z Indy mam w odpowiedzi 401, a w przypadku RestClient - error connecting with SSL.

Pozostało 580 znaków

2019-03-15 18:58
1

Co do błędów połączeń SSL zawsze sprawdzajcie aktualność bibliotek OpenSSL, bo w przypadku nieaktualnych serwery mogą po prostu odrzucać połączenie.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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