← Wszystkie tematy W 49% ogłoszeń · 23 z 47 ogłoszeń frontend React

REST / GraphQL

Kelner w restauracji

REST lub GraphQL pojawia się w 23 z 47 ogłoszeń. Na rozmowie padają pytania o obsługę błędów, anulowanie żądań i CORS, bo to codzienność frontendu.

Opanowane 0 z 5 pytań

Co piszą w ogłoszeniach

Scena pierwsza · REST vs GraphQL

Kelner w restauracji

Chcesz zjeść obiad. Kelner REST przynosi gotowe zestawy z różnych okienek: zestaw „użytkownik”, zestaw „zamówienia”, zestaw „znajomi”. Każdy zestaw to osobny kurs do kuchni i zawsze cały talerz, nawet jak chciałeś tylko frytki. Kelner GraphQL bierze jedną kartkę, na której piszesz dokładnie, co chcesz, i przynosi wszystko za jednym razem. Zaznacz, czego potrzebuje ekran profilu.

REST

–

GraphQL

–

 

Zaznacz pola i kliknij „Zamów obiad”.

Scena druga · wyścig odpowiedzi

Kto przyszedł ostatni, ten wygrał?

Wpisujesz w wyszukiwarkę „kot”. Po każdej literce leci zapytanie: „k”, „ko”, „kot”. Kelnerzy wracają w różnej kolejności. Jeśli pokazujesz to, co przyszło ostatnie, możesz zobaczyć wyniki dla „ko” zamiast „kot”. Lekarstwo: gdy wysyłasz nowe zamówienie, odwołaj poprzednie (AbortController).

Wpisz „kot” bez odwoływania, a potem z odwoływaniem.

Porównajmy

REST czy GraphQL?

RESTGraphQL
Jak zamawiasz? Wybierasz okienko z gotowym zestawem.Zasób = URL: GET /users/1, /users/1/orders. Piszesz na kartce, co dokładnie chcesz.Jedno zapytanie z wybranymi polami do /graphql.
Ile kursów? Po jednym na każdy zestaw.Underfetching: kilka żądań, czasem jedno po drugim (waterfall). Jeden.Zagnieżdżone dane w jednej odpowiedzi.
Ile jedzenia na talerzu? Cały talerz, nawet jak chciałeś frytki.Overfetching: dużo nieużywanych pól. Tylko to, co napisałeś.Klient wybiera pola, schemat jest typowany.
Zapamiętywanie Łatwe: ten sam adres, ta sama odpowiedź.Cache HTTP, CDN, ETag działają od ręki. Trudniejsze: wszystko idzie jednym okienkiem.Cache po stronie klienta (Apollo, urql), persisted queries.
Kiedy wybrać? Proste zasoby, publiczne API, mocny cache.Większość CRUD-ów. Wiele ekranów potrzebuje różnych kawałków tych samych danych.Złożone, powiązane dane, wiele klientów (web, mobile).

Zestawy

REST: gotowe zestawy z różnych okienek. Prosto i łatwo zapamiętać.

Kartka

GraphQL: jedna kartka z dokładnym zamówieniem, jeden kurs kelnera.

Odwołaj

Nowe zamówienie? Odwołaj stare, zanim kelner przyniesie nie to, co trzeba.

Sprawdź się

Pytania z rozmów

