Tegyen egy egyszerű HTTP-kérést Java-ban

1. Áttekintés

Ebben a gyors bemutatóban bemutatjuk a a HTTP kérések Java-ban történő végrehajtásának módja - a beépített Java osztály használatával HttpUrlConnection.

Ne feledje, hogy a JDK 11-től kezdődően a Java egy új API-t biztosít a HTTP-kérések végrehajtásához, amelyet a HttpUrlConnection, a HttpClient API.

2. HttpUrlConnection

A HttpUrlConnection osztály lehetővé teszi számunkra az alapvető HTTP kéréseket bármilyen további könyvtár használata nélkül hajthatja végre. Minden osztály, amelyre szükségünk van, a java.net csomag.

A módszer alkalmazásának hátrányai az a kód nehézkesebb lehet, mint a többi HTTP könyvtár, és hogy nem nyújt fejlettebb funkciókat, például dedikált módszereket a fejlécek hozzáadásához vagy a hitelesítéshez.

3. Kérelem létrehozása

Hozhatunk létre egy HttpUrlConnection például a openConnection () módszere URL osztály. Vegye figyelembe, hogy ez a módszer csak létrehoz egy kapcsolati objektumot, de még nem hozza létre a kapcsolatot.

A HttpUrlConnection osztály minden típusú kéréshez használatos a requestMethod attribútum az egyik értékhez: GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE.

Hozzunk létre egy kapcsolatot egy adott URL-hez a GET módszer segítségével:

URL url = új URL ("// example.com"); HttpURLConnection con = (HttpURLConnection) url.openConnection (); con.setRequestMethod ("GET");

4. Kérési paraméterek hozzáadása

Ha paramétereket akarunk hozzáadni egy kéréshez, be kell állítanunk a doOutput tulajdonhoz igaz, majd írjon egy Húr a forma param1 = érték¶m2 = érték hoz OutputStream a HttpUrlConnection példa:

Térképparaméterek = new HashMap (); paraméterek.put ("param1", "val"); con.setDoOutput (true); DataOutputStream out = új DataOutputStream (con.getOutputStream ()); out.writeBytes (ParameterStringBuilder.getParamsString (paraméterek)); ki.öblítés (); out.close ();

Az átalakulás megkönnyítése érdekében Map paraméter, írtunk egy segédosztályt, amelynek neve: ParameterStringBuilder statikus módszert tartalmaz, getParamsString (), amely átalakítja a Térkép ba be Húr a szükséges formátumban:

public class ParameterStringBuilder {public static String getParamsString (Map params) UnsupportedEncodingException {StringBuilder result = new StringBuilder (); mert (Map.Entry bejegyzés: params.entrySet ()) {result.append (URLEncoder.encode (entry.getKey (), "UTF-8")); eredmény.append ("="); result.append (URLEncoder.encode (entry.getValue (), "UTF-8")); eredmény.append ("&"); } String resultString = eredmény.toString (); return resultString.length ()> 0? resultString.substring (0, resultString.length () - 1): resultString; }}

5. Kérés fejlécek beállítása

Fejlécek hozzáadása egy kéréshez a setRequestProperty () módszer:

con.setRequestProperty ("Tartalom-típus", "alkalmazás / json");

Egy fejléc értékének kiolvasásához egy kapcsolattól használhatjuk a getHeaderField () módszer:

String contentType = con.getHeaderField ("Tartalom-típus");

6. Időkorlátok konfigurálása

HttpUrlConnection osztály megengedi a csatlakozás és az időtúllépés beállítása. Ezek az értékek meghatározzák azt az időintervallumot, amelyig várni kell a szerverrel való kapcsolat létrehozására vagy az adatok rendelkezésre állására az olvasáshoz.

Az időtúllépési értékek beállításához használhatjuk a setConnectTimeout () és setReadTimeout () mód:

con.setConnectTimeout (5000); con.setReadTimeout (5000);

A példában mindkét időtúllépés értékét öt másodpercre állítottuk.

7. A sütik kezelése

A java.net A csomag olyan osztályokat tartalmaz, amelyek megkönnyítik a sütikkel való munkát, mint pl CookieManager és HttpCookie.

Először is olvassa el a cookie-kat egy válaszból, lekérhetjük a Set-Cookie fejlécet, és elemezze a listára HttpCookie tárgyak:

String cookiesHeader = con.getHeaderField ("Set-Cookie"); Listás sütik = HttpCookie.parse (cookiesHeader);

Ezután fogunk adja hozzá a sütiket a sütitárolóhoz:

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

Ellenőrizzük, hogy süti hívott-e felhasználónév jelen van, és ha nem, akkor hozzáadjuk a „john” értékű sütikészlethez:

