{"id":5481,"date":"2020-03-13T17:55:16","date_gmt":"2020-03-13T16:55:16","guid":{"rendered":"https:\/\/infoshareacademy.com\/?p=5481"},"modified":"2021-01-12T08:59:53","modified_gmt":"2021-01-12T07:59:53","slug":"klient-http-i-obsluga-api-czesc-i","status":"publish","type":"post","link":"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/","title":{"rendered":"Klient HTTP i obs\u0142uga API &#8211; cz\u0119\u015b\u0107 I"},"content":{"rendered":"<p><strong>Jako programista Javy pr\u0119dzej czy p\u00f3\u017aniej b\u0119dziesz musia\u0142 zacz\u0105\u0107 komunikowa\u0107 si\u0119 ze \u015bwiatem zewn\u0119trznym. Spokojnie, spokojnie. Chodzi mi tylko o Twoj\u0105 aplikacj\u0119.<\/strong><\/p>\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3000\" src=\"https:\/\/infoshareacademy.com\/wp-content\/uploads\/2020\/03\/coronavirus-programmers-e1584053753757.jpg\" alt=\"mem obrazuj\u0105cy zwi\u0105zek koronawirusa na programist\u00f3w - nie musz\u0105 dzi\u0119ki niemu przebywa\u0107 z lud\u017ami\" width=\"483\" height=\"420\"><\/figure>\n<p>W dobie wszechobecnego internetu, kiedy Twoja kom\u00f3rka bez sieci jest praktycznie bezu\u017cyteczna, kiedy \u201ctaks\u00f3wkarz\u201d gubi si\u0119 bez Google Maps, kiedy hulajnogi zatrzymuj\u0105 si\u0119 po utracie sygna\u0142u, kiedy wkr\u00f3tce Twoja pralka b\u0119dzie rozmawia\u0107 z Twoj\u0105 lod\u00f3wk\u0105, Twoja aplikacja r\u00f3wnie\u017c pr\u0119dzej czy p\u00f3\u017aniej b\u0119dzie musia\u0142a wysy\u0142a\u0107 zapytania do innych.<\/p>\n<p>Ten artyku\u0142 jest pierwszym z serii, kt\u00f3ry ma na celu pokaza\u0107 Ci, w jaki spos\u00f3b korzysta\u0107 z API przy pomocy klienta HTTP z Javy 11. Zaczniemy od bardzo prostego zapytania, kt\u00f3re zwr\u00f3ci nam prosty tekst, kt\u00f3ry wy\u015bwietlimy w konsoli. Stara\u0142em si\u0119 opisa\u0107 wszystkie kroki bardzo szczeg\u00f3\u0142owo, kolejne cz\u0119\u015bci b\u0119d\u0105 stopniowo trudniejsze z racji zar\u00f3wno bardziej skomplikowanych zapyta\u0144, jak i mniejszej ilo\u015bci wyja\u015bnie\u0144. Niezrozumia\u0142e fragmenty zawsze jednak z ch\u0119ci\u0105 wyja\u015bni\u0119 w komentarzu.<\/p>\n<h2 class=\"blog-h2\">API &#8211; czym w\u0142a\u015bciwie jest?<\/h2>\n<p>Nie b\u0119d\u0119 si\u0119 tutaj sili\u0142 na jak najbardziej precyzyjn\u0105 definicj\u0119 API, bo to wymaga\u0142oby oddzielnego artyku\u0142u, kt\u00f3ry by\u0142by do\u015b\u0107 suchy i niezbyt ciekawy. Interesuj\u0105ce, czym jest API, kiedy m\u00f3wi o nim programista backendowy w \u015brodowisku webowym.<\/p>\n<p>Tak w uproszczeniu i telegraficznym skr\u00f3cie &#8211; jest to cz\u0119\u015b\u0107 serwera, pod kt\u00f3ry mo\u017cemy wys\u0142a\u0107 nasze zapytanie (request) i dostaniemy odpowied\u017a (response) w postaci czystych danych, bez zb\u0119dnej otoczki. Czyli bez szaty graficznej, bez HTML itd. Z regu\u0142y to nie my &#8211; ludzie &#8211; jeste\u015bmy odbiorc\u0105 tych danych, ale nasza aplikacja, kt\u00f3ra te dane odpowiednio przetwarza i wy\u015bwietla w formie nam przyst\u0119pnej. Co wi\u0119cej, celem naszego zapytania mo\u017ce by\u0107 nie tylko otrzymanie danych, ale r\u00f3wnie\u017c ich wys\u0142anie.<\/p>\n<p>Wiele firm wystawia takie API. Google <a href=\"https:\/\/cloud.google.com\/translate\/docs\/reference\/libraries\/v2\/overview-v2&quot;\">do t\u0142umacze\u0144<\/a>, gdzie mo\u017cesz wys\u0142a\u0107 tekst w jednym j\u0119zyku i otrzyma\u0107 w drugim. Aplikacje <a href=\"https:\/\/openweathermap.org\/current\">pogodynek<\/a> korzystaj\u0105 z API, aby otrzyma\u0107 czyste dane dotycz\u0105ce pogody i wy\u015bwietli\u0107 je w postaci s\u0142oneczek i chmurek. Samochody <a href=\"https:\/\/www.teslaapi.io\/\">Tesli<\/a> wystawiaj\u0105 API, dzi\u0119ki kt\u00f3remu mo\u017cliwe jest sterowanie cz\u0119\u015bci\u0105 funkcji samochodu &#8211; cho\u0107 dokumentacja jest nieoficjalna. Wiele z nich jest p\u0142atne i wymaga autoryzacji, kt\u00f3ra mo\u017ce si\u0119 na pocz\u0105tek wydawa\u0107 skomplikowana. Ca\u0142e szcz\u0119\u015bcie jest te\u017c wiele darmowych, kt\u00f3re zosta\u0142y zebrane i skategoryzowane na <a href=\"https:\/\/github.com\/public-apis\/public-apis\">tej li\u015bcie<\/a>.<\/p>\n<div class=\"blog_box_highlight\" style=\"background-color: rgba(11,168,174,0.1); margin: 40px 0 40px 0; padding: 35px 0 35px 45px; border-left: 10px solid #0ba8ae;\"><span style=\"font-weight: 400; color: #10a8ae; font-size: 1.4em;\"><span style=\"font-weight: 400; color: #10a8ae; font-size: 1.4em;\">My\u015blisz o rozpocz\u0119ciu nauki?<\/span><\/span><\/p>\n<p><a href=\"https:\/\/infoshareacademy.com\/kursy\/zdalny-kurs-java-od-podstaw\/\">Sprawd\u017a zdalny kurs Junior Java Developer z trenerem na \u017bYWO<\/a><\/p>\n<\/div>\n<p>API nie musi wcale by\u0107 wystawiane \u201cna zewn\u0105trz\u201d. Dzisiejsze aplikacje internetowe s\u0105 tak du\u017ce, \u017ce cz\u0119sto dzielone s\u0105 na tak zwane mikroserwisy, kt\u00f3re porozumiewaj\u0105 si\u0119 mi\u0119dzy sob\u0105 za pomoc\u0105 swoich API w obr\u0119bie serwera. Je\u017celi planujesz zacz\u0105\u0107 komercyjn\u0105 prac\u0119 w wi\u0119kszym projekcie, to nie obejdziesz si\u0119 bez umiej\u0119tno\u015bci obs\u0142ugi tego typu zapyta\u0144.<\/p>\n<h2 class=\"blog-h2\">Http Client<\/h2>\n<p>Podstawow\u0105 klas\u0105, z kt\u00f3rej b\u0119dziemy korzysta\u0107 w tym artykule i kolejnych w tej serii jest HttpClient. Do\u0142\u0105czy\u0142a do Javy w inkubatorze w wersji 9, a jako standardowa cz\u0119\u015b\u0107 JDK w wersji 11. Jest ona nast\u0119pc\u0105 HttpURLConnection, kt\u00f3ra z racji skomplikowanego u\u017cycia przewa\u017cnie zast\u0119powana by\u0142a zewn\u0119trznymi bibliotekami. Po przeczytaniu artyku\u0142u, polecam wyszuka\u0107 spos\u00f3b u\u017cycia poprzedniczki, by przekona\u0107 si\u0119 jak bardzo tw\u00f3rcy Javy upro\u015bcili programistom \u017cycie.<\/p>\n<h2 class=\"blog-h2\">Plain text &#8211; Lorem ipsum generator<\/h2>\n<p>W tym artykule skorzystamy z API <a href=\"https:\/\/loripsum.net\/\">generatora Lorem ipsum<\/a>. Czym jest <a href=\"https:\/\/en.wikipedia.org\/wiki\/Lorem_ipsum\">Lorem ipsum<\/a>? W skr\u00f3cie &#8211; to nic nie znacz\u0105cy fragment tekstu, stosowany jako \u201cwype\u0142niacz\u201d na wzorach stron internetowych, plakat\u00f3w i innego rodzaju grafik. Dla nas istotne jest to, \u017ce API zwraca nam prosty tekst &#8211; \u201cplain text\u201d.<\/p>\n<h2 class=\"blog-h2\">Lorem ipsum &#8211; dokumentacja<\/h2>\n<p>Od czego zaczynamy? Oczywi\u015bcie &#8211; od przeczytania dokumentacji! Ta znajduje si\u0119 na samym dole strony https:\/\/loripsum.net i m\u00f3wi:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">How to use the API\nJust do a GET request on loripsum.net\/api, to get some placeholder text. You can add extra parameters to specify the output you're going to get. Say, you need 10 short paragraphs with headings, use loripsum.net\/api\/10\/short\/headers.\n\n(integer) - The number of paragraphs to generate.\nshort, medium, long, verylong - The average length of a paragraph.\ndecorate - Add bold, italic and marked text.\nlink - Add links.\nul - Add unordered lists.\nol - Add numbered lists.\ndl - Add description lists.\nbq - Add blockquotes.\ncode - Add code samples.\nheaders - Add headers.\nallcaps - Use ALL CAPS.\nprude - Prude version.\nplaintext - Return plain text, no HTML.<\/pre>\n<p>Czego si\u0119 z niej dowiedzieli\u015bmy? Po pierwsze &#8211; adres strony, kt\u00f3r\u0105 musimy odwiedzi\u0107, by dosta\u0107 tylko interesuj\u0105cy nas tekst, bez ca\u0142ej otoczki strony internetowej &#8211; <a href=\"https:\/\/loripsum.net\/api\">\u201cloripsum.net\/api\u201d<\/a>. Mo\u017cemy go odwiedzi\u0107 r\u00f3wnie\u017c w przegl\u0105darce internetowej. Co si\u0119 pod nim znajduje? Tekst, ale ze znacznikami HTML oznaczaj\u0105cymi nowy paragraf &#8211; \u201c&lt;p&gt;\u201d. Nie jest to nam do niczego potrzebne. Na ca\u0142e szcz\u0119\u015bcie zapytanie mo\u017cemy sparametryzowa\u0107.<\/p>\n<p>Odwied\u017amy wi\u0119c przyk\u0142adowy adres z parametrami podany w dokumentacji &#8211; <a href=\"https:\/\/loripsum.net\/api\/10\/short\/headers\">\u201cloripsum.net\/api\/10\/short\/headers\u201d<\/a>. Co powinni\u015bmy dosta\u0107? 10 kr\u00f3tkich akapit\u00f3w i nag\u0142\u00f3wki. Zgadza si\u0119 &#8211; je\u017celi we\u017amiemy pod uwag\u0119, \u017ce nag\u0142\u00f3wki nie wliczaj\u0105 si\u0119 do liczby akapit\u00f3w. Ale takie zapytanie te\u017c nas nie interesuje. My chcemy prosty, kr\u00f3tki tekst bez znacznik\u00f3w, kt\u00f3ry \u0142atwo wy\u015bwietlimy w konsoli. Jeden akapit nam starczy. Jaki adres wpiszemy? Po spojrzeniu do dokumentacji, mo\u017cemy stworzy\u0107 co\u015b takiego: <a href=\"https:\/\/loripsum.net\/api\/1\/short\/plaintext\/\">loripsum.net\/api\/1\/short\/plaintext<\/a>.<\/p>\n<h2 class=\"blog-h2\">Lorem ipsum &#8211; implementacja<\/h2>\n<p>Najtrudniejsza cz\u0119\u015b\u0107 za nami, teraz czas to \u201ctylko\u201d zaimplementowa\u0107 ????!<\/p>\n<p><strong>Boilerplate code<\/strong><\/p>\n<p>Na pocz\u0105tek stw\u00f3rzmy \u201cwydmuszk\u0119\u201d prostej klasy Main. W polu \u201cLOREM_URL\u201d b\u0119dziemy przechowywa\u0107 interesuj\u0105cy nas adres API, w standardowej metodzie #main b\u0119dziemy wy\u015bwietla\u0107 Stringa, kt\u00f3rego otrzymamy z metody #getLoremIpsum. Ta ostatnia metoda b\u0119dzie zawiera\u0142a ca\u0142\u0105 nasz\u0105 implementacj\u0119 w miejscu komentarza, kt\u00f3ry znajduje si\u0119 w poni\u017cszym kodzie.<\/p>\n<h2 class=\"blog-h2\">Spaghetti code<\/h2>\n<p>Pisanie takiego proceduralnego kodu, gdzie wszystko odbywa si\u0119 linijka po linijce, nie jest uznawane za dobr\u0105 praktyk\u0119 w j\u0119zykach obiektowych (jakim jest Java).<\/p>\n<p>Przez zwolennik\u00f3w czystego kodu wy\u015bmiewane jest jako \u201cspaghetti code\u201d. I s\u0142usznie! W nast\u0119pnych artyku\u0142ach z tej serii skupimy si\u0119 na lepszej enkapsulacji logiki w klasach. Je\u017celi na rekrutacji dostaniesz dostatecznie du\u017co czasu na wykonanie zadania, r\u00f3wnie\u017c nie poleca\u0142bym Ci pisa\u0107 kodu w ten spos\u00f3b. Tym razem jednak, z racji tego, \u017ce kod kt\u00f3ry dzi\u015b napiszemy jest do\u015b\u0107 kr\u00f3tki, a tak\u017ce by przejrzy\u015bcie pokaza\u0107 kolejne kroki, pozwolimy sobie na to.<\/p>\n<p>Drugim grzechem, kt\u00f3ry pope\u0142nimy, jest dodanie do sygnatury metody \u201cthrows Exception\u201d. Jedna z metod, kt\u00f3re wykorzystamy, rzuca wyj\u0105tki i normalnie powinni\u015bmy je odpowiednio obs\u0142u\u017cy\u0107. Nie zrobimy tego, gdy\u017c nasz \u201cspaghetti code\u201d by\u0142by przez to troch\u0119 mniej czytelny, czego chcia\u0142bym unikn\u0105\u0107. Drugim powodem jest to, by zrobi\u0107 to lege artis, musia\u0142bym si\u0119 troch\u0119 rozpisa\u0107 o wyj\u0105tkach, ich rodzajach oraz obs\u0142udze, a nie jest to tematem tego artyku\u0142u. Warto jednak przyswoi\u0107 sobie t\u0119 wiedz\u0119 z innych \u017ar\u00f3de\u0142 i na rekrutacji, w miar\u0119 mo\u017cliwo\u015bci, wykaza\u0107 si\u0119 ni\u0105.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">public class Main {\n    private static final String LOREM_URL =\n                        \"https:\/\/loripsum.net\/api\/1\/short\/plaintext\";\n\n    public static void main(String[] args) throws Exception {\n        System.out.println(getLoremIpsum());\n    }\n\n    private static String getLoremIpsum() throws Exception {\n        \/\/ todo: implement me!\n        return null;\n    }\n}<\/pre>\n<h2><strong>HttpClient<\/strong><\/h2>\n<p>Najwy\u017cszy czas stworzy\u0107 klienta HTTP! Odruchowo chcia\u0142oby si\u0119 u\u017cy\u0107 konstruktora i zainicjalizowa\u0107 naszego HttpClient przez u\u017cycie s\u0142owa kluczowego \u201cnew\u201d:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">HttpClient client = new HttpClient();<\/pre>\n<p>Jest to jednak niemo\u017cliwe! Klasa ta jest klas\u0105 abstrakcyjn\u0105, wi\u0119c nie mo\u017cemy stworzy\u0107 jej instancji. Jednak po wpisaniu kropki po jej nazwie IDE podpowiada nam, \u017ce s\u0105 dost\u0119pne dwie metody:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">HttpClient.newHttpClient()\nHttpClient.newBuilder()\n<\/pre>\n<p>Pierwsza z nich to statyczna metoda fabrykuj\u0105ca zwracaj\u0105ca nam klas\u0119 implementuj\u0105c\u0105 HttpClient posiadaj\u0105cego domy\u015bln\u0105 konfiguracj\u0119. W skr\u00f3cie &#8211; dostajemy to, co chcemy &#8211; prostego klienta HTTP. Druga metoda zwraca nam klas\u0119 buduj\u0105c\u0105 &#8211; buildera, kt\u00f3ry umo\u017cliwi nam dodatkow\u0105 konfiguracj\u0119 naszego klienta, je\u017celi b\u0119dzie to potrzebne. Na razie domy\u015blny klient Http nam starczy, wi\u0119c u\u017cywamy tej pierwszej.<\/p>\n<h2><strong>HttpRequest<\/strong><\/h2>\n<p>Przygotujmy teraz zapytanie, kt\u00f3re wy\u015ble nasz klient. Zapytanie to po angielsku request, wi\u0119c mia\u0142oby sens, gdyby potrzebna nam klasa nazywa\u0142a si\u0119 HttpRequest. I tak faktycznie jest! Ach, jak przyjemnie korzysta\u0107 z bibliotek, kt\u00f3re maj\u0105 dok\u0142adnie takie nazwy jakich si\u0119 spodziewasz. Zabieramy si\u0119 za stworzenie instancji i ponownie nie mo\u017cemy zrobi\u0107 tego przez konstruktor. Jakie podpowiedzi daje nam IDE?<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">HttpRequest.newBuilder()\nHttpRequest.newBuilder(URI uri)\n<\/pre>\n<p>Nie ma .newHttpRequest? C\u00f3\u017c, brak domy\u015blnego zapytania ma sens, w ko\u0144cu za ka\u017cdym razem jak je tworzymy, b\u0119dziemy chcieli pewnie uderza\u0107 do innego adresu. Skorzystamy, wi\u0119c z metody, kt\u00f3ra umo\u017cliwi nam skonfigurowanie requestu, zanim go utworzymy, dzi\u0119ki wykorzystaniu wzorca projektowego budowniczy &#8211; builder. Tym razem u\u017cyjemy pierwszej, bezparametrowej metody.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">HttpRequest request = HttpRequest.newBuilder();<\/pre>\n<p>Po napisaniu powy\u017cszego kodu IDE krzyczy, \u017ce typ si\u0119 nie zgadza. Dlaczego? Metoda newBuilder zwraca nam w ko\u0144cu buildera, nie HttpRequest. Musimy wi\u0119c zmieni\u0107 nasz\u0105 deklaracj\u0119 na nast\u0119puj\u0105c\u0105:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">HttpRequest.Builder builder = HttpRequest.newBuilder();<\/pre>\n<p>Czas teraz skonfigurowa\u0107 nasze zapytanie. Pierwsze co zrobimy, to dodanie adresu naszego zapytania:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">builder.uri(\"https:\/\/loripsum.net\/api\/1\/plaintext\");<\/pre>\n<h2>Co dalej?<\/h2>\n<p>I zn\u00f3w IDE krzyczy, \u017ce co\u015b jest nie tak. Tym razem z typem parametru. Kompilator chcia\u0142by URI, a my dali\u015bmy Stringa. Jak stworzy\u0107 URI? Sprawd\u017amy, co nam podpowie IDE po kropce:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">URI.create(String str)<\/pre>\n<p>Po raz kolejny autorzy popisali si\u0119 nazewnictwem! Chcesz stworzy\u0107 URI? Masz metod\u0119 URI create. Jeste\u015bmy te\u017c w stanie stworzy\u0107 ten obiekt poprzez konstruktor, ale on rzuca wyj\u0105tek typu checked, kt\u00f3ry musieliby\u015bmy obs\u0142u\u017cy\u0107. A jak wspomina\u0142em wcze\u015bniej, nie b\u0119dziemy tym razem zajmowa\u0107 si\u0119 obs\u0142ug\u0105 wyj\u0105tk\u00f3w. Dodam tylko, \u017ce po spojrzeniu w \u017ar\u00f3d\u0142a mo\u017cemy zobaczy\u0107, \u017ce metoda create pod spodem korzysta z konstruktora i tylko opakowuje wyj\u0105tek w taki, kt\u00f3rego nie musimy obs\u0142u\u017cy\u0107. Tak\u017ce wci\u0105\u017c istnieje ryzyko, \u017ce taki wyj\u0105tek poleci.<\/p>\n<p>W ramach zasady czystego kodu &#8211; \u201cno magic numbers\u201d &#8211; umie\u015bcili\u015bmy przezornie nasz adres w statycznym i finalnym polu o nazwie LOREM_URL, mo\u017cemy wi\u0119c go tutaj u\u017cy\u0107.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">URI loremUri = URI.create(LOREM_URL);<\/pre>\n<p>Pozostaje nam przekazanie tego obiektu naszemu budowniczemu:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">builder.uri(loremUri);<\/pre>\n<p>Zanim zako\u0144czymy budow\u0119 naszego zapytania, chcia\u0142bym \u017ceby\u015bmy dodali jeszcze jedn\u0105 konfiguracj\u0119. W dokumentacji mamy wzmiank\u0119 o tym, \u017ce nasz request ma wykorzystywa\u0107 metod\u0119 GET. Jest to co prawda domy\u015blna metoda zapytania, ale chcia\u0142bym \u017ceby\u015bmy przyzwyczaili si\u0119 do samej nazwy i nie zdziwi\u0142o nas, gdy innym razem zostaniemy poproszeni o u\u017cycie innej &#8211; jak POST, czy DELETE. Jak to zrobimy? Ponownie autorzy stan\u0119li na wysoko\u015bci zadania &#8211; metod\u0105 GET.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">builder.GET();<\/pre>\n<div class=\"blog_box_highlight\" style=\"background-color: rgba(11,168,174,0.1); margin: 40px 0 40px 0; padding: 35px 0 35px 45px; border-left: 10px solid #0ba8ae;\"><span style=\"font-weight: 400; color: #10a8ae; font-size: 1.4em;\">Przeczytaj tak\u017ce:<br \/>\n<a href=\"https:\/\/infoshareacademy.com\/wywiad\/wywiad-czy-po-wielu-latach-w-innym-zawodzie-mozna-zostac-java-developerem\/\">Czy po wielu latach w innym zawodzie mo\u017cna zosta\u0107 Java Developerem?<\/a><\/span><\/div>\n<h2 class=\"blog-h2\">Co z zapytaniem?<\/h2>\n<p>Na tym ko\u0144czymy nasz\u0105 konfiguracj\u0119, ale gdzie jest nasze zapytanie? Jeszcze nie powsta\u0142o. W ko\u0144cu nie powiedzieli\u015bmy naszemu budowniczemu, \u017ceby nam je zbudowa\u0142. Jak to zrobimy? Pewnie si\u0119 ju\u017c domy\u015blacie &#8211; budowniczy zbuduj.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">HttpRequest request = builder.build();<\/pre>\n<p>Tym razem w ko\u0144cu zwr\u00f3cone zostanie nasze zapytanie. B\u0119dzie ono niemutowalne (ang. immutable), co oznacza, \u017ce nie b\u0119dziemy w stanie go edytowa\u0107. By uderzy\u0107 do innego adresu, albo z inn\u0105 metod\u0105 &#8211; b\u0119dziemy musieli stworzy\u0107 nowe. Jak teraz wygl\u0105da nasz kod?<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">URI uri = URI.create(LOREM_URL);\nHttpRequest.Builder builder = HttpRequest.newBuilder();\nbuilder.uri(uri);\nbuilder.GET();\nHttpRequest request = builder.build();\n\n<\/pre>\n<p>Dwie metody, kt\u00f3rych u\u017cywamy nie maj\u0105 \u017cadnej deklaracji. Co one zwracaj\u0105? R\u00f3wnie\u017c naszego buildera. Oznacza to, \u017ce mogliby\u015bmy to zapisa\u0107 w spos\u00f3b nast\u0119puj\u0105cy:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">HttpRequest.Builder builder;\nbuilder = HttpRequest.newBuilder();\nbuilder = builder.uri(uri);\nbuilder = builder.GET();\n<\/pre>\n<p>Ale zaraz, skoro w jednej linii zwracamy buildera, a w nast\u0119pnej si\u0119 do niego zn\u00f3w odwo\u0142ujemy\u2026 To czy nie mogliby\u015bmy zrobi\u0107 tego w jednej linii? Bez \u015brednik\u00f3w?<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">HttpRequest.Builder builder = HttpRequest.newBuilder().uri(uri).GET();<\/pre>\n<p>Jasne! Co wi\u0119cej, w og\u00f3le nie musimy deklarowa\u0107 naszego budowniczego! W ko\u0144cu jest on nam potrzebny jedynie tymczasowo. To czego b\u0119dziemy potrzebowa\u0107, to request, kt\u00f3re zwr\u00f3ci nam ostatnia metoda &#8211; build. W ramach czytelno\u015bci rozbijemy tylko metody na oddzielne linie:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">HttpRequest request = HttpRequest.newBuilder()\n                                 .uri(loremUri)\n                                 .GET()\n                                 .build();\n<\/pre>\n<p>Deklarujemy tylko obiekt HttpRequest, kt\u00f3ry zwraca nam ostatnia metoda w naszym kombo &#8211; build. Pozosta\u0142e metody wci\u0105\u017c zwracaj\u0105 buildera, ale jako \u017ce od razu wywo\u0142ujemy na nim kolejne, nie ma potrzeby jego deklarowania. Ten rodzaj nazywany jest fluent builder i z uwagi na przejrzysto\u015b\u0107 jest bardzo cz\u0119sto wykorzystywany w nowoczesnych bibliotekach.<\/p>\n<h2><strong>HttpResponse<\/strong><\/h2>\n<p>Mamy klienta, mamy r\u00f3wnie\u017c zapytanie. Pozosta\u0142o je ju\u017c tylko wys\u0142a\u0107 i sprawdzi\u0107 odpowied\u017a! Jakie metody sugeruje nam IDE dla naszego klienta? Send wydaje si\u0119 sensowna:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">client.send(HttpRequest request,\n            HttpResponse.BodyHandler&lt;T&gt; responseBodyHandler)\n<\/pre>\n<p>Potrzebne s\u0105 nam dwa parametry, request ju\u017c mamy, ale czym jest BodyHandler?<br \/>\nOdpowied\u017a HTTP (response) sk\u0142ada si\u0119 z trzech cz\u0119\u015bci: statusu (status line), nag\u0142\u00f3wk\u00f3w (headers) i cia\u0142a (body). BodyHandler to obiekt, kt\u00f3ry pomo\u017ce nam obs\u0142u\u017cy\u0107 cia\u0142o odpowiedzi. My oczekujemy prostego tekstu, wi\u0119c potrzebujemy takiego, kt\u00f3ry obs\u0142u\u017cy nam Stringi. Jak go stworzy\u0107? Poprzez statyczn\u0105 metod\u0119 fabrykuj\u0105c\u0105:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">HttpResponse.BodyHandlers.ofString();<\/pre>\n<p>By zwi\u0119kszy\u0107 czytelno\u015b\u0107 kodu i m\u00f3c skorzysta\u0107 tylko z nazwy metody ofString pos\u0142u\u017cymy si\u0119 importem statycznym, kt\u00f3ry dodamy ponad deklaracj\u0105 klasy:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">import static java.net.http.HttpResponse.BodyHandlers.ofString;<\/pre>\n<p>Dzi\u0119ki czemu wys\u0142anie naszego zapytania b\u0119dzie wygl\u0105da\u0142o w spos\u00f3b nast\u0119puj\u0105cy:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">HttpResponse&lt;String&gt; response = client.send(request, ofString());<\/pre>\n<p>Je\u017celi IDE podkre\u015bla Ci t\u0119 metod\u0119, spowodowane jest to tym, \u017ce rzuca ona wyj\u0105tki, kt\u00f3re nale\u017cy obs\u0142u\u017cy\u0107. Jak wspomnia\u0142em na pocz\u0105tku, w tym artykule nie b\u0119d\u0119 porusza\u0142 tego tematu, dlatego do sygnatury metody doda\u0142em:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">throws Exception<\/pre>\n<p>Nale\u017cy jednak pami\u0119ta\u0107, \u017ce jest to obej\u015bcie problemu na potrzeby uproszczenia kodu w artykule, nie jego rozwi\u0105zanie, kt\u00f3re nale\u017ca\u0142oby stosowa\u0107 w kodzie produkcyjnym.<br \/>\nWr\u00f3\u0107my teraz do naszej odpowiedzi. Jak wspomina\u0142em wcze\u015bniej, sk\u0142ada si\u0119 ona z kilku cz\u0119\u015bci. Ta, na kt\u00f3rej nam obecnie zale\u017cy, to cia\u0142o. Wydobycie jej jest bardzo proste:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">response.body();<\/pre>\n<h2><strong>Rezultat<\/strong><\/h2>\n<p>I to ju\u017c wszystko! Po drobnych zmianach nasz kod ostatecznie b\u0119dzie wygl\u0105da\u0142 w spos\u00f3b nast\u0119puj\u0105cy:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">import java.net.URI;\nimport java.net.http.HttpClient;\nimport java.net.http.HttpRequest;\n\nimport static java.net.http.HttpResponse.BodyHandlers.ofString;\n\npublic class LoremMain {\n    private static final URI LOREM_URI =\n               URI.create(\"https:\/\/loripsum.net\/api\/1\/short\/plaintext\");\n\n    public static void main(String[] args) throws Exception {\n        System.out.println(getLoremIpsum());\n    }\n\n    private static String getLoremIpsum() throws Exception {\n        HttpClient client = HttpClient.newHttpClient();\n\n        HttpRequest request = HttpRequest.newBuilder()\n                .uri(LOREM_URI)\n                .GET()\n                .build();\n\n        return client.send(request, ofString())\n                .body();\n    }\n}<\/pre>\n<p>Pozosta\u0142o tylko uruchomi\u0107 metod\u0119 main i zobaczy\u0107 odpowied\u017a, kt\u00f3ra powinna si\u0119 wy\u015bwietli\u0107 w terminalu. Ja po pierwszym uruchomieniu otrzyma\u0142em:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"ini\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duo Reges: constructio interrete. Quae cum dixisset, finem ille. Eaedem res maneant alio modo. Si longus, levis; Gerendus est mos, modo recte sentiat.<\/pre>\n<p>Twoja odpowied\u017a b\u0119dzie si\u0119 lekko r\u00f3\u017cni\u0142a, jako \u017ce API za ka\u017cdym razem generuj\u0119 inn\u0105. Jedynie pierwsze zdanie b\u0119dzie takie samo.<\/p>\n<h2 class=\"blog-h2\">Podsumowanie<\/h2>\n<p>Mam nadziej\u0119, \u017ce zgodzisz si\u0119 ze mn\u0105, \u017ce wysy\u0142anie zapyta\u0144 przy pomocy klienta HTTP jest \u0142atwe i przyjemne. Uda\u0142o si\u0119 nam to za pomoc\u0105 tylko kilku linijek kodu! Oczywi\u015bcie to dopiero pocz\u0105tek. Zapytanie kt\u00f3re otrzymali\u015bmy to by\u0142 jedynie prosty tekst. W nast\u0119pnych artyku\u0142ach z tej serii b\u0119dziemy stopniowo rozszerza\u0107 wiedz\u0119. Zaczniemy od odbierania obiekt\u00f3w typu JSON, kt\u00f3re b\u0119dziemy mapowa\u0107 na stworzone przez nas klasy. Zajmiemy si\u0119 te\u017c obs\u0142ug\u0105 b\u0142\u0119d\u00f3w i autoryzacj\u0105.<\/p>\n<p><strong>Autor:<\/strong><br \/>\n<strong><a href=\"https:\/\/www.linkedin.com\/in\/hubertpiesniak\/\">Hubert Pie\u015bniak<\/a><\/strong><\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" class=\"wp-image-3000\" src=\"https:\/\/infoshareacademy.com\/wp-content\/uploads\/2020\/03\/hubert-piesniak-infoshare-academy.jpg\" alt=\"Hubert Pie\u015bniak - autor wpisu\"><\/figure>\n<p>Software Engineer w EPAM Systems, koduj\u0105cy w Javie. Od dziecka pasjonat technologii, kt\u00f3remu programowanie jako hobby towarzyszy\u0142o od najm\u0142odszych lat. Do bran\u017cy IT trafi\u0142 jednak bardzo okr\u0119\u017cn\u0105 drog\u0105. Studiowa\u0142 Ekonomi\u0119 na SGH, UEP i Sogang University w Seulu. Do niedawna prowadzi\u0142 najwi\u0119kszy klub bilardowy na Pomorzu, wcze\u015bniej sklepy jubilerskie do kt\u00f3rych importowa\u0142 towar z W\u0142och, Turcji i Tajlandii, tu\u017c po tym jak reprezentowa\u0142 firm\u0119 sprzedaj\u0105c\u0105 mufy do kabli wysokonapi\u0119ciowych. Cz\u0142owiek wielu pasji i zainteresowa\u0144.<\/p>\n<p><script type=\"text\/javascript\" src=\"https:\/\/app.getresponse.com\/view_webform_v2.js?u=SAZgM&amp;webforms_id=BecDY\" data-webform-id=\"BecDY\"><\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jako programista Javy pr\u0119dzej czy p\u00f3\u017aniej b\u0119dziesz musia\u0142 zacz\u0105\u0107 komunikowa\u0107 si\u0119 ze \u015bwiatem zewn\u0119trznym. Spokojnie, spokojnie. Chodzi mi tylko o Twoj\u0105 aplikacj\u0119. W dobie wszechobecnego internetu, kiedy Twoja kom\u00f3rka bez sieci jest praktycznie bezu\u017cyteczna, kiedy \u201ctaks\u00f3wkarz\u201d gubi si\u0119 bez Google Maps, kiedy hulajnogi zatrzymuj\u0105 si\u0119 po utracie sygna\u0142u, kiedy wkr\u00f3tce Twoja pralka b\u0119dzie rozmawia\u0107 z &hellip;<\/p>\n","protected":false},"author":3,"featured_media":9814,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,29,46],"tags":[],"class_list":["post-5481","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artykul","category-back-end","category-java"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Klient HTTP i obs\u0142uga API | Kursy programowania infoShare Academy<\/title>\n<meta name=\"description\" content=\"Sprawd\u017a, w jaki spos\u00f3b korzysta\u0107 z API przy pomocy klienta HTTP z Javy 11 | Kursy programowania: Front-End, Java, Python w Gda\u0144sku, Wroc\u0142awiu i Warszawie.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Klient HTTP i obs\u0142uga API\" \/>\n<meta property=\"og:description\" content=\"W dobie wszechobecnego internetu, kiedy Twoja kom\u00f3rka bez sieci jest praktycznie bezu\u017cyteczna, kiedy \u201ctaks\u00f3wkarz\u201d gubi si\u0119 bez Google Maps, kiedy hulajnogi zatrzymuj\u0105 si\u0119 po utracie sygna\u0142u, kiedy wkr\u00f3tce Twoja pralka b\u0119dzie rozmawia\u0107 z Twoj\u0105 lod\u00f3wk\u0105, Twoja aplikacja r\u00f3wnie\u017c pr\u0119dzej czy p\u00f3\u017aniej b\u0119dzie musia\u0142a wysy\u0142a\u0107 zapytania do innych. Ten artyku\u0142 jest pierwszym z serii, kt\u00f3ry ma na celu pokaza\u0107 Ci, w jaki spos\u00f3b korzysta\u0107 z API przy pomocy klienta HTTP z Javy 11.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/\" \/>\n<meta property=\"og:site_name\" content=\"infoShare Academy Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/infoshareacademy\" \/>\n<meta property=\"article:published_time\" content=\"2020-03-13T16:55:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-01-12T07:59:53+00:00\" \/>\n<meta name=\"author\" content=\"stokarska\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2020\/03\/klient-http-blog-isa.png\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"stokarska\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/\"},\"author\":{\"name\":\"stokarska\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/90eefec70f6918e70294f2aa5ed2f1cb\"},\"headline\":\"Klient HTTP i obs\u0142uga API &#8211; cz\u0119\u015b\u0107 I\",\"datePublished\":\"2020-03-13T16:55:16+00:00\",\"dateModified\":\"2021-01-12T07:59:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/\"},\"wordCount\":2440,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#organization\"},\"articleSection\":[\"Artyku\u0142\",\"Back-end\",\"Java\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/\",\"url\":\"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/\",\"name\":\"Klient HTTP i obs\u0142uga API | Kursy programowania infoShare Academy\",\"isPartOf\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#website\"},\"datePublished\":\"2020-03-13T16:55:16+00:00\",\"dateModified\":\"2021-01-12T07:59:53+00:00\",\"description\":\"Sprawd\u017a, w jaki spos\u00f3b korzysta\u0107 z API przy pomocy klienta HTTP z Javy 11 | Kursy programowania: Front-End, Java, Python w Gda\u0144sku, Wroc\u0142awiu i Warszawie.\",\"breadcrumb\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/infoshareacademy.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Klient HTTP i obs\u0142uga API &#8211; cz\u0119\u015b\u0107 I\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#website\",\"url\":\"https:\/\/infoshareacademy.com\/blog\/\",\"name\":\"infoShare Academy Blog\",\"description\":\"Strona o szkoleniach w IT\",\"publisher\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/infoshareacademy.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#organization\",\"name\":\"infoShare Academy\",\"url\":\"https:\/\/infoshareacademy.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2022\/11\/infoShare-Academy-ver-white-with-background-1000x1000px.jpg\",\"contentUrl\":\"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2022\/11\/infoShare-Academy-ver-white-with-background-1000x1000px.jpg\",\"width\":1000,\"height\":1000,\"caption\":\"infoShare Academy\"},\"image\":{\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/infoshareacademy\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/90eefec70f6918e70294f2aa5ed2f1cb\",\"name\":\"stokarska\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g\",\"caption\":\"stokarska\"},\"url\":\"https:\/\/infoshareacademy.com\/blog\/author\/stokarska\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Klient HTTP i obs\u0142uga API | Kursy programowania infoShare Academy","description":"Sprawd\u017a, w jaki spos\u00f3b korzysta\u0107 z API przy pomocy klienta HTTP z Javy 11 | Kursy programowania: Front-End, Java, Python w Gda\u0144sku, Wroc\u0142awiu i Warszawie.","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:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/","og_locale":"pl_PL","og_type":"article","og_title":"Klient HTTP i obs\u0142uga API","og_description":"W dobie wszechobecnego internetu, kiedy Twoja kom\u00f3rka bez sieci jest praktycznie bezu\u017cyteczna, kiedy \u201ctaks\u00f3wkarz\u201d gubi si\u0119 bez Google Maps, kiedy hulajnogi zatrzymuj\u0105 si\u0119 po utracie sygna\u0142u, kiedy wkr\u00f3tce Twoja pralka b\u0119dzie rozmawia\u0107 z Twoj\u0105 lod\u00f3wk\u0105, Twoja aplikacja r\u00f3wnie\u017c pr\u0119dzej czy p\u00f3\u017aniej b\u0119dzie musia\u0142a wysy\u0142a\u0107 zapytania do innych. Ten artyku\u0142 jest pierwszym z serii, kt\u00f3ry ma na celu pokaza\u0107 Ci, w jaki spos\u00f3b korzysta\u0107 z API przy pomocy klienta HTTP z Javy 11.","og_url":"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/","og_site_name":"infoShare Academy Blog","article_publisher":"https:\/\/www.facebook.com\/infoshareacademy","article_published_time":"2020-03-13T16:55:16+00:00","article_modified_time":"2021-01-12T07:59:53+00:00","author":"stokarska","twitter_card":"summary_large_image","twitter_image":"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2020\/03\/klient-http-blog-isa.png","twitter_misc":{"Napisane przez":"stokarska","Szacowany czas czytania":"14 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/#article","isPartOf":{"@id":"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/"},"author":{"name":"stokarska","@id":"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/90eefec70f6918e70294f2aa5ed2f1cb"},"headline":"Klient HTTP i obs\u0142uga API &#8211; cz\u0119\u015b\u0107 I","datePublished":"2020-03-13T16:55:16+00:00","dateModified":"2021-01-12T07:59:53+00:00","mainEntityOfPage":{"@id":"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/"},"wordCount":2440,"commentCount":0,"publisher":{"@id":"https:\/\/infoshareacademy.com\/blog\/#organization"},"articleSection":["Artyku\u0142","Back-end","Java"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/","url":"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/","name":"Klient HTTP i obs\u0142uga API | Kursy programowania infoShare Academy","isPartOf":{"@id":"https:\/\/infoshareacademy.com\/blog\/#website"},"datePublished":"2020-03-13T16:55:16+00:00","dateModified":"2021-01-12T07:59:53+00:00","description":"Sprawd\u017a, w jaki spos\u00f3b korzysta\u0107 z API przy pomocy klienta HTTP z Javy 11 | Kursy programowania: Front-End, Java, Python w Gda\u0144sku, Wroc\u0142awiu i Warszawie.","breadcrumb":{"@id":"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/infoshareacademy.com\/blog\/klient-http-i-obsluga-api-czesc-i\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/infoshareacademy.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Klient HTTP i obs\u0142uga API &#8211; cz\u0119\u015b\u0107 I"}]},{"@type":"WebSite","@id":"https:\/\/infoshareacademy.com\/blog\/#website","url":"https:\/\/infoshareacademy.com\/blog\/","name":"infoShare Academy Blog","description":"Strona o szkoleniach w IT","publisher":{"@id":"https:\/\/infoshareacademy.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/infoshareacademy.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/infoshareacademy.com\/blog\/#organization","name":"infoShare Academy","url":"https:\/\/infoshareacademy.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/infoshareacademy.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2022\/11\/infoShare-Academy-ver-white-with-background-1000x1000px.jpg","contentUrl":"https:\/\/infoshareacademy.com\/blog\/wp-content\/uploads\/2022\/11\/infoShare-Academy-ver-white-with-background-1000x1000px.jpg","width":1000,"height":1000,"caption":"infoShare Academy"},"image":{"@id":"https:\/\/infoshareacademy.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/infoshareacademy"]},{"@type":"Person","@id":"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/90eefec70f6918e70294f2aa5ed2f1cb","name":"stokarska","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/infoshareacademy.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g","caption":"stokarska"},"url":"https:\/\/infoshareacademy.com\/blog\/author\/stokarska\/"}]}},"_links":{"self":[{"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/posts\/5481","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/comments?post=5481"}],"version-history":[{"count":1,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/posts\/5481\/revisions"}],"predecessor-version":[{"id":9815,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/posts\/5481\/revisions\/9815"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/media\/9814"}],"wp:attachment":[{"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/media?parent=5481"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/categories?post=5481"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/infoshareacademy.com\/blog\/wp-json\/wp\/v2\/tags?post=5481"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}