{"id":22762,"date":"2023-07-24T05:00:00","date_gmt":"2023-07-24T03:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=22762"},"modified":"2026-05-07T13:52:16","modified_gmt":"2026-05-07T11:52:16","slug":"czym-jest-graphql-i-dlaczego-warto-z-niego-korzystac","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/czym-jest-graphql-i-dlaczego-warto-z-niego-korzystac\/","title":{"rendered":"Czym jest GraphQL i dlaczego warto z niego korzysta\u0107?"},"content":{"rendered":"\n<p>GraphQL to j\u0119zyk zapyta\u0144 do API, kt\u00f3ry pozwala nam na bardziej wydajne i elastyczne pobieranie danych.<\/p>\n\n\n\n<p>Zosta\u0142 stworzony przez developer\u00f3w Facebooka jako alternatywa dla REST API. Pocz\u0105tkowo my\u015blano, \u017ce koncepcja ta jest nierozerwalna z Reactem, poniewa\u017c na konferencjach narz\u0119dzia te by\u0142y prezentowane razem. Ale nie jest to prawd\u0105. <strong>GraphQL mo\u017cna u\u017cywa\u0107 z ka\u017cd\u0105 technologi\u0105 i frontendowym frameworkiem.<\/strong><\/p>\n\n\n\n<p>G\u0142\u00f3wnymi powodami, dla kt\u00f3rych Facebook zacz\u0105\u0142 tworzy\u0107 t\u0119 koncepcj\u0119, s\u0105 coraz cz\u0119stsze u\u017cycia urz\u0105dze\u0144 mobilnych, wykorzystywanie urz\u0105dze\u0144 o ma\u0142ej mocy IoT czy s\u0142abe sieci. GraphQL rozwi\u0105zuje te problemy, pozwalaj\u0105c na ograniczanie ilo\u015bci przesy\u0142anych danych do niezb\u0119dnego minimum.<\/p>\n\n\n\n<p>G\u0142\u00f3wnym za\u0142o\u017ceniem GraphQL jest deklaratywne pobieranie danych, gdzie to klient okre\u015bla, co dok\u0142adnie potrzebuje otrzyma\u0107 w odpowiedzi z API. Zamiast kilku enpoint\u00f3w, z kt\u00f3rych ka\u017cdy zwraca nam inne dane, wystarczy jeden endpoint, kt\u00f3ry w odpowiedzi <strong>zwraca dok\u0142adnie to, o co zosta\u0142 odpytany<\/strong>.<\/p>\n\n\n\n<p>Z dalszej cz\u0119\u015bci artyku\u0142u dowiesz si\u0119, kiedy wykorzystywa\u0107 GraphQL, a kiedy REST API oraz w czym GraphQL ma przewag\u0119.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>GraphQL vs REST API<\/strong><\/h2>\n\n\n\n<p>REST API jest od wielu lat najpopularniejszym sposobem pobierania danych z serwera, ale ma kilka wad, z kt\u00f3rymi pr\u00f3bowali sobie poradzi\u0107 tw\u00f3rcy j\u0119zyka GraphQL. Jedn\u0105 z nich jest niska elastyczno\u015b\u0107 narz\u0119dzia w momencie, kiedy zmieniaj\u0105 si\u0119 wymagania klienta. Trzeba w\u00f3wczas zmienia\u0107 API, dopisywa\u0107 nowe lub wersjonowa\u0107, je\u015bli zachodz\u0105 jakie\u015b znacz\u0105ce zmiany.<\/p>\n\n\n\n<p>GraphQL powsta\u0142 po to, aby poradzi\u0107 sobie z potrzeb\u0105 <strong>bardziej efektywnej wsp\u00f3\u0142pracy<\/strong> mi\u0119dzy klientem i serwerem. <\/p>\n\n\n\n<p>\u017beby zobrazowa\u0107 r\u00f3\u017cnic\u0119 mi\u0119dzy REST API a GraphQL, sp\u00f3jrzmy na kr\u00f3tki przyk\u0142ad. Niech to b\u0119dzie strona u\u017cytkownika na Facebooku, gdzie potrzebujemy wy\u015bwietli\u0107:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>imi\u0119 i nazwisko u\u017cytkownika,<\/li>\n\n\n\n<li>napisane przez niego posty<\/li>\n\n\n\n<li>jego trzech followers\u00f3w.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Jakby to wygl\u0105da\u0142o z u\u017cyciem REST API?<\/strong><\/h2>\n\n\n\n<p>\u017beby otrzyma\u0107 wy\u017cej opisany zestaw danych, serwer musia\u0142by udost\u0119pnia\u0107 3 r\u00f3\u017cne endpointy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pierwszy to <code>\/users\/id<\/code>, sk\u0105d mo\u017cemy otrzyma\u0107 dane u\u017cytkownika. Zwykle takie API zwr\u00f3ci nam wszystkie dane dotycz\u0105ce danej osoby, czyli du\u017co wi\u0119cej informacji ni\u017c jest wymagane.<\/li>\n\n\n\n<li>W dalszej kolejno\u015bci nale\u017ca\u0142oby wyci\u0105gn\u0105\u0107 dane na temat post\u00f3w opublikowanych przez u\u017cytkownika \u2013 <code>\/users\/id\/posts<\/code>. Je\u015bli takie API nie oferuje limitowania danych, zwr\u00f3cona zostanie lista wszystkich post\u00f3w, czyli zn\u00f3w za du\u017co danych wzgl\u0119dem tego, co przewiduje projekt.<\/li>\n\n\n\n<li>Kolejny endpoint to <code>\/users\/id\/followers<\/code> \u2013 po raz kolejny zderzamy si\u0119 z tym, \u017ce dostajemy mas\u0119 danych, kt\u00f3re s\u0105 zb\u0119dne, czyli list\u0119 wszystkich followers\u00f3w danego u\u017cytkownika.<\/li>\n<\/ul>\n\n\n\n<p>Oczywi\u015bcie, mo\u017cna zaprojektowa\u0107 API w taki spos\u00f3b, aby odpowiada\u0142o wymaganiom tej konkretnej podstrony, ale zwykle si\u0119 tego nie praktykuje. Je\u015bli API mia\u0142oby by\u0107 dostosowywane za ka\u017cdym razem, kiedy zmieni si\u0119 design aplikacji lub wymagania klienta, <strong>trwa\u0142oby to d\u0142ugo i ogranicza\u0142o szybko\u015b\u0107 dokonywania zmian w aplikacji. &nbsp;<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/07\/Przechwytywanie.jpg\"><img decoding=\"async\" width=\"729\" height=\"780\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/07\/Przechwytywanie.jpg\" alt=\"Przyk\u0142adowe wykorzystanie REST API\" class=\"wp-image-22763\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/07\/Przechwytywanie.jpg 729w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/07\/Przechwytywanie-280x300.jpg 280w\" sizes=\"(max-width: 729px) 100vw, 729px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 1 Przyk\u0142adowe wykorzystanie REST API<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Jak zrobi\u0107 to samo z u\u017cyciem GraphQL?<\/strong><\/h2>\n\n\n\n<p>Aby uzyska\u0107 ten sam efekt z u\u017cyciem GraphQL, <strong>wystarczy odwo\u0142a\u0107 si\u0119 tylko do jednego endpointa<\/strong>, kt\u00f3ry mo\u017cna odpyta\u0107 o wszystko, co serwer mo\u017ce zwr\u00f3ci\u0107. <\/p>\n\n\n\n<p>W praktyce wygl\u0105da to tak, \u017ce klient wysy\u0142a request za pomoc\u0105 metody POST, w kt\u00f3rego body znajduje si\u0119 zapytanie odzwierciedlaj\u0105ce zestaw danych, jaki ma by\u0107 zwr\u00f3cony z serwera. Pytaj\u0105c o dane usera o konkretnym ID, mo\u017cna ograniczy\u0107 odbierane dane do imienia i nazwiska, jednocze\u015bnie w tym samym zapytaniu wyci\u0105gaj\u0105c posty i 3 ostatnio dodanych followers\u00f3w. <\/p>\n\n\n\n<p>Kiedy serwer otrzymuje takie zapytanie, procesuje je i wyci\u0105ga z bazy tylko te dane, kt\u00f3re zosta\u0142y sprecyzowane w zapytaniu, a nast\u0119pnie zwraca je do klienta w postaci JSON-a.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/07\/2-2.jpg\"><img decoding=\"async\" width=\"851\" height=\"577\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/07\/2-2.jpg\" alt=\"Przyk\u0142adowe wykorzystanie GraphQL\" class=\"wp-image-22776\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/07\/2-2.jpg 851w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/07\/2-2-300x203.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/07\/2-2-768x521.jpg 768w\" sizes=\"(max-width: 851px) 100vw, 851px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 2 Przyk\u0142adowe wykorzystanie GraphQL<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przewaga GraphQL nad REST API<\/strong><\/h2>\n\n\n\n<p>Problemy, z jakimi rozprawia si\u0119 GraphQL, to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>z jednej strony <strong>overfetching<\/strong>, czyli zwracanie przez serwer zbyt du\u017cej ilo\u015bci danych, kt\u00f3re aktualnie nie s\u0105 do niczego potrzebne,<\/li>\n\n\n\n<li>jak r\u00f3wnie\u017c <strong>underfetching<\/strong>, czyli fakt, \u017ce serwer zwraca zbyt ma\u0142o danych i trzeba zwraca\u0107 si\u0119 do kilku endpoint\u00f3w, \u017ceby uzyska\u0107 wystarczaj\u0105ce informacje.<\/li>\n<\/ul>\n\n\n\n<p>I zn\u00f3w \u2013 w REST API mo\u017cna oczywi\u015bcie stworzy\u0107 endpoint, kt\u00f3ry zwr\u00f3ci dok\u0142adnie taki zestaw danych, jaki jest nam potrzebny i cz\u0119sto si\u0119 tak robi. <strong>Wad\u0105 takiego rozwi\u0105zania<\/strong> jest niemo\u017cno\u015b\u0107 dokonywania szybkich zmian na frontendzie. Zawsze potrzebna jest praca osoby z backendu, kt\u00f3ra poprawi, zmieni API, je\u015bli pojawi si\u0119 potrzeba nowego zestawu danych np.: do nowego widoku.<\/p>\n\n\n\n<p>W GraphQL <strong>ten problem nie istnieje<\/strong>. Zmiany na frontendzie mog\u0105 by\u0107 zrobione bez konieczno\u015bci jakiegokolwiek ingerowania w backend.<\/p>\n\n\n\n<p>Kolejn\u0105 zalet\u0105 GraphQL jest to, \u017ce <strong>ka\u017cdy request dok\u0142adnie okre\u015bla<\/strong>, jakich danych potrzebuje. Mo\u017cemy te requesty monitorowa\u0107 i np.: stwierdzi\u0107, kt\u00f3re dane nie s\u0105 u\u017cywane przez \u017cadnego klienta lub s\u0105 u\u017cywane sporadycznie i mo\u017cna je okre\u015bli\u0107 jako deprecated. <\/p>\n\n\n\n<p>Nast\u0119pna przewaga nad REST API to u\u017cycie <strong>silnego typowania danych<\/strong>. Wszystkie typy, kt\u00f3re s\u0105 widoczne w API, s\u0105 zapisane w schemacie danych przy u\u017cyciu tzw. schema definition language. Po ustaleniu schematu developerzy frontendu mog\u0105 ju\u017c mockowa\u0107 dane i nie ma potrzeby dalszej komunikacji mi\u0119dzy nimi a osobami tworz\u0105cymi backend.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Serwer GraphQL<\/strong><\/h2>\n\n\n\n<p>Tworzone po stronie serwera GraphQL Schema to najwa\u017cniejsza cz\u0119\u015b\u0107 pracy z GraphQL API, cz\u0119sto nazywana kontraktem mi\u0119dzy klientem i serwerem. Opisuje typy danych oraz mo\u017cliwo\u015bci API \u2013 to \u201ejak i co\u201d klient mo\u017ce uzyska\u0107 od serwera.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Schema<\/strong><\/h3>\n\n\n\n<p>GraphQL ma sw\u00f3j w\u0142asny syntax do definiowania schematu API i jest to Schema Definition Language.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ntype Post {\n    id: ID!\n    title: String!\n    author: User!\n}\n\ntype User {\n    id: ID!\n    name: String!\n    age: Int!\n    posts: &#x5B;Post!]!\n    followers: &#x5B;User]\n    photoUrl: String!\n}\n<\/pre><\/div>\n\n\n<p>W powy\u017cszym przyk\u0142adzie wida\u0107 <strong>definicj\u0119 dw\u00f3ch prostych typ\u00f3w: <code>User i Post<\/code><\/strong> oraz relacji jeden do wielu mi\u0119dzy typami. Typ <code>User<\/code> ma odwo\u0142anie do post\u00f3w \u2013 ka\u017cda osoba mo\u017ce mie\u0107 do siebie przypisan\u0105 list\u0119 post\u00f3w. W drug\u0105 stron\u0119 \u2013 <code>Post<\/code> mo\u017ce mie\u0107 jednego autora. Wykrzyknik umieszczony za typem pola oznacza, \u017ce warto\u015b\u0107 jest wymagana i nie mo\u017ce by\u0107 nullem. <\/p>\n\n\n\n<p>Opr\u00f3cz typ\u00f3w danych, osoba tworz\u0105ca serwer GraphQL musi zawsze doda\u0107 i opisa\u0107 typy <code>root<\/code> czyli <code>Query, Mutation i Subscription<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Query<\/strong><\/h3>\n\n\n\n<p>Pracuj\u0105c z REST API, dane pobierane s\u0105 z konkretnych endpoint\u00f3w, z kt\u00f3rych ka\u017cdy ma z g\u00f3ry zdefiniowan\u0105 struktur\u0119 danych, jak\u0105 zwraca. Czyli ju\u017c na poziomie URL do API okre\u015blone jest, co zostanie zwr\u00f3cone. <\/p>\n\n\n\n<p>W GraphQL podej\u015bcie jest zupe\u0142nie inne. Serwer GraphQL wystawia nam tylko jeden endpoint, w kt\u00f3rym nie ma z g\u00f3ry okre\u015blonej struktury zwracanych danych.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ntype Query {\n    allUsers(first: Int): &#x5B;User!]\n    user(id: ID!): User\n    allPosts: &#x5B;Post!]\n    post(id: ID!): Post\n}\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\"><strong>Mutation<\/strong><\/h3>\n\n\n\n<p>Do tworzenia, edycji lub usuwania danych GraphQL wykorzystuje tzw. mutacje. Struktura mutacji jest bardzo podobna do query.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ntype Mutation {\n    createUser(name: String!, age: Int!): User!\n    updateUser(id: ID!, name: String!, age: String!): User!\n    deleteUser(id: ID!): User!\n    createPost(title: String!): Post!\n    updatePost(id: ID!, title: String!): Post!\n    deletePost(id: ID!): Post!\n}\n<\/pre><\/div>\n\n\n<p>Znowu nale\u017cy u\u017cy\u0107 pola root \u2013 tutaj <code>createUser<\/code>. Pole <code>createUser<\/code> otrzymuje <strong>2 argumenty: <code>name<\/code> oraz <code>age<\/code> <\/strong>i zwraca obiekt nowo utworzonej warto\u015bci typu <code>User<\/code>. R\u00f3wnie dobrze <code>createUser<\/code> mog\u0142oby zwr\u00f3ci\u0107 tylko identyfikator nowo utworzonego rekordu lub jaki\u015b status i dane.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Subscription<\/strong><\/h3>\n\n\n\n<p>Trzeci typ zapyta\u0144 to subscription, czyli nas\u0142uchiwanie na zmiany. Subskrypcja u\u017cywana jest do po\u0142\u0105czenia z serwerem w czasie rzeczywistym, tak, \u017ceby aplikacja by\u0142a od razu informowana np. o utworzeniu nowego rekordu.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ntype Subscription {\n    newUser: User!\n    updatedUser: User!\n    deletedUser: User!\n    newPost: Post!\n    updatedPost: Post!\n    deletedPost: Post!\n}\n<\/pre><\/div>\n\n\n<p>Kiedy klient subskrybuje si\u0119 na event, wtedy inicjalizuje i utrzymuje sta\u0142e po\u0142\u0105czenie z serwerem. Zatem, kiedy dany event si\u0119 wydarzy, serwer wypycha dane do klienta.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Resolvers<\/strong><\/h3>\n\n\n\n<p>Kiedy do serwera GraphQL trafia zapytanie, jest ono przechwytywane przez resolvery, czyli <strong>funkcje dostarczaj\u0105ce dane.<\/strong> <\/p>\n\n\n\n<p>W implementacji serwera ka\u017cde z p\u00f3l odwo\u0142uje si\u0119 do dedykowanego resolvera. Oznacza to, \u017ce ka\u017cdy z typ\u00f3w zawartych w schema ma zdefiniowane pola, kt\u00f3re nale\u017cy obs\u0142u\u017cy\u0107 za pomoc\u0105 resolver\u00f3w. Resolver zawiera typy odzwierciedlaj\u0105ce schema i pod ka\u017cdy klucz z danego typu tworzy funkcj\u0119, kt\u00f3ra b\u0119dzie zwraca\u0142a dane dla tego typu. <\/p>\n\n\n\n<p>Serwery GraphQL maj\u0105 pewne resolvery domy\u015blne. Potrafi\u0105 obs\u0142ugiwa\u0107 r\u00f3\u017cne typy danych takie jak stringi, liczby, obiekty i tablice.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nconst resolvers = {\n  Query: {\n    allUsers: () =&gt; usersList,\n    user: (parent, args, context, info) =&gt; usersList.find((user) =&gt; user.id == args.id),\n    allPosts: () =&gt; postsList,\n    post: (parent, args, context, info) =&gt; usersList.find((post) =&gt; post.id == args.id),\n  },\n  Mutation: {\n    createUser: (parent, args, context, info) =&gt; {\n      const newUser = {\n        id: usersList.length + 1,\n        name: args.name,\n        age: args.age,\n      };\n      usersList.push(newUser);\n      return newUser;\n    },\n    \u2026\n  },\n  Post: {\n    title: (parent, args, context, info) =&gt; parent.title,\n    author: (parent, args, context, info) =&gt; usersList.find((user) =&gt; user.id == parent.author_id),\n  },\n  User: {\n    \u2026,\n    posts: (parent, args, context, info) =&gt; postsList.filter((post) =&gt; post.author_id == parent.id),\n  },\n};\n<\/pre><\/div>\n\n\n<p>Funkcja resolvera przyjmuje 4 argumenty (<code>parent, args, context i info<\/code>), o kt\u00f3rych wi\u0119cej poni\u017cej:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>parent<\/code> \u2013 to obiekt rodzica, czyli obiekt, kt\u00f3ry by\u0142 dostarczony poziom wy\u017cej np.: dla resolvera <code>author<\/code> w polu <code>parent<\/code> przekazany b\u0119dzie <code>Post<\/code>,<\/li>\n\n\n\n<li><code>args<\/code> \u2013 to argumenty przekazane do resolvera, np.: szukane ID,<\/li>\n\n\n\n<li>context \u2013 to obiekt wsp\u00f3\u0142dzielony mi\u0119dzy wszystkimi resolverami. Zawiera min..: informacje o autentykacji,<\/li>\n\n\n\n<li>info \u2013 trzyma informacje dotycz\u0105ce zapytania.<\/li>\n<\/ul>\n\n\n<div class=\"nsw-o-blogersii-banner\">\n            <picture>\n            <source srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-Digital-Desktop_.jpg\" media=\"(min-width: 992px)\" >\n            <source srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-Digital-Mob_.jpg\" media=\"(min-width: 300px)\" >            <img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-Digital-Desktop_.jpg\" alt=\"\"  class=\"\"  >\n        <\/picture>\n        <div class=\"cnt\">\n                    <div class=\"nsw-m-title-block -h3 -invert  -has-title-margin-bottom-0 -has-title-font-weight-bold\">\n                                <h2 class=\"nsw-m-title-block__title\">Digital<\/h2>\n                <\/div>\n                            <p class=\"has-nsw-p-4-font-size has-invert-color\">\n                Zwi\u0119ksz zysk i poszerzaj grono zadowolonych klient\u00f3w dzi\u0119ki naszym us\u0142ugom in\u017cynierii oprogramowania, e-commerce, mobile i digital customer experience.\n            <\/p>\n                            <a  href=\"https:\/\/sii.pl\/oferta\/digital\/\" class=\"nsw-a-button -ghost -banner-button\"   >\n        <span>Oferta Digital<\/span>\n    <\/a>\n            <\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Kiedy GraphQL, a kiedy REST API?<\/strong><\/h2>\n\n\n\n<p>Okazuje si\u0119, \u017ce te dwie metody nie musz\u0105 dzia\u0142a\u0107 osobno i <strong>mog\u0105 z powodzeniem ze sob\u0105 wsp\u00f3\u0142istnie\u0107<\/strong>. Wiele system\u00f3w dzia\u0142a tak, \u017ce po stronie klienta np.: na urz\u0105dzeniu IoT, aplikacji mobilnej czy webowej, dzia\u0142a GraphQL i tu konstruowane s\u0105 zapytania GraphQL. Dane te s\u0105 przesy\u0142ane do resolvera na serwerze GraphQL, a resolver odpytuje np.: mikroserwisy ju\u017c z u\u017cyciem REST API.<\/p>\n\n\n\n<p>GraphQL <strong>lepiej sprawdzi si\u0119<\/strong> w aplikacji, kt\u00f3ra potrzebuje r\u00f3\u017cnych danych na ka\u017cdej ze stron. Natomiast, je\u015bli s\u0105 to du\u017ce ilo\u015bci danych, <strong>lepiej u\u017cy\u0107 REST API<\/strong>, poniewa\u017c zbyt skomplikowane zapytania do GraphQL mog\u0105 si\u0119 okaza\u0107 wolniejsze ni\u017c zapytania do kilku REST-owych endpoint\u00f3w. Nie podlega te\u017c dyskusji fakt, \u017ce <strong>REST API buduje si\u0119 szybciej i \u0142atwiej<\/strong>, dlatego dla ma\u0142ych aplikacji nie ma sensu budowa\u0107 serwera GraphQL.<\/p>\n\n\n\n<p>Zdarzaj\u0105 si\u0119 r\u00f3wnie\u017c konkretne przypadki, w kt\u00f3rych <strong>konieczne b\u0119dzie zrezygnowanie z GraphQL<\/strong>. Ograniczeniem jest fakt, \u017ce GraphQL nie poradzi sobie z zagnie\u017cd\u017ceniem zapyta\u0144, kt\u00f3rych g\u0142\u0119boko\u015bci nie mo\u017cna okre\u015bli\u0107 np.: menu i podmenu, gdzie ka\u017cdy element podmenu mo\u017ce mie\u0107 kolejne podmenu. Klient nie jest w stanie stwierdzi\u0107, jaki jest poziom zagnie\u017cd\u017ce\u0144, dlatego nie mo\u017ce jednoznacznie okre\u015bli\u0107 budowy zapytania.<\/p>\n\n\n\n<p>Ci\u0119\u017cko jednoznacznie okre\u015bli\u0107, czy GraphQL jest lepszy i czy mo\u017ce wyprze\u0107 REST API, jednak <strong>pewne jest<\/strong>, \u017ce obie technologie mog\u0105 z powodzeniem wsp\u00f3\u0142gra\u0107 i wsp\u00f3\u0142pracowa\u0107 ze sob\u0105, a ka\u017cda z nich mo\u017ce sprawdzi\u0107 si\u0119 lepiej w konkretnych przypadkach u\u017cycia.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli interesuje Was temat REST API, zach\u0119camy do zerkni\u0119cia r\u00f3wnie\u017c <a href=\"https:\/\/sii.pl\/blog\/wyszukiwarka\/rest%20api\/\" target=\"_blank\" aria-label=\"do innych artyku\u0142\u00f3w naszych ekspert\u00f3w.  (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">do innych artyku\u0142\u00f3w naszych ekspert\u00f3w. <\/a><\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;22762&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;7&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;2&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;Czym jest GraphQL i dlaczego warto z niego korzysta\u0107?&quot;,&quot;width&quot;:&quot;159&quot;,&quot;_legend&quot;:&quot;{score}\\\/5&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 159px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            5\/5    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>GraphQL to j\u0119zyk zapyta\u0144 do API, kt\u00f3ry pozwala nam na bardziej wydajne i elastyczne pobieranie danych. Zosta\u0142 stworzony przez developer\u00f3w &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/czym-jest-graphql-i-dlaczego-warto-z-niego-korzystac\/\">Continued<\/a><\/p>\n","protected":false},"author":542,"featured_media":22774,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[2427,1753,1554,1546,956],"class_list":["post-22762","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-digital","tag-graphql","tag-zalety-i-wady","tag-przeglad-narzedzi","tag-rest-api"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/07\/Czym-jest-GraphQL-i-dlaczego-warto-z-niego-korzystac.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/22762"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/542"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=22762"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/22762\/revisions"}],"predecessor-version":[{"id":33816,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/22762\/revisions\/33816"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/22774"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=22762"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=22762"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=22762"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}