Najpierw odpowiedz na głos, dopiero potem rozwiń odpowiedź.

  1. REST vs GraphQL: zalety, wady, kiedy który?

    Moja odpowiedź

    Zapisuje się samo w tej przeglądarce. Kopię zrobisz na stronie Notatki.

    Pokaż odpowiedź

    Dla przedszkolaka: REST to gotowe zestawy z różnych okienek. GraphQL to jedna kartka, na której piszesz dokładnie, co chcesz.

    Na rozmowę: REST: zasoby pod URL-ami, prosty, świetnie się cache’uje (HTTP, CDN), ale bywa over- i underfetching (kilka żądań, za dużo pól). GraphQL: jeden endpoint, klient wybiera pola, typowany schemat i introspekcja, mniej żądań przy złożonych, powiązanych danych. Kosztem jest trudniejszy cache (Apollo/urql normalizują), problem N+1 po stronie serwera, ochrona przed zbyt drogimi zapytaniami. REST do prostych CRUD-ów i publicznych API, GraphQL, gdy wiele ekranów lub klientów potrzebuje różnych kawałków tych samych danych.

    Umiem?
    Zapytaj Claude RozwińPrzepytaj mniePytania pogłębiające
  2. Jak obsługujesz błędy, timeouty i ponawianie żądań na froncie?

    Moja odpowiedź

    Zapisuje się samo w tej przeglądarce. Kopię zrobisz na stronie Notatki.

    Pokaż odpowiedź

    Dla przedszkolaka: Kelner może wrócić z pustymi rękami. Wtedy mówisz gościowi, co się stało, i czasem posyłasz kelnera jeszcze raz, ale nie w nieskończoność.

    Na rozmowę: fetch nie rzuca przy 4xx/5xx, więc sprawdzam response.ok i mapuję błędy na typy (sieć, 401 → wylogowanie lub odświeżenie tokenu, 404, 422 → błędy pól formularza, 5xx). Timeout przez AbortSignal.timeout(ms). Retry tylko dla błędów przejściowych (sieć, 502/503) i operacji idempotentnych, z exponential backoff i jitterem. W UI: stany loading/error/empty, komunikat z „Spróbuj ponownie”, error boundary dla nieoczekiwanych błędów, logowanie do Sentry. TanStack Query daje retry i stany z pudełka.

    Umiem?
    Zapytaj Claude RozwińPrzepytaj mniePytania pogłębiające
  3. Jak anulować żądanie, gdy użytkownik opuści stronę lub zmieni filtr? (AbortController, race conditions)

    Moja odpowiedź

    Zapisuje się samo w tej przeglądarce. Kopię zrobisz na stronie Notatki.

    Pokaż odpowiedź

    Dla przedszkolaka: Gdy zmieniasz zamówienie, odwołujesz poprzednie. Inaczej spóźniony kelner przyniesie stare danie i postawi je na Twoim nowym.

    Na rozmowę: Tworzę AbortController na żądanie i przekazuję signal do fetch, a w useEffect wywołuję controller.abort() w cleanupie. Wtedy zmiana filtra lub odmontowanie anuluje poprzednie żądanie i spóźniona odpowiedź nie nadpisze nowszej (race condition). AbortError ignoruję w obsłudze błędów. Alternatywy: flaga ignore w efekcie, TanStack Query (anulowanie po queryKey), switchMap w RxJS. W wyszukiwarce łączę to z debounce.

    Umiem?
    Zapytaj Claude RozwińPrzepytaj mniePytania pogłębiające
  4. Co to CORS i dlaczego przeglądarka blokuje żądanie, które działa w Postmanie?

    Moja odpowiedź

    Zapisuje się samo w tej przeglądarce. Kopię zrobisz na stronie Notatki.

    Pokaż odpowiedź

    Dla przedszkolaka: Przeglądarka to ostrożna mama: nie pozwoli Ci rozmawiać z obcą restauracją, dopóki ta nie powie, że Cię zna. Postman nie ma mamy.

    Na rozmowę: Same-origin policy blokuje odczyt odpowiedzi z innej domeny, portu albo protokołu. CORS to mechanizm, w którym serwer nagłówkami (Access-Control-Allow-Origin, -Methods, -Headers, -Credentials) mówi przeglądarce, komu wolno. Żądania „nieproste” (PUT, JSON, własne nagłówki) poprzedza preflight OPTIONS. Postman i curl nie są przeglądarką, więc nie stosują tej polityki. Naprawia się to na serwerze albo proxy (w dev np. proxy Vite), nigdy przez wyłączanie CORS w przeglądarce.

    Umiem?
    Zapytaj Claude RozwińPrzepytaj mniePytania pogłębiające
  5. Paginacja: offset vs cursor. Co wybierzesz do nieskończonego scrolla?

    Moja odpowiedź

    Zapisuje się samo w tej przeglądarce. Kopię zrobisz na stronie Notatki.

    Pokaż odpowiedź

    Dla przedszkolaka: Offset: „pokaż od 40. lizaka”. Gdy ktoś w tym czasie doda lizaka na początku, zobaczysz jednego dwa razy. Cursor: „pokaż lizaki po tym konkretnym lizaku”.

    Na rozmowę: Offset/limit jest prosty i pozwala skakać do strony N, ale przy zmieniających się danych dubluje lub gubi elementy, a duże offsety są wolne w bazie. Cursor (id lub timestamp ostatniego elementu, opaque token) jest stabilny przy wstawianiu i szybki, ale nie da się skoczyć na stronę 7. Do infinite scrolla wybieram cursor: useInfiniteQuery z getNextPageParam, IntersectionObserver na sentinelu, a przy długiej liście wirtualizacja.

    Umiem?
    Zapytaj Claude RozwińPrzepytaj mniePytania pogłębiające
