Vykonajte jednoduchú požiadavku HTTP v prostredí Java

1. Prehľad

V tomto rýchlom návode uvádzame a spôsob vykonávania HTTP požiadaviek v Jave - pomocou vstavanej triedy Java HttpUrlConnection.

Všimnite si, že počnúc JDK 11 poskytuje Java nové API na vykonávanie požiadaviek HTTP, ktoré je myslené ako náhrada za HttpUrlConnection, the HttpClient API.

2. HttpUrlConnection

The HttpUrlConnection trieda nám umožňuje vykonávať základné požiadavky HTTP bez použitia akýchkoľvek ďalších knižníc. Všetky triedy, ktoré potrebujeme, sú súčasťou java.net balíček.

Nevýhody použitia tejto metódy sú tieto kód môže byť ťažkopádnejší ako iné knižnice HTTP a že neposkytuje pokročilejšie funkcie, ako sú vyhradené metódy na pridávanie hlavičiek alebo autentifikácia.

3. Vytvorenie požiadavky

Môžeme vytvoriť HttpUrlConnection napríklad pomocou openConnection () metóda URL trieda. Upozorňujeme, že táto metóda iba vytvorí objekt pripojenia, ale ešte ho nenadviaže.

The HttpUrlConnection trieda sa používa pre všetky typy požiadaviek nastavením requestMethod atribút jednej z hodnôt: GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE.

Vytvorme pripojenie k danej adrese URL pomocou metódy GET:

URL url = nová URL ("// example.com"); HttpURLConnection con = (HttpURLConnection) url.openConnection (); con.setRequestMethod ("ZÍSKAŤ");

4. Pridanie parametrov požiadavky

Ak chceme do požiadavky pridať parametre, musíme nastaviť doOutput majetok do pravda, potom napíš a String formulára param1 = hodnota¶m2 = hodnota do OutputStream z HttpUrlConnection inštancia:

Parametre mapy = nový HashMap (); parameters.put ("param1", "val"); con.setDoOutput (true); DataOutputStream out = nový DataOutputStream (con.getOutputStream ()); out.writeBytes (ParameterStringBuilder.getParamsString (parametre)); out.flush (); out.close ();

Na uľahčenie transformácie parameter Mapa, napísali sme triedu nástrojov nazvanú ParameterStringBuilder obsahujúci statickú metódu, getParamsString (), ktorá transformuje a Mapa do a String požadovaného formátu:

public class ParameterStringBuilder {public static String getParamsString (Map params) throws UnsupportedEncodingException {StringBuilder result = new StringBuilder (); pre (položka Map.Entry: params.entrySet ()) {result.append (URLEncoder.encode (entry.getKey (), "UTF-8"))); result.append ("="); result.append (URLEncoder.encode (entry.getValue (), "UTF-8")); result.append ("&"); } Reťazec resultString = result.toString (); return resultString.length ()> 0? resultString.substring (0, resultString.length () - 1): resultString; }}

5. Nastavenie hlavičiek požiadaviek

Pridanie hlavičiek k žiadosti je možné dosiahnuť použitím setRequestProperty () metóda:

con.setRequestProperty ("Content-Type", "application / json");

Na načítanie hodnoty hlavičky z pripojenia môžeme použiť getHeaderField () metóda:

Reťazec contentType = con.getHeaderField ("Content-Type");

6. Konfigurácia časových limitov

HttpUrlConnection trieda umožňuje nastavenie časových limitov pripojenia a čítania. Tieto hodnoty definujú časový interval čakania na nadviazanie spojenia so serverom alebo na sprístupnenie údajov na čítanie.

Na nastavenie hodnôt časového limitu môžeme použiť setConnectTimeout () a setReadTimeout () metódy:

con.setConnectTimeout (5 000); con.setReadTimeout (5 000);

V príklade sme nastavili obe hodnoty časového limitu na päť sekúnd.

7. Zaobchádzanie s cookies

The java.net balíček obsahuje triedy, ktoré uľahčujú prácu s cookies, ako napr CookieManager a HttpCookie.

Po prvé, aby prečítať súbory cookie z odpovede, môžeme načítať hodnotu Súbor cookie hlavičku a rozobrať ju na zoznam HttpCookie objekty:

Reťazec cookiesHeader = con.getHeaderField ("Set-Cookie"); Zoznam cookies = HttpCookie.parse (cookiesHeader);

Ďalej budeme pridať cookies do obchodu s cookies:

cookies.forEach (cookie -> cookieManager.getCookieStore (). add (null, cookie));

Poďme skontrolovať, či sa volá cookie používateľské meno je prítomný, a ak nie, pridáme ho do obchodu s cookie s hodnotou „john“:

Voliteľné usernameCookie = cookies.stream () .findAny (). Filter (cookie -> cookie.getName (). Equals ("username")); if (usernameCookie == null) {cookieManager.getCookieStore (). add (null, new HttpCookie ("username", "john")); }