Opcionális felhasználónévCookie = cookie.stream () .findAny (). Filter (cookie -> cookie.getName (). Egyenlő ("felhasználónév")); if (felhasználónévCookie == null) {cookieManager.getCookieStore (). add (null, új HttpCookie ("felhasználónév", "john")); }

Végül a adja hozzá a sütiket a kéréshez, be kell állítanunk a Aprósütemény fejléc, a kapcsolat lezárása és újbóli megnyitása után:

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

8. Átirányítások kezelése

Tudunk engedélyezze vagy tiltsa le automatikusan egy adott kapcsolat átirányítását követően a setInstanceFollowRedirects () módszerrel igaz vagy hamis paraméter:

con.setInstanceFollowRedirects (hamis);

Az is lehetséges engedélyezze vagy tiltsa le az összes kapcsolat automatikus átirányítását:

HttpUrlConnection.setFollowRedirects (hamis);

Alapértelmezés szerint a viselkedés engedélyezve van.

Amikor egy kérelem 301 vagy 302 állapotkódot ad vissza, amely egy átirányítást jelez, akkor lekérhetjük a Elhelyezkedés fejlécet, és hozzon létre egy új kérést az új URL-re:

if (status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_MOVED_PERM) {String location = con.getHeaderField ("Hely"); URL newUrl = új URL (hely); con = (HttpURLConnection) newUrl.openConnection (); }

9. A válasz elolvasása

A kérés válaszának elolvasása: elemezve a InputStream a HttpUrlConnection példa.

A kérés teljesítéséhez használhatjuk a getResponseCode (), connect (), getInputStream () vagy getOutputStream () mód:

int status = con.getResponseCode ();

Végül olvassuk el a kérés válaszát, és tegyük a tartalom Húr:

BufferedReader in = new BufferedReader (új InputStreamReader (con.getInputStream ())); String inputLine; StringBuffer tartalom = new StringBuffer (); while ((inputLine = in.readLine ())! = null) {content.append (inputLine); } in.close ();

Nak nek zárja le a kapcsolatot, használhatjuk a bontás () módszer:

kon.kapcsolat (); 

10. A sikertelen kérelmekre adott válasz elolvasása

Ha a kérés nem sikerül, akkor próbálja meg elolvasni a InputStream a HttpUrlConnection a példány nem fog működni. Helyette, által elfogyasztott áramot elfogyaszthatjuk HttpUrlConnection.getErrorStream ().

Eldönthetjük, melyik InputStream a HTTP állapotkód összehasonlításával használható:

int status = con.getResponseCode (); Reader streamReader = null; if (állapot> 299) {streamReader = new InputStreamReader (con.getErrorStream ()); } else {streamReader = new InputStreamReader (con.getInputStream ()); }

És végül elolvashatjuk a streamReader ugyanúgy, mint az előző szakasz.

11. A teljes válasz kiépítése

A (z) használatával nem lehet teljes választ ábrázolni HttpUrlConnection példa.

Azonban, felépíthetjük néhány módszer segítségével, amelyek a HttpUrlConnection példányajánlatok:

public class FullResponseBuilder {public static String getFullResponse (HttpURLConnection con) dobja az IOException {StringBuilder fullResponseBuilder = new StringBuilder (); // állapot és üzenet olvasása // fejlécek olvasása // válasz tartalmának visszaadása fullResponseBuilder.toString (); }}

Itt olvassuk a válaszok részeit, beleértve az állapotkódot, az állapotüzenetet és a fejléceket, és hozzáadjuk ezeket a StringBuilder példa.

Először adjuk hozzá a válasz állapotát:

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

Ezután megkapjuk a fejléceket getHeaderFields () és mindegyiket hozzáadja a miénkhez StringBuilder a HeaderName formátumban: HeaderValues:

con.getHeaderFields (). entrySet (). stream () .filter (entry -> entry.getKey ()! = null) .forEach (entry -> {fullResponseBuilder.append (entry.getKey ()). append (": "); List 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");});

Végül elolvassuk a válasz tartalmát mint korábban tettük és csatoltuk.

Vegye figyelembe, hogy a getFullResponse A módszer igazolja, hogy a kérés sikeres volt-e vagy sem, annak eldöntése érdekében, hogy kell-e használni con.getInputStream () vagy con.getErrorStream () hogy lekérjük a kérelem tartalmát.

12. Következtetés

Ebben a cikkben bemutattuk, hogyan tudjuk végrehajtani a HTTP kéréseket a HttpUrlConnection osztály.

A példák teljes forráskódja megtalálható a GitHub oldalon.