Poziom wyżej

Wersja dla seniora

Tak wyglądają pytania na seniora i leada: nie ma jednej dobrej odpowiedzi, liczy się to, jak ważysz kompromisy i czy mówisz o skali, ryzyku i ludziach.

Przypadek 1

Aplikacja mobilna i web wołają 12 mikroserwisów bezpośrednio

Ekran zamówienia w webie i aplikacji mobilnej robi po 8 żądań do różnych mikroserwisów, część jedno po drugim. Na słabym internecie ładuje się 6 sekund. Backend nie chce zmieniać mikroserwisów pod potrzeby ekranów.

Zanim rozwiniesz: powiedz na głos, jak byś to rozwiązał, i nazwij co najmniej jeden kompromis.

Moje rozwiązanie

Zapisuje się samo w tej przeglądarce. Kopię zrobisz na stronie Notatki.

Pokaż, czego szuka rekruter, i modelową odpowiedź

Co sprawdza rekruter

  • Czy znasz wzorzec BFF i umiesz porównać go z GraphQL gateway
  • Czy liczysz koszt utrzymania i własność
  • Czy myślisz o bezpieczeństwie i cache

Odpowiedź seniora

Proponuję Backend for Frontend: cienką usługę (Node.js, często w rękach zespołu frontendowego), która dla ekranu zamówienia równolegle woła potrzebne mikroserwisy w sieci wewnętrznej i zwraca jedną odpowiedź dopasowaną do widoku. Klient robi jedno żądanie, waterfall znika, a dane wrażliwe i wewnętrzne adresy nie wychodzą do przeglądarki. Osobny BFF dla web i mobile, jeśli ich potrzeby się różnią.

Alternatywa to GraphQL gateway z federacją, który daje elastyczność wielu klientom, ale wymaga więcej inwestycji (schemat, ochrona przed drogimi zapytaniami, cache). Przy jednym-dwóch klientach i stabilnych ekranach BFF jest prostszy.

Koszty: kolejna usługa, więc on-call, monitoring (tracing z OpenTelemetry przez wszystkie wywołania), timeouty i częściowe odpowiedzi, gdy jeden mikroserwis nie działa. Mierzę czas ładowania ekranu przed i po.

Typowe wpadki

  • BFF jako miejsce na logikę biznesową, która powinna być w domenie
  • Jeden BFF dla wszystkich klientów, który rośnie w nowy monolit
  • Brak obsługi częściowej awarii

Dopytają o

  • Co zwróci BFF, gdy serwis rekomendacji nie odpowiada?
  • Jak wersjonujesz BFF względem aplikacji mobilnej w sklepie?
  • Kto jest właścicielem i kto ma dyżury?
Zapytaj Claude Rozwiń caseZagraj interviewera
Przypadek 2

Zmiana kontraktu API przy starych wersjach aplikacji mobilnej

Backend chce zmienić format adresu w odpowiedzi z jednego pola tekstowego na obiekt. Web wdraża się codziennie, ale 30% użytkowników ma aplikację mobilną sprzed pół roku. Ostatnia podobna zmiana wywaliła aplikację u tysięcy osób.

Zanim rozwiniesz: powiedz na głos, jak byś to rozwiązał, i nazwij co najmniej jeden kompromis.

Moje rozwiązanie

Zapisuje się samo w tej przeglądarce. Kopię zrobisz na stronie Notatki.

Pokaż, czego szuka rekruter, i modelową odpowiedź

Co sprawdza rekruter

  • Czy znasz zasady kompatybilności wstecz kontraktu
  • Czy umiesz zaplanować wersjonowanie i deprecjację
  • Czy wiesz, jak to wykryć automatycznie

Odpowiedź seniora

