{"id":3880,"date":"2024-04-24T09:38:52","date_gmt":"2024-04-24T07:38:52","guid":{"rendered":"https:\/\/staging.qtravel.ai\/?p=3880"},"modified":"2024-04-25T10:27:20","modified_gmt":"2024-04-25T08:27:20","slug":"co-to-jest-graphql-i-dlaczego-warto-go-uzywac","status":"publish","type":"post","link":"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/","title":{"rendered":"Co to jest GraphQL i dlaczego warto go u\u017cywa\u0107?"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Nasza wyszukiwarka Qtravel Search udost\u0119pnia wszystkie funkcjonalno\u015bci wyszukiwania i prezentacji ofert turystycznych w postaci interfejsu programowania aplikacji API opartego na j\u0119zyku zapyta\u0144 GraphQL. Technologia ta zapewnia programistom zaawansowany zestaw narz\u0119dzi do tworzenia najwy\u017cszej jako\u015bci do\u015bwiadcze\u0144 zwi\u0105zanych z wyszukiwaniem w bran\u017cy turystycznej.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">W niniejszym artykule przyjrzymy si\u0119, czym jest GraphQL, dlaczego zdoby\u0142 du\u017c\u0105 popularno\u015b\u0107 w \u015brodowisku informatycznym, czym si\u0119 r\u00f3\u017cni od interfejs\u00f3w REST API i jak\u0105 ma nad nimi przewag\u0119. Poka\u017cemy te\u017c, jak korzysta\u0107\u00a0 z GraphQL na przyk\u0142adzie API naszej wyszukiwarki Qtravel Search.\u00a0<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Czym jest GraphQL?<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">GraphQL to j\u0119zyk zapyta\u0144 i manipulacji danych oraz \u015brodowisko uruchomieniowe po stronie serwera dla interfejs\u00f3w programowania aplikacji (APIs). <\/span><span style=\"font-weight: 400;\">GraphQL, podobnie jak standard XML czy SQL<\/span>\u00a0<a href=\"https:\/\/spec.graphql.org\/\"> <span style=\"font-weight: 400;\">posiada formaln\u0105 specyfikacj\u0119<\/span><\/a><span style=\"font-weight: 400;\">, kt\u00f3ra opisuje j\u0119zyk i gramatyk\u0119 u\u017cywane do definiowania zapyta\u0144, system typ\u00f3w i silnik wykonawczy. Jest to jedna z najwa\u017cniejszych cech odr\u00f3\u017cniaj\u0105cych GraphQL od powszechnie u\u017cywanego interfejsu komunikacji mi\u0119dzy aplikacjami w architekturze mikrous\u0142ug &#8211; REST API, kt\u00f3ry formalnej specyfikacji nie posiada. <\/span><span style=\"font-weight: 400;\">Zamiast wielu endpoint\u00f3w, kt\u00f3re zwracaj\u0105 oddzielne dane, serwer GraphQL udost\u0119pnia pojedynczy endpoint <\/span><span style=\"font-weight: 400;\"><code>\/graphql<\/code><\/span><span style=\"font-weight: 400;\"> i odpowiada dok\u0142adnie na zapytanie klienta. Poniewa\u017c serwer GraphQL mo\u017ce pobiera\u0107 dane z r\u00f3\u017cnych \u017ar\u00f3de\u0142 i prezentowa\u0107 je w jednym wsp\u00f3lnym grafie, nie jest zwi\u0105zany z konkretn\u0105 baz\u0105 danych.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Przyk\u0142adowe zapytanie GraphQL<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Przyk\u0142adowe zapytanie GraphQL mo\u017ce wygl\u0105da\u0107 nast\u0119puj\u0105co (na podstawie API naszej us\u0142ugi Qtravel Search):<\/span><\/p>\n<figure id=\"attachment_3939\" aria-describedby=\"caption-attachment-3939\" style=\"width: 1071px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytania-graphql.png\" alt=\"\" width=\"1071\" height=\"697\" class=\"size-full wp-image-3939\" srcset=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytania-graphql.png 1071w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytania-graphql-300x195.png 300w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytania-graphql-1024x666.png 1024w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytania-graphql-768x500.png 768w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytania-graphql-208x135.png 208w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytania-graphql-519x338.png 519w\" sizes=\"(max-width: 1071px) 100vw, 1071px\" \/><figcaption id=\"caption-attachment-3939\" class=\"wp-caption-text\">Przyk\u0142adowe zapytanie GraphQL<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">Serwer GraphQL na powy\u017csze zapytanie zwr\u00f3ci odpowied\u017a w postaci:<\/span><\/p>\n<figure id=\"attachment_3937\" aria-describedby=\"caption-attachment-3937\" style=\"width: 1053px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-odpowiedzi-na-zapytanie-graphql-zbiorcze.png\" alt=\"\" width=\"1053\" height=\"961\" class=\"size-full wp-image-3937\" srcset=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-odpowiedzi-na-zapytanie-graphql-zbiorcze.png 1053w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-odpowiedzi-na-zapytanie-graphql-zbiorcze-300x274.png 300w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-odpowiedzi-na-zapytanie-graphql-zbiorcze-1024x935.png 1024w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-odpowiedzi-na-zapytanie-graphql-zbiorcze-768x701.png 768w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-odpowiedzi-na-zapytanie-graphql-zbiorcze-208x190.png 208w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-odpowiedzi-na-zapytanie-graphql-zbiorcze-370x338.png 370w\" sizes=\"(max-width: 1053px) 100vw, 1053px\" \/><figcaption id=\"caption-attachment-3937\" class=\"wp-caption-text\">Przyk\u0142ad odpowiedzi na zapytanie GraphQL<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">Zwr\u00f3cone dane zostan\u0105 nast\u0119pnie wykorzystane do wy\u015bwietlenia szczeg\u00f3\u0142\u00f3w oferty turystycznej na stronie internetowej.<\/span><\/p>\n<figure id=\"attachment_3890\" aria-describedby=\"caption-attachment-3890\" style=\"width: 939px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/Zrzut-ekranu-2024-04-24-o-10.54.09.png\" alt=\"\" width=\"939\" height=\"1108\" class=\"size-full wp-image-3890\" srcset=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/Zrzut-ekranu-2024-04-24-o-10.54.09.png 939w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/Zrzut-ekranu-2024-04-24-o-10.54.09-254x300.png 254w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/Zrzut-ekranu-2024-04-24-o-10.54.09-868x1024.png 868w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/Zrzut-ekranu-2024-04-24-o-10.54.09-768x906.png 768w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/Zrzut-ekranu-2024-04-24-o-10.54.09-176x208.png 176w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/Zrzut-ekranu-2024-04-24-o-10.54.09-286x338.png 286w\" sizes=\"(max-width: 939px) 100vw, 939px\" \/><figcaption id=\"caption-attachment-3890\" class=\"wp-caption-text\">Rysunek 1: Przyk\u0142ad wy\u015bwietlenia szczeg\u00f3\u0142\u00f3w oferty na stronie internetowej.<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">W powy\u017cszym przyk\u0142adzie wykorzystali\u015bmy jeden z typ\u00f3w operacji dost\u0119pny w GraphQL- <\/span><span style=\"font-weight: 400;\">query, <\/span><span style=\"font-weight: 400;\">kt\u00f3ry s\u0142u\u017cy do pobierania danych. Dwa pozosta\u0142e, kt\u00f3re om\u00f3wimy w dalszej cz\u0119\u015bci artyku\u0142u to:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>mutation<\/b><span style=\"font-weight: 400;\"> &#8211; s\u0142u\u017cy do modyfikowania danych (wykonywania operacji <\/span><i><span style=\"font-weight: 400;\">Create, Update, Delete<\/span><\/i><span style=\"font-weight: 400;\">)<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><b>subscription<\/b><span style=\"font-weight: 400;\">\u00a0 &#8211; s\u0142u\u017cy do informowania o zmianach w danych.<\/span><\/li>\n<\/ul>\n<h2>Dlaczego powsta\u0142 GraphQL?<\/h2>\n<p><span style=\"font-weight: 400;\">Zanim przejdziemy do szczeg\u00f3\u0142owego om\u00f3wienia GraphQL, prze\u015bled\u017amy pokr\u00f3tce histori\u0119 jego powstania, gdy\u017c jest ona bardzo interesuj\u0105ca. GraphQL nie powsta\u0142 w zakamarkach organizacji standaryzacyjnych, kt\u00f3re opracowuj\u0105 standardy (np.: sieci komputerowych), wdra\u017cane nast\u0119pnie przez producent\u00f3w. GraphQL by\u0142 odpowiedzi\u0105 Facebooka na rosn\u0105cy problem developer\u00f3w firmy z interfejsami REST API, kt\u00f3remu przyjrzymy si\u0119 bli\u017cej w dalszej cz\u0119\u015bci artyku\u0142u. Prace nad GraphQL in\u017cynierowie Facebooka rozpocz\u0119li ju\u017c w 2012 roku, ale dopiero w 2015 roku opublikowali oficjaln\u0105 <\/span><a href=\"https:\/\/legacy.reactjs.org\/blog\/2015\/05\/01\/graphql-introduction.html\"><span style=\"font-weight: 400;\">publiczn\u0105 specyfikacj\u0119 GraphQL<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Problem ze standardem REST API dotyczy\u0142 nie tylko Facebooka, ale wielu innych firm technologicznych dzia\u0142aj\u0105cych na du\u017c\u0105 skal\u0119 (np: Airbnb, Twitter), kt\u00f3re korzysta\u0142y z architektury REST API.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Interfejsy REST API s\u0105 do tej pory niezwykle popularne. Dzi\u0119ki nim mo\u017cliwe jest odseparowanie warstwy backend od warstwy frontend (interfejsu graficznego) aplikacji. Komunikacja mi\u0119dzy tymi warstwami odbywa si\u0119 za pomoc\u0105 API, kt\u00f3ry \u0142\u0105czy je w jedn\u0105 ca\u0142o\u015b\u0107.\u00a0 Odseparowanie warstw ma szczeg\u00f3lne znaczenie w coraz to szybciej rozwijaj\u0105cych si\u0119 bran\u017cach e-commerce i e-travel, w kt\u00f3rych do\u015bwiadczenia u\u017cytkownika oraz interfejs strony internetowej czy aplikacji mobilnej decyduj\u0105 o decyzjach zakupowych klient\u00f3w.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">REST API, pomimo popularno\u015bci i \u0142atwo\u015bci implementacji, ma swoje ograniczenia, kt\u00f3re szczeg\u00f3lnie dotycz\u0105 warstwy frontendowej. Im wi\u0119cej klient\u00f3w na stronach internetowych, tym wi\u0119cej &#8222;dzieje si\u0119&#8221; w warstwie frontendu i tym wi\u0119cej przetwarzania danych pobieranych za pomoc\u0105 API. Problem w tym, \u017ce frontend programi\u015bci najcz\u0119\u015bciej nie maj\u0105 wp\u0142ywu na to, jakie dane s\u0105 zwracane przez interfejs API (tzw. <\/span><i><span style=\"font-weight: 400;\">overfetching<\/span><\/i><span style=\"font-weight: 400;\">), a cz\u0119sto aby wy\u015bwietli\u0107 wszystkie niezb\u0119dne informacje na stronie musz\u0105 odpyta\u0107 kilka interfejs\u00f3w API po kolei (tzw. <\/span><i><span style=\"font-weight: 400;\">underfetching<\/span><\/i><span style=\"font-weight: 400;\">).\u00a0<\/span><\/p>\n<h2>Por\u00f3wnanie GraphQL i REST API<\/h2>\n<h3><span style=\"font-weight: 400;\">Dane<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Jednym z najcz\u0119stszych problem\u00f3w zwi\u0105zanych z REST API jest nadmiarowe lub niewystarczaj\u0105ce pobieranie danych, o kt\u00f3rym wspominali\u015bmy wy\u017cej. To zjawisko wyst\u0119puje, poniewa\u017c jedynym sposobem na pobranie danych jest korzystanie z tzw. <\/span><span style=\"font-weight: 400;\">endpoint\u00f3w<\/span><span style=\"font-weight: 400;\">, kt\u00f3re zwracaj\u0105 z g\u00f3ry okre\u015blone struktury danych. Projektowanie API w taki spos\u00f3b, aby dostarcza\u0142o dok\u0142adnie te dane, kt\u00f3rych akurat w tym przypadku potrzebujemy, jest bardzo trudne w rozwoju i utrzymaniu.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Overfetching<\/span><span style=\"font-weight: 400;\"> &#8211; Pobieranie zb\u0119dnych danych<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Nadmiarowe pobieranie danych (<\/span><i><span style=\"font-weight: 400;\">overfetching<\/span><\/i><span style=\"font-weight: 400;\">) oznacza &#8211; jak sama nazwa wskazuje &#8211; \u017ce pobieramy wi\u0119cej informacji, ni\u017c jest nam faktycznie potrzebne.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Na przyk\u0142ad, je\u015bli w aplikacji chcemy wy\u015bwietli\u0107 list\u0119 wycieczek tylko z ich nazwami oraz cenami, to w REST API musieliby\u015bmy odpyta\u0107\u00a0endpoint <\/span><span style=\"font-weight: 400;\"><code>\/tours<\/code><\/span><span style=\"font-weight: 400;\"> i otrzyma\u0107 tablic\u0119 JSON z danymi wycieczek. Jednak taka odpowied\u017a mo\u017ce zawiera\u0107 dodatkowe informacje o wycieczkach, takie jak zakwaterowanie, wy\u017cywienie czy atrakcje &#8211; informacje, kt\u00f3re s\u0105 dla nas zb\u0119dne.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Underfetching<\/span><span style=\"font-weight: 400;\"> &#8211; Problem n+1 zapyta\u0144<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Innym problemem jest sytuacja, kiedy nasze konkretne zapytanie nie dostarcza nam wszystkich potrzebnych informacji. W tym wypadku, jeste\u015bmy zmuszeni wysy\u0142a\u0107 dodatkowe zapytania, aby uzyska\u0107 to, czego potrzebujemy.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Jako przyk\u0142adu, mo\u017cemy u\u017cy\u0107 poprzedniej aplikacji, ale tym razem chcemy wy\u015bwietla\u0107\u00a0po jednym terminie dla ka\u017cdej wycieczki. Dodatkowo API udost\u0119pnia nam endpoint <\/span><span style=\"font-weight: 400;\"><code>\/tours\/id\/terms<\/code><\/span><span style=\"font-weight: 400;\">. A wi\u0119c aby wy\u015bwietli\u0107 te informacje, musimy wys\u0142a\u0107 zapytanie do <\/span><span style=\"font-weight: 400;\"><code>\/tours<\/code><\/span><span style=\"font-weight: 400;\">, a nast\u0119pnie dla ka\u017cdej wycieczki odpyta\u0107 <code>\/tours\/id\/terms<\/code><\/span><span style=\"font-weight: 400;\">\u00a0o konkretne terminy (gdzie w tym przypadku pojawi si\u0119 overfetching, poniewa\u017c potrzebujemy jedynie pierwszego terminu). Jeste\u015bmy wi\u0119c zmuszeni wys\u0142a\u0107 zapytanie, a nast\u0119pnie <\/span><i><span style=\"font-weight: 400;\">n<\/span><\/i><span style=\"font-weight: 400;\"> kolejnych zapyta\u0144 &#8211; st\u0105d nazwa samego problemu: <\/span><b>n+1 zapyta\u0144<\/b><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">A jak to robi GraphQL?<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">W przypadku GraphQL wystarczy wys\u0142a\u0107 pojedyncze zapytanie do serwera, w kt\u00f3rym precyzyjnie okre\u015blamy, jakie dane s\u0105 potrzebne. Dzi\u0119ki temu, \u017ce jest on silnie typowany, zawsze mamy gwarancj\u0119, \u017ce w otrzymanym obiekcie JSON otrzymamy oczekiwane dane. Dodatkowo dzi\u0119ki zagnie\u017cd\u017conej strukturze zapytania wszystkie dane u\u0142o\u017cone s\u0105 jak w wys\u0142anym zapytaniu.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Przyk\u0142adowo, dla naszego problemu mo\u017cemy wys\u0142a\u0107 zapytanie:<\/span><\/p>\n<figure id=\"attachment_3941\" aria-describedby=\"caption-attachment-3941\" style=\"width: 1028px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytanie-graphql-tours.png\" alt=\"\" width=\"1028\" height=\"282\" class=\"wp-image-3941 size-full\" srcset=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytanie-graphql-tours.png 1028w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytanie-graphql-tours-300x82.png 300w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytanie-graphql-tours-1024x281.png 1024w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytanie-graphql-tours-768x211.png 768w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytanie-graphql-tours-208x57.png 208w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytanie-graphql-tours-870x239.png 870w\" sizes=\"(max-width: 1028px) 100vw, 1028px\" \/><figcaption id=\"caption-attachment-3941\" class=\"wp-caption-text\">Przyk\u0142adowe zapytanie GraphQL<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">Dzi\u0119ki temu nie ma ju\u017c problemu nadmiarowych lub niewystarczaj\u0105cych danych, a my otrzymujemy dok\u0142adnie to, czego potrzebujemy.<\/span><\/p>\n<figure id=\"attachment_3894\" aria-describedby=\"caption-attachment-3894\" style=\"width: 1138px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/jak-dziala-graphQL-API.png\" alt=\"\" width=\"1138\" height=\"903\" class=\"size-full wp-image-3894\" srcset=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/jak-dziala-graphQL-API.png 1138w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/jak-dziala-graphQL-API-300x238.png 300w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/jak-dziala-graphQL-API-1024x813.png 1024w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/jak-dziala-graphQL-API-768x609.png 768w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/jak-dziala-graphQL-API-208x165.png 208w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/jak-dziala-graphQL-API-426x338.png 426w\" sizes=\"(max-width: 1138px) 100vw, 1138px\" \/><figcaption id=\"caption-attachment-3894\" class=\"wp-caption-text\">Rysunek 2: Por\u00f3wnanie GraphQL i REST API<\/figcaption><\/figure>\n<h2><span style=\"font-weight: 400;\">Rozw\u00f3j<\/span><\/h2>\n<h3><span style=\"font-weight: 400;\">Integracje z frontendem<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">GraphQL zosta\u0142 zaprojektowany tak, aby doskonale wsp\u00f3\u0142pracowa\u0107 z frameworkami frontendowymi, takimi jak <\/span><a href=\"https:\/\/react.dev\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">React<\/span><\/a><span style=\"font-weight: 400;\"> i <\/span><a href=\"https:\/\/vuejs.org\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Vue<\/span><\/a><span style=\"font-weight: 400;\">, co u\u0142atwia budowanie nowoczesnych, interaktywnych aplikacji internetowych. GraphQL posiada dedykowane biblioteki i narz\u0119dzia, kt\u00f3re umo\u017cliwiaj\u0105 p\u0142ynn\u0105 integracj\u0119.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Cho\u0107 REST mo\u017ce by\u0107 u\u017cywany z frameworkami frontendowymi, integracja mo\u017ce wymaga\u0107 wi\u0119cej pracy manualnej i niestandardowych implementacji. Pomimo istnienia bibliotek innych firm, REST nie zapewnia standaryzowanego sposobu integracji z konkretnymi frameworkami frontendowymi, takimi jak React czy Vue.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Wersjonowanie<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">GraphQL ma przewag\u0119, je\u015bli chodzi o wersjonowanie, poniewa\u017c umo\u017cliwia oznaczanie p\u00f3l, kt\u00f3re zostan\u0105 usuni\u0119te, co daje developerom po stronie klienta czas na dostosowanie si\u0119.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">W przypadku REST, to developerzy musz\u0105 zadba\u0107 o to, aby u\u017cywali poprawnej wersji interfejsu API.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Praca programistyczna<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">GraphQL z natury bardzo dobrze si\u0119\u00a0opisuje podczas tworzenia jego sk\u0142adni, przez co redukuje potrzeb\u0119 obszernych dokumentacji i sprzyja lepszemu zrozumieniu modelu danych. Silnie typowany schemat i walidacja zapyta\u0144 pozwalaj\u0105 na szybsze zrozumienie i jednoczesne wczesne wykrywanie b\u0142\u0119d\u00f3w. Przez to, \u017ce GraphQL posiada intuicyjny j\u0119zyk zapyta\u0144, u\u0142atwia on wprowadzanie nowych cz\u0142onk\u00f3w zespo\u0142u i transfer wiedzy w zespole programistycznym.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Interfejsy API REST zazwyczaj polegaj\u0105 na nieformalnej dokumentacji lub konwencjach r\u00f3\u017cni\u0105cych si\u0119 w r\u00f3\u017cnych implementacjach. Brak wsp\u00f3lnego zrozumienia prowadzi do niekonsekwencji i luk w wiedzy w zespo\u0142ach. To zmusza developer\u00f3w, kt\u00f3rzy s\u0105 d\u0142u\u017cej w zespole, do po\u015bwi\u0119cania cennego czasu na edukacj\u0119 nowych cz\u0142onk\u00f3w zespo\u0142u zamiast skupiania si\u0119 na problemach biznesowych.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Schemat w GraphQL<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">GraphQL wspiera odczytywanie, zapisywanie (mutacje) i subskrybowanie zmian danych (aktualizacje w czasie rzeczywistym \u2013 zwykle realizowane za pomoc\u0105 WebSockets).\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Us\u0142ug\u0119 GraphQL tworzymy poprzez definiowanie typ\u00f3w z polami, a nast\u0119pnie dostarczanie konkretnych funkcji do uzyskiwania danych dla ka\u017cdego z tych p\u00f3l. Typy i pola stanowi\u0105 to, co nazywa si\u0119 definicj\u0105 schematu. Funkcje, kt\u00f3re pobieraj\u0105 i mapuj\u0105 dane, nazywane s\u0105 <\/span><i><span style=\"font-weight: 400;\">resolverami<\/span><\/i><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Po sprawdzeniu zgodno\u015bci z schematem, zapytanie GraphQL jest wykonywane przez serwer. Serwer zwraca wynik, kt\u00f3ry odzwierciedla kszta\u0142t pierwotnego zapytania, zwykle w formacie JSON.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Typy<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Korze\u0144 schematu GraphQL, domy\u015blnie zwanego zapytaniem (Query), zawiera wszystkie pola, o kt\u00f3re mo\u017cemy zapyta\u0107. Inne typy definiuj\u0105 obiekty i pola, kt\u00f3re serwer GraphQL mo\u017ce zwr\u00f3ci\u0107. Istnieje kilka podstawowych typ\u00f3w, nazywanych skalarami, kt\u00f3re reprezentuj\u0105 takie rzeczy jak ci\u0105gi znak\u00f3w, liczby i identyfikatory.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Pola s\u0105 domy\u015blnie definiowane jako opcjonalne, a znak wykrzyknika na ko\u0144cu mo\u017cna u\u017cy\u0107, aby oznaczy\u0107 pole jako wymagane. Pole mo\u017ce by\u0107 zdefiniowane jako lista, umieszczaj\u0105c typ pola w nawiasach kwadratowych (na przyk\u0142ad, trips: [Trip]).<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Zapytania (Query)<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Zapytanie GraphQL okre\u015bla jakie dane chce uzyska\u0107 klient.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">W tym przypadku interesuje nas oferta o identyfikatorze 81, z kt\u00f3rej chcemy uzyska\u0107\u00a0informacje takie jak nazwa oraz typ oferty.<\/span><\/p>\n<figure id=\"attachment_3945\" aria-describedby=\"caption-attachment-3945\" style=\"width: 1059px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytania-graphql-o-oferte.png\" alt=\"\" width=\"1059\" height=\"403\" class=\"wp-image-3945 size-full\" srcset=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytania-graphql-o-oferte.png 1059w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytania-graphql-o-oferte-300x114.png 300w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytania-graphql-o-oferte-1024x390.png 1024w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytania-graphql-o-oferte-768x292.png 768w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytania-graphql-o-oferte-208x79.png 208w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-zapytania-graphql-o-oferte-870x331.png 870w\" sizes=\"(max-width: 1059px) 100vw, 1059px\" \/><figcaption id=\"caption-attachment-3945\" class=\"wp-caption-text\">Przyk\u0142ad zapytania GraphQL<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">Po sprawdzeniu zgodno\u015bci i wykonaniu zapytania przez serwer GraphQL, dane s\u0105 zwracane w tym samym formacie jak w zapytaniu.<\/span><\/p>\n<figure id=\"attachment_3943\" aria-describedby=\"caption-attachment-3943\" style=\"width: 1073px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-odpowiedz-na-zapytanie-graphql.png\" alt=\"\" width=\"1073\" height=\"345\" class=\"size-full wp-image-3943\" srcset=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-odpowiedz-na-zapytanie-graphql.png 1073w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-odpowiedz-na-zapytanie-graphql-300x96.png 300w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-odpowiedz-na-zapytanie-graphql-1024x329.png 1024w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-odpowiedz-na-zapytanie-graphql-768x247.png 768w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-odpowiedz-na-zapytanie-graphql-208x67.png 208w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/przyklad-odpowiedz-na-zapytanie-graphql-870x280.png 870w\" sizes=\"(max-width: 1073px) 100vw, 1073px\" \/><figcaption id=\"caption-attachment-3943\" class=\"wp-caption-text\">Przyk\u0142ad odpowiedzi na zapytanie GraphQL<\/figcaption><\/figure>\n<h3><span style=\"font-weight: 400;\">Mutacje (Mutations)<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Mutacje GraphQL pozwalaj\u0105 na tworzenie, aktualizowanie lub usuwanie danych.<br \/>\n<\/span><span style=\"font-weight: 400;\">Zazwyczaj pozwalaj\u0105 one na przekazywanie argument\u00f3w, kt\u00f3re umo\u017cliwiaj\u0105 przekazywanie danych bezpo\u015brednio od klienta na serwer. <\/span><span style=\"font-weight: 400;\">W tym przypadku chcemy utworzy\u0107\u00a0ofert\u0119 dla hotelu <\/span><span style=\"font-weight: 400;\">Hotel &amp; Spa<\/span><span style=\"font-weight: 400;\"> za 3000 z\u0142otych.<\/span><\/p>\n<figure id=\"attachment_3951\" aria-describedby=\"caption-attachment-3951\" style=\"width: 1077px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/mutation-przyklad-zapytania-grapql.png\" alt=\"\" width=\"1077\" height=\"231\" class=\"size-full wp-image-3951\" srcset=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/mutation-przyklad-zapytania-grapql.png 1077w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/mutation-przyklad-zapytania-grapql-300x64.png 300w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/mutation-przyklad-zapytania-grapql-1024x220.png 1024w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/mutation-przyklad-zapytania-grapql-768x165.png 768w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/mutation-przyklad-zapytania-grapql-208x45.png 208w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/mutation-przyklad-zapytania-grapql-870x187.png 870w\" sizes=\"(max-width: 1077px) 100vw, 1077px\" \/><figcaption id=\"caption-attachment-3951\" class=\"wp-caption-text\">Przyk\u0142ad aktualizacji danych w zapytaniu GraphQL<\/figcaption><\/figure>\n<figure id=\"attachment_3949\" aria-describedby=\"caption-attachment-3949\" style=\"width: 1077px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/mutation-przyklad-odpowiedzi-na-zapytanie.png\" alt=\"\" width=\"1077\" height=\"279\" class=\"size-full wp-image-3949\" srcset=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/mutation-przyklad-odpowiedzi-na-zapytanie.png 1077w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/mutation-przyklad-odpowiedzi-na-zapytanie-300x78.png 300w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/mutation-przyklad-odpowiedzi-na-zapytanie-1024x265.png 1024w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/mutation-przyklad-odpowiedzi-na-zapytanie-768x199.png 768w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/mutation-przyklad-odpowiedzi-na-zapytanie-208x54.png 208w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/mutation-przyklad-odpowiedzi-na-zapytanie-870x225.png 870w\" sizes=\"(max-width: 1077px) 100vw, 1077px\" \/><figcaption id=\"caption-attachment-3949\" class=\"wp-caption-text\">Przyk\u0142ad odpowiedzi na zapytanie GraphQL aktualizuj\u0105ce dane<\/figcaption><\/figure>\n<h3><span style=\"font-weight: 400;\">Subskrypcje (Subscryptions)<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">GraphQL obs\u0142uguje r\u00f3wnie\u017c aktualizacje na \u017cywo wysy\u0142ane z serwera do klienta w operacji nazywanej subskrypcj\u0105. Ponownie, klient definiuje dane, kt\u00f3rych potrzebuje za ka\u017cdym razem, gdy zostanie dokonana aktualizacja.<\/span><\/p>\n<figure id=\"attachment_3955\" aria-describedby=\"caption-attachment-3955\" style=\"width: 1088px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/subscription-przyklad-zapytania-grapql.png\" alt=\"\" width=\"1088\" height=\"187\" class=\"size-full wp-image-3955\" srcset=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/subscription-przyklad-zapytania-grapql.png 1088w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/subscription-przyklad-zapytania-grapql-300x52.png 300w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/subscription-przyklad-zapytania-grapql-1024x176.png 1024w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/subscription-przyklad-zapytania-grapql-768x132.png 768w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/subscription-przyklad-zapytania-grapql-208x36.png 208w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/subscription-przyklad-zapytania-grapql-870x150.png 870w\" sizes=\"(max-width: 1088px) 100vw, 1088px\" \/><figcaption id=\"caption-attachment-3955\" class=\"wp-caption-text\">Przyk\u0142ad zapytania GraphQL<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400;\">W tym przypadku, klientowi zwr\u00f3cone zostan\u0105 dane nowego terminu dla oferty z identyfikatorem 81, je\u015bli taki termin powstanie.<\/span><\/p>\n<figure id=\"attachment_3953\" aria-describedby=\"caption-attachment-3953\" style=\"width: 1034px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/subscription-przyklad-odpowiedzi-na-zapytanie.png\" alt=\"\" width=\"1034\" height=\"250\" class=\"size-full wp-image-3953\" srcset=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/subscription-przyklad-odpowiedzi-na-zapytanie.png 1034w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/subscription-przyklad-odpowiedzi-na-zapytanie-300x73.png 300w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/subscription-przyklad-odpowiedzi-na-zapytanie-1024x248.png 1024w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/subscription-przyklad-odpowiedzi-na-zapytanie-768x186.png 768w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/subscription-przyklad-odpowiedzi-na-zapytanie-208x50.png 208w, https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/subscription-przyklad-odpowiedzi-na-zapytanie-870x210.png 870w\" sizes=\"(max-width: 1034px) 100vw, 1034px\" \/><figcaption id=\"caption-attachment-3953\" class=\"wp-caption-text\">Przyk\u0142ad odpowiedzi na zapytanie GraphQL<\/figcaption><\/figure>\n<h2><span style=\"font-weight: 400;\">Serwery GraphQL<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Dzi\u0119ki popularno\u015bci GraphQL istnieje wiele r\u00f3\u017cnych implementacji serwer\u00f3w, kt\u00f3re pozwalaj\u0105 nam u\u017cywa\u0107 go niezale\u017cnie od preferowanej od nas technologii.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Istniej\u0105 takie rozwi\u0105zania jak:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/github.com\/graphql\/graphql-js\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">GraphQL.js<\/span><\/a><span style=\"font-weight: 400;\"> dla j\u0119zyka JavaScript,<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/github.com\/graphql-go\/graphql\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">graphql-go<\/span><\/a><span style=\"font-weight: 400;\"> dla j\u0119zyka Go,<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/github.com\/graphql-python\/graphene\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Graphene<\/span><\/a><span style=\"font-weight: 400;\"> dla j\u0119zyka Python,<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/github.com\/rmosolgo\/graphql-ruby\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">graphql-ruby<\/span><\/a><span style=\"font-weight: 400;\"> dla j\u0119zyka Ruby.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Wi\u0119cej rozwi\u0105za\u0144 mo\u017cna znale\u017a\u0107 na <\/span><a href=\"https:\/\/graphql.org\/community\/tools-and-libraries\/?tags=server\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">oficjalnej stronie GraphQL<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Narz\u0119dzia GraphQL\u00a0<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Prac\u0119 z GraphQL mog\u0105 nam u\u0142atwi\u0107 zar\u00f3wno narz\u0119dzia do budowania zapyta\u0144, jak jak i przegl\u0105dania schematu naszych danych. Jednym z takich narz\u0119dzi jest <\/span><a href=\"https:\/\/github.com\/graphql\/graphiql\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">GraphiQL<\/span><\/a><span style=\"font-weight: 400;\">, kt\u00f3re <\/span><a href=\"https:\/\/graphql.github.io\/swapi-graphql\/?query=%23%20Welcome%20to%20GraphiQL%0A%23%0A%23%20GraphiQL%20is%20an%20in-browser%20tool%20for%20writing%2C%20validating%2C%20and%0A%23%20testing%20GraphQL%20queries.%0A%23%0A%23%20Type%20queries%20into%20this%20side%20of%20the%20screen%2C%20and%20you%20will%20see%20intelligent%0A%23%20typeaheads%20aware%20of%20the%20current%20GraphQL%20type%20schema%20and%20live%20syntax%20and%0A%23%20validation%20errors%20highlighted%20within%20the%20text.%0A%23%0A%23%20GraphQL%20queries%20typically%20start%20with%20a%20%22%7B%22%20character.%20Lines%20that%20start%0A%23%20with%20a%20%23%20are%20ignored.%0A%23%0A%23%20An%20example%20GraphQL%20query%20might%20look%20like%3A%0A%23%0A%23%20%20%20%20%20%7B%0A%23%20%20%20%20%20%20%20field(arg%3A%20%22value%22)%20%7B%0A%23%20%20%20%20%20%20%20%20%20subField%0A%23%20%20%20%20%20%20%20%7D%0A%23%20%20%20%20%20%7D%0A%23%0A%23%20Keyboard%20shortcuts%3A%0A%23%0A%23%20%20%20Prettify%20query%3A%20%20Shift-Ctrl-P%20(or%20press%20the%20prettify%20button)%0A%23%0A%23%20%20Merge%20fragments%3A%20%20Shift-Ctrl-M%20(or%20press%20the%20merge%20button)%0A%23%0A%23%20%20%20%20%20%20%20%20Run%20Query%3A%20%20Ctrl-Enter%20(or%20press%20the%20play%20button)%0A%23%0A%23%20%20%20%20Auto%20Complete%3A%20%20Ctrl-Space%20(or%20just%20start%20typing)%0A%23%0A%0A\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">mo\u017cna przetestowa\u0107 online<\/span><\/a><span style=\"font-weight: 400;\">. Podobnym narz\u0119dziem jest <\/span><a href=\"https:\/\/www.apollographql.com\/docs\/apollo-server\/v2\/testing\/graphql-playground\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">GraphQL Playgroud<\/span><\/a><span style=\"font-weight: 400;\">, kt\u00f3re jest udost\u0119pnione dla serwera GraphQL firmy Apollo. Poni\u017cej zrzut ekranu z tego narz\u0119dzia, dzia\u0142aj\u0105cego dla naszego API.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/playground.gif\" alt=\"\" width=\"1000\" height=\"563\" class=\"aligncenter wp-image-3908\" \/><\/p>\n<h2><span style=\"font-weight: 400;\">Podsumowanie<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">J\u0119zyk zapyta\u0144 GraphQL wykorzystywany w Qtravel Search zapewnia bardziej elastyczne i wydajniejsze pobieranych danych, co ma szczeg\u00f3lne znaczenie w przypadku z\u0142o\u017conych, hierarchicznych danych ofert turystycznych.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Je\u015bli chcesz dowiedzie\u0107 si\u0119 wi\u0119cej na temat GraphQL polecamy poni\u017csze \u017ar\u00f3d\u0142a wiedzy:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/graphql.com\/learnttps:\/\/www.youtube.com\/watch?v=eIQh02xuVw4https:\/\/www.apollographql.com\/docs\/https:\/\/graphql.org\/community\/tools-and-libraries\/\" target=\"_blank\" rel=\"noopener\"><i><span style=\"font-weight: 400;\">https:\/\/graphql.com\/learn<\/span><\/i><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/graphql.com\/learnttps:\/\/www.youtube.com\/watch?v=eIQh02xuVw4https:\/\/www.apollographql.com\/docs\/https:\/\/graphql.org\/community\/tools-and-libraries\/\" target=\"_blank\" rel=\"noopener\"><i><span style=\"font-weight: 400;\">https:\/\/www.howtographql.com\/<\/span><\/i><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/graphql.com\/learnttps:\/\/www.youtube.com\/watch?v=eIQh02xuVw4https:\/\/www.apollographql.com\/docs\/https:\/\/graphql.org\/community\/tools-and-libraries\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">https:\/\/www.apollographql.com\/docs\/<\/span><\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/graphql.com\/learnttps:\/\/www.youtube.com\/watch?v=eIQh02xuVw4https:\/\/www.apollographql.com\/docs\/https:\/\/graphql.org\/community\/tools-and-libraries\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">https:\/\/graphql.org\/community\/tools-and-libraries\/<\/span><\/a><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Zach\u0119camy tak\u017ce do zabawy GraphQL i <\/span><a href=\"https:\/\/developer.qtravel.ai\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">samodzielnych test\u00f3w API wyszukiwar<\/span><\/a><span style=\"font-weight: 400;\">ki Qtravel Search<\/span><span style=\"font-weight: 400;\"> w narz\u0119dziu GraphQL Playground, kt\u00f3re specjalnie dla Was uruchomili\u015bmy.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nasza wyszukiwarka Qtravel Search udost\u0119pnia wszystkie funkcjonalno\u015bci wyszukiwania i prezentacji ofert turystycznych w postaci interfejsu programowania aplikacji API opartego na j\u0119zyku zapyta\u0144 GraphQL. Technologia ta zapewnia programistom zaawansowany zestaw narz\u0119dzi do tworzenia najwy\u017cszej jako\u015bci do\u015bwiadcze\u0144 zwi\u0105zanych z wyszukiwaniem w bran\u017cy turystycznej.\u00a0 W niniejszym artykule przyjrzymy si\u0119, czym jest GraphQL, dlaczego zdoby\u0142 du\u017c\u0105 popularno\u015b\u0107 w \u015brodowisku [&hellip;]<\/p>\n","protected":false},"author":24,"featured_media":3967,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":""},"categories":[29,151],"tags":[150,149],"class_list":["post-3880","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","category-technologia","tag-api","tag-graphql"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Co to jest GraphQL i dlaczego warto go u\u017cywa\u0107? - Qtravel.ai Blog<\/title>\n<meta name=\"description\" content=\"Dowiedz si\u0119, czym jest GraphQL i dlaczego sta\u0142 si\u0119 popularnym wyborem w budowaniu interfejs\u00f3w API.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Co to jest GraphQL i dlaczego warto go u\u017cywa\u0107? - Qtravel.ai Blog\" \/>\n<meta property=\"og:description\" content=\"Dowiedz si\u0119, czym jest GraphQL i dlaczego sta\u0142 si\u0119 popularnym wyborem w budowaniu interfejs\u00f3w API.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/\" \/>\n<meta property=\"og:site_name\" content=\"Qtravel.ai\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/qtravelai\" \/>\n<meta property=\"article:published_time\" content=\"2024-04-24T07:38:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-25T08:27:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/graphql-qtravel.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"502\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Jakub Dajczak\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jakub Dajczak\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/\"},\"author\":{\"name\":\"Jakub Dajczak\",\"@id\":\"\/#\/schema\/person\/430d3772108f36fee85c0d581801fd7e\"},\"headline\":\"Co to jest GraphQL i dlaczego warto go u\u017cywa\u0107?\",\"datePublished\":\"2024-04-24T07:38:52+00:00\",\"dateModified\":\"2024-04-25T08:27:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/\"},\"wordCount\":2000,\"publisher\":{\"@id\":\"\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/graphql-qtravel.png\",\"keywords\":[\"API\",\"GraphQL\"],\"articleSection\":[\"Blog\",\"Technologia\"],\"inLanguage\":\"pl-PL\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/\",\"url\":\"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/\",\"name\":\"Co to jest GraphQL i dlaczego warto go u\u017cywa\u0107? - Qtravel.ai Blog\",\"isPartOf\":{\"@id\":\"\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/graphql-qtravel.png\",\"datePublished\":\"2024-04-24T07:38:52+00:00\",\"dateModified\":\"2024-04-25T08:27:20+00:00\",\"description\":\"Dowiedz si\u0119, czym jest GraphQL i dlaczego sta\u0142 si\u0119 popularnym wyborem w budowaniu interfejs\u00f3w API.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/#primaryimage\",\"url\":\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/graphql-qtravel.png\",\"contentUrl\":\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/graphql-qtravel.png\",\"width\":1200,\"height\":502},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.qtravel.ai\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Co to jest GraphQL i dlaczego warto go u\u017cywa\u0107?\"}]},{\"@type\":\"WebSite\",\"@id\":\"\/#website\",\"url\":\"\/\",\"name\":\"Qtravel.ai\",\"description\":\"\",\"publisher\":{\"@id\":\"\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"\/#organization\",\"name\":\"Qtravel.ai\",\"url\":\"\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2021\/10\/qtravel_znak-05.png\",\"contentUrl\":\"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2021\/10\/qtravel_znak-05.png\",\"width\":3840,\"height\":2160,\"caption\":\"Qtravel.ai\"},\"image\":{\"@id\":\"\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/qtravelai\",\"https:\/\/www.linkedin.com\/company\/qtravel-ai\/\"]},{\"@type\":\"Person\",\"@id\":\"\/#\/schema\/person\/430d3772108f36fee85c0d581801fd7e\",\"name\":\"Jakub Dajczak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/fdbbeb94094d4e5d2156caa59238ccbf?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/fdbbeb94094d4e5d2156caa59238ccbf?s=96&d=mm&r=g\",\"caption\":\"Jakub Dajczak\"},\"description\":\"Full Stack Developer at Qtravel.ai, specializing in Ruby on Rails framework and GraphQL integration\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Co to jest GraphQL i dlaczego warto go u\u017cywa\u0107? - Qtravel.ai Blog","description":"Dowiedz si\u0119, czym jest GraphQL i dlaczego sta\u0142 si\u0119 popularnym wyborem w budowaniu interfejs\u00f3w API.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/","og_locale":"pl_PL","og_type":"article","og_title":"Co to jest GraphQL i dlaczego warto go u\u017cywa\u0107? - Qtravel.ai Blog","og_description":"Dowiedz si\u0119, czym jest GraphQL i dlaczego sta\u0142 si\u0119 popularnym wyborem w budowaniu interfejs\u00f3w API.","og_url":"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/","og_site_name":"Qtravel.ai","article_publisher":"https:\/\/www.facebook.com\/qtravelai","article_published_time":"2024-04-24T07:38:52+00:00","article_modified_time":"2024-04-25T08:27:20+00:00","og_image":[{"width":1200,"height":502,"url":"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/graphql-qtravel.png","type":"image\/png"}],"author":"Jakub Dajczak","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"Jakub Dajczak","Szacowany czas czytania":"10 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/#article","isPartOf":{"@id":"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/"},"author":{"name":"Jakub Dajczak","@id":"\/#\/schema\/person\/430d3772108f36fee85c0d581801fd7e"},"headline":"Co to jest GraphQL i dlaczego warto go u\u017cywa\u0107?","datePublished":"2024-04-24T07:38:52+00:00","dateModified":"2024-04-25T08:27:20+00:00","mainEntityOfPage":{"@id":"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/"},"wordCount":2000,"publisher":{"@id":"\/#organization"},"image":{"@id":"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/#primaryimage"},"thumbnailUrl":"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/graphql-qtravel.png","keywords":["API","GraphQL"],"articleSection":["Blog","Technologia"],"inLanguage":"pl-PL"},{"@type":"WebPage","@id":"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/","url":"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/","name":"Co to jest GraphQL i dlaczego warto go u\u017cywa\u0107? - Qtravel.ai Blog","isPartOf":{"@id":"\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/#primaryimage"},"image":{"@id":"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/#primaryimage"},"thumbnailUrl":"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/graphql-qtravel.png","datePublished":"2024-04-24T07:38:52+00:00","dateModified":"2024-04-25T08:27:20+00:00","description":"Dowiedz si\u0119, czym jest GraphQL i dlaczego sta\u0142 si\u0119 popularnym wyborem w budowaniu interfejs\u00f3w API.","breadcrumb":{"@id":"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/#primaryimage","url":"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/graphql-qtravel.png","contentUrl":"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2024\/04\/graphql-qtravel.png","width":1200,"height":502},{"@type":"BreadcrumbList","@id":"https:\/\/www.qtravel.ai\/pl\/blog\/co-to-jest-graphql-i-dlaczego-warto-go-uzywac\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.qtravel.ai\/pl\/"},{"@type":"ListItem","position":2,"name":"Co to jest GraphQL i dlaczego warto go u\u017cywa\u0107?"}]},{"@type":"WebSite","@id":"\/#website","url":"\/","name":"Qtravel.ai","description":"","publisher":{"@id":"\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"\/#organization","name":"Qtravel.ai","url":"\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"\/#\/schema\/logo\/image\/","url":"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2021\/10\/qtravel_znak-05.png","contentUrl":"https:\/\/www.qtravel.ai\/wp-content\/uploads\/2021\/10\/qtravel_znak-05.png","width":3840,"height":2160,"caption":"Qtravel.ai"},"image":{"@id":"\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/qtravelai","https:\/\/www.linkedin.com\/company\/qtravel-ai\/"]},{"@type":"Person","@id":"\/#\/schema\/person\/430d3772108f36fee85c0d581801fd7e","name":"Jakub Dajczak","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/fdbbeb94094d4e5d2156caa59238ccbf?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fdbbeb94094d4e5d2156caa59238ccbf?s=96&d=mm&r=g","caption":"Jakub Dajczak"},"description":"Full Stack Developer at Qtravel.ai, specializing in Ruby on Rails framework and GraphQL integration"}]}},"_links":{"self":[{"href":"https:\/\/www.qtravel.ai\/pl\/wp-json\/wp\/v2\/posts\/3880"}],"collection":[{"href":"https:\/\/www.qtravel.ai\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.qtravel.ai\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.qtravel.ai\/pl\/wp-json\/wp\/v2\/users\/24"}],"replies":[{"embeddable":true,"href":"https:\/\/www.qtravel.ai\/pl\/wp-json\/wp\/v2\/comments?post=3880"}],"version-history":[{"count":17,"href":"https:\/\/www.qtravel.ai\/pl\/wp-json\/wp\/v2\/posts\/3880\/revisions"}],"predecessor-version":[{"id":3969,"href":"https:\/\/www.qtravel.ai\/pl\/wp-json\/wp\/v2\/posts\/3880\/revisions\/3969"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.qtravel.ai\/pl\/wp-json\/wp\/v2\/media\/3967"}],"wp:attachment":[{"href":"https:\/\/www.qtravel.ai\/pl\/wp-json\/wp\/v2\/media?parent=3880"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.qtravel.ai\/pl\/wp-json\/wp\/v2\/categories?post=3880"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.qtravel.ai\/pl\/wp-json\/wp\/v2\/tags?post=3880"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}