allegro / allegro-api

Issue tracker and wiki for Allegro REST API
https://developer.allegro.pl/
213 stars 39 forks source link

Offset nie działa, jego dodanie nie robi żadnej różnicy #177

Closed gustawdaniel closed 6 years ago

gustawdaniel commented 6 years ago

Wysyłam dwa żądania HTTP które różnią się jedynie parametrem offset:

Pierwsze z offset=0

http -b "https://api.allegro.pl/offers?seller.id=10657099&offset=0&limit=3" Accept:"application/vnd.allegro.public.v1+json" User-Agent:"MyApp/1.0 (Client-Id 9ff2ad98-f5b0-4f86-9613-833f9129af29) Linux/x86_64 (CentOS)" | jq '.offers[] | "\(.id)   \(.name)"'

Drugie z offset=3

http -b "https://api.allegro.pl/offers?seller.id=10657099&offset=3&limit=3" Accept:"application/vnd.allegro.public.v1+json" User-Agent:"MyApp/1.0 (Client-Id 9ff2ad98-f5b0-4f86-9613-833f9129af29) Linux/x86_64 (CentOS)" | jq '.offers[] | "\(.id)   \(.name)"'

W obu przypadkach wynikiem działania tej komendy jest ten sam tekst:

"7223849945   KOBIECA BLUZKA AŻUR GUZIKI KOLORY WIOSNA UNI A367"
"7287944907   SUKIENKA GLAMOUR FALBANKA KOLORY WIOSNA UNI N688"
"7285953205   CUDOWNA ROZSZERZANA BLUZKA LUŹNA OVERSIZE UNI P488"

W powyższym przykładzie korzystałem z programów httpie - do wysyłania żądań oraz jq - do wycinania danych z jsona.

Być może kluczem do poprawnego stronicowania tego zasobu jest pageToken.next - własność odpowiedzi, która zwracana jest w pełnej nie okrojonej przez jq odpowiedzi

{
  offers: [ ... ]
  pageToken: { next: 'eyJwIjpbIjIiXSwibGltaXQiOlsiMyJdfQ==', previous: null },
  count: 2073,
  fallbackMode: { mode: 'NONE' },
  sponsoredOffers: [],
  searchScenarioName: 'ss-base-relevance-floki-5-nga-hcp-wp-uni-1-2-0328' 
}

Niestety w dokumentacjach:

nie znalazłem informacji o pageToken.next.

kormichu commented 6 years ago

Ja bym się wstrzymał z korzystania z nieudokumentowanych metod. Struktura odpowiedzi z tego co widzę jest zupełnie inna niż przy POST / PUT. Może to być wina tego, że korzystasz z wersji API: application/vnd.allegro.public.v1+json a nie jak dokumentacja wskazuje dla całej sekcji z API oferty: application/vnd.allegro.beta.v1+json (choć tutaj konieczny jest już chyba nagłówek Authorization bo wali 406). Ja bym rozważył skorzystanie z metody WebAPI: https://allegro.pl/webapi/documentation.php/show/id,1342#method-input

Jeśli jednak mimo wszystko chcesz korzystać tylko z REST API to widzę że dodanie parametru pageToken z odpowiedzi rozwiązuje sprawę:

curl -H "Accept: application/vnd.allegro.public.v1+json" -H "User-Agent: MyApp/1.0 (Client-Id 9ff2ad98-f5b0-4f86-9613-833f9129af29) Linux/x86_64 (CentOS)" "https://api.allegro.pl/offers?seller.id=10657099&limit=1" | jq '.offers[] | "(.id) (.name)"'

curl -H "Accept: application/vnd.allegro.public.v1+json" -H "User-Agent: MyApp/1.0 (Client-Id 9ff2ad98-f5b0-4f86-9613-833f9129af29) Linux/x86_64 (CentOS)" "https://api.allegro.pl/offers?seller.id=10657099&pageToken=eyJwIjpbIjIiXSwibGltaXQiOlsiMSJdfQ==" | jq '.offers[] | "(.id) (.name)"'

Parametr ten oczywiście możesz sobie sam generować bo to nic innego jak json zakodowany base64:

eyJwIjpbIjIiXSwibGltaXQiOlsiMSJdfQ== --> {"p":["2"],"limit":["1"]}

gustawdaniel commented 6 years ago

Dzięki. Zadziałało.