Zasada: zmiany addytywne są bezpieczne, usuwanie i zmiana typu pola nie. Dodaję nowe pole addressDetails obok starego address, klienci przechodzą na nowe, a stare usuwam dopiero, gdy telemetria pokaże, że nikt go nie używa (nagłówek z wersją aplikacji w każdym żądaniu). Klienci muszą tolerować nieznane pola i nowe wartości enumów.

Gdy zmiana musi być niekompatybilna, wersjonuję: /v2 w ścieżce lub nagłówek z wersją, z jasną datą wyłączenia v1, nagłówkami Deprecation i Sunset oraz minimalną wspieraną wersją aplikacji wymuszaną przy starcie (force update).

Automatyzacja: specyfikacja OpenAPI w repozytorium, sprawdzanie breaking changes w CI (oasdiff) i testy kontraktowe (Pact) między aplikacjami a API.

Typowe wpadki

  • Zmiana typu pola „bo web i tak się wdroży”
  • Wersjonowanie każdego endpointu przy każdej drobnej zmianie
  • Brak wiedzy, które wersje klientów są w użyciu

Dopytają o

  • Jak klient ma obsłużyć nieznaną wartość enuma?
  • Kiedy wymusić aktualizację aplikacji?
  • Jak zaplanujesz wyłączenie v1?
Zapytaj Claude Rozwiń caseZagraj interviewera
Przypadek 3

Burza ponowień po awarii, która dobiła backend

Na 5 minut padła usługa koszyka. Gdy wróciła, przez kolejne 20 minut nie mogła wstać, bo wszyscy klienci naraz ponawiali żądania co sekundę. Pojawiły się też odpowiedzi 429. Zespół backendu pyta, co frontend może zrobić inaczej.

Zanim rozwiniesz: powiedz na głos, jak byś to rozwiązał, i nazwij co najmniej jeden kompromis.

Moje rozwiązanie

Zapisuje się samo w tej przeglądarce. Kopię zrobisz na stronie Notatki.

Pokaż, czego szuka rekruter, i modelową odpowiedź

Co sprawdza rekruter

  • Czy znasz exponential backoff z jitterem i Retry-After
  • Czy rozumiesz, które żądania wolno ponawiać
  • Czy znasz circuit breaker po stronie klienta

Odpowiedź seniora

Problem to zsynchronizowane ponowienia (thundering herd). Klient ponawia tylko błędy przejściowe (sieć, 502, 503, 504, 429) i tylko operacje idempotentne albo z kluczem idempotencji. Odstęp rośnie wykładniczo z losowym jitterem (full jitter), z limitem prób. Przy 429 i 503 respektuję nagłówek Retry-After.

Dodaję prosty circuit breaker po stronie klienta: po serii porażek przestaję wysyłać żądania do tego zasobu na pewien czas i pokazuję stan „usługa chwilowo niedostępna” zamiast wiecznego spinnera. Polling i automatyczne odświeżanie wstrzymuję, gdy karta jest w tle (refetchOnWindowFocus i refetchInterval w TanStack Query z rozsądnymi wartościami).

Uzgadniam z backendem kontrakt: kody błędów, Retry-After i limity. Metryki po stronie klienta: liczba ponowień na użytkownika i odsetek otwartych circuit breakerów, z alertem.

Typowe wpadki

  • Retry co sekundę w nieskończoność
  • Ponawianie POST bez klucza idempotencji
  • Ukrywanie awarii pod spinnerem na minutę

Dopytają o

  • Jak zaimplementujesz to w TanStack Query?
  • Co z żądaniami w Service Workerze w tle?
  • Jak przetestujesz zachowanie przy 429?
Zapytaj Claude Rozwiń caseZagraj interviewera

Skróty klawiszowe

/
szukaj tematu
Enter
w wyszukiwarce: otwórz pierwszy wynik
N
notatki do tematu
[ ]
poprzedni / następny temat
G potem T
lista tematów
G potem P
powtórka
G potem N
wszystkie notatki
D
jasny / ciemny motyw
?
ta ściąga
Spacja, 1, 2, 3
w powtórce: pokaż, oceń

Pod każdym pytaniem są też skróty do Claude: rozwinięcie tematu, próbna rozmowa i ocena Twojej odpowiedzi z notatki.