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.