Nakoniec k pridať cookies k požiadavke, musíme nastaviť Cookie hlavička, po uzavretí a opätovnom otvorení spojenia:

con.disconnect (); con = (HttpURLConnection) url.openConnection (); con.setRequestProperty ("Cookie", StringUtils.join (cookieManager.getCookieStore (). getCookies (), ";"));

8. Spracovanie presmerovaní

Môžeme povoliť alebo zakázať automatické nasledujúce presmerovania pre konkrétne pripojenie pomocou setInstanceFollowRedirects () metóda s pravda alebo nepravdivé parameter:

con.setInstanceFollowRedirects (false);

Je tiež možné povoliť alebo zakázať automatické presmerovanie pre všetky pripojenia:

HttpUrlConnection.setFollowRedirects (false);

Predvolene je správanie povolené.

Keď žiadosť vráti stavový kód 301 alebo 302, čo naznačuje presmerovanie, môžeme načítať Poloha hlavičku a vytvorte novú požiadavku na novú adresu URL:

if (status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_MOVED_PERM) {String location = con.getHeaderField ("Location"); URL newUrl = nová adresa URL (umiestnenie); con = (HttpURLConnection) newUrl.openConnection (); }

9. Čítanie odpovede

Odpoveď na žiadosť si môžete prečítať do analýza súboru InputStream z HttpUrlConnection inštancia.

Na vybavenie žiadosti môžeme použiť getResponseCode (), pripojiť (), getInputStream () alebo getOutputStream () metódy:

int stav = con.getResponseCode ();

Na záver si prečítajme odpoveď na žiadosť a umiestnime ju do a obsah Reťazec:

BufferedReader in = nový BufferedReader (nový InputStreamReader (con.getInputStream ())); Reťazec inputLine; Obsah StringBuffer = nový StringBuffer (); while ((inputLine = in.readLine ())! = null) {content.append (inputLine); } in.close ();

To ukončiť spojenie, môžeme použiť odpojiť () metóda:

con.disconnect (); 

10. Čítanie odpovede na neúspešné požiadavky

Ak požiadavka zlyhá, pokus o prečítanie súboru InputStream z HttpUrlConnection inštancia nebude fungovať. Namiesto toho môžeme spotrebovať prúd poskytovaný HttpUrlConnection.getErrorStream ().

Môžeme sa rozhodnúť, ktoré InputStream použiť porovnaním stavového kódu HTTP:

int stav = con.getResponseCode (); Čítačka streamReader = null; if (status> 299) {streamReader = nový InputStreamReader (con.getErrorStream ()); } else {streamReader = nový InputStreamReader (con.getInputStream ()); }

A nakoniec si môžeme prečítať streamReader rovnakým spôsobom ako v predchádzajúcej časti.

11. Získanie úplnej odpovede

Nie je možné získať úplné vyjadrenie odpovede pomocou HttpUrlConnection inštancia.

Avšak môžeme ho zostaviť pomocou niektorých metód, ktoré HttpUrlConnection inštančné ponuky:

public class FullResponseBuilder {public static String getFullResponse (HttpURLConnection con) hodí IOException {StringBuilder fullResponseBuilder = nový StringBuilder (); // stav čítania a správa // čítanie hlavičiek // návrat odpovede na čítanie obsahu fullResponseBuilder.toString (); }}

Tu čítame časti odpovedí vrátane stavového kódu, stavovej správy a hlavičiek a pridávame ich do a StringBuilder inštancia.

Najskôr pridajme informácie o stave odpovede:

fullResponseBuilder.append (con.getResponseCode ()) .append ("") .append (con.getResponseMessage ()) .append ("\ n");

Ďalej dostaneme hlavičky getHeaderFields () a pridajte každý z nich k nášmu StringBuilder vo formáte HeaderName: Hodnoty hlavičky:

con.getHeaderFields (). entrySet (). stream () .filter (entry -> entry.getKey ()! = null) .forEach (entry -> {fullResponseBuilder.append (entry.getKey ()). append (": "); Zoznam headerValues ​​= entry.getValue (); Iterator it = headerValues.iterator (); if (it.hasNext ()) {fullResponseBuilder.append (it.next ()); while (it.hasNext ()) { fullResponseBuilder.append (",") .append (it.next ());}} fullResponseBuilder.append ("\ n");});

Na záver si prečítame obsah odpovede ako sme to urobili predtým a pripojíme ho.

Všimnite si, že getFullResponse metóda overí, či bola požiadavka úspešná alebo nie, aby sa dalo rozhodnúť, či je potrebné ju použiť con.getInputStream () alebo con.getErrorStream () načítať obsah žiadosti.

12. Záver

V tomto článku sme si ukázali, ako môžeme vykonávať požiadavky HTTP pomocou protokolu HttpUrlConnection trieda.

Celý zdrojový kód príkladov nájdete na GitHub.