Lav en simpel HTTP-anmodning i Java

1. Oversigt

I denne hurtige vejledning præsenterer vi en måde at udføre HTTP-anmodninger på Java - ved hjælp af den indbyggede Java-klasse HttpUrlConnection.

Bemærk, at startende med JDK 11 giver Java en ny API til udførelse af HTTP-anmodninger, som er beregnet som en erstatning for HttpUrlConnection, det HttpClient API.

2. HttpUrlConnection

Det HttpUrlConnection klasse tillader os at udføre grundlæggende HTTP-anmodninger uden brug af yderligere biblioteker. Alle de klasser, vi har brug for, er en del af java.net pakke.

Ulemperne ved at bruge denne metode er, at koden kan være mere besværlig end andre HTTP-biblioteker, og at den ikke giver mere avancerede funktioner såsom dedikerede metoder til tilføjelse af headere eller godkendelse.

3. Oprettelse af en anmodning

Vi kan oprette en HttpUrlConnection eksempel ved hjælp af openConnection () metode til URL klasse. Bemærk, at denne metode kun opretter et forbindelsesobjekt, men ikke opretter forbindelsen endnu.

Det HttpUrlConnection klasse bruges til alle typer anmodninger ved at indstille anmodningMetode attribut til en af ​​værdierne: FÅ, POST, HEAD, INDSTILLINGER, PUT, SLET, SPOR.

Lad os oprette en forbindelse til en given URL ved hjælp af GET-metoden:

URL url = ny URL ("// eksempel.com"); HttpURLConnection con = (HttpURLConnection) url.openConnection (); con.setRequestMethod ("GET");

4. Tilføjelse af anmodningsparametre

Hvis vi vil føje parametre til en anmodning, vi er nødt til at indstille doOutput ejendom til rigtigt, skriv derefter en Snor af formularen param1 = værdi¶m2 = værdi til OutputStream af HttpUrlConnection eksempel:

Kortparametre = nyt HashMap (); parameters.put ("param1", "val"); con.setDoOutput (sand); DataOutputStream out = ny DataOutputStream (con.getOutputStream ()); out.writeBytes (ParameterStringBuilder.getParamsString (parametre)); out.flush (); out.close ();

For at lette transformation af parameter Kort, vi har skrevet en hjælpeklasse kaldet ParameterStringBuilder indeholdende en statisk metode, getParamsString (), der forvandler en Kort ind i en Snor af det krævede format:

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

5. Indstilling af anmodningsoverskrifter

Tilføjelse af overskrifter til en anmodning kan opnås ved hjælp af setRequestProperty () metode:

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

For at læse værdien af ​​et header fra en forbindelse kan vi bruge getHeaderField () metode:

Streng contentType = con.getHeaderField ("Content-Type");

6. Konfiguration af timeouts

HttpUrlConnection klasse tillader indstilling af forbindelses- og læs-timeout. Disse værdier definerer tidsintervallet for at vente på, at forbindelsen til serveren oprettes, eller data skal være tilgængelige til læsning.

For at indstille timeoutværdierne kan vi bruge setConnectTimeout () og setReadTimeout () metoder:

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

I eksemplet indstiller vi begge timeoutværdier til fem sekunder.

7. Håndtering af cookies

Det java.net pakken indeholder klasser, der letter arbejdet med cookies som f.eks CookieManager og HttpCookie.

Først til læse cookies fra et svar, kan vi hente værdien af Set-Cookie header og parse det til en liste over HttpCookie genstande:

String cookiesHeader = con.getHeaderField ("Set-Cookie"); List cookies = HttpCookie.parse (cookiesHeader);

Dernæst gør vi det tilføj cookies til cookiebutikken:

cookies.forEach (cookie -> cookieManager.getCookieStore (). tilføj (null, cookie));

Lad os kontrollere, om en cookie ringede brugernavn er til stede, og hvis ikke, vil vi føje det til cookiebutikken med værdien "john":

Valgfrit brugernavnCookie = cookies.stream () .findAny (). Filter (cookie -> cookie.getName (). Er lig med ("brugernavn")); hvis (brugernavnCookie == null) {cookieManager.getCookieStore (). tilføj (null, ny HttpCookie ("brugernavn", "john")); }

Endelig til tilføj cookies til anmodningen, skal vi indstille Cookie header efter lukning og genåbning af forbindelsen:

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

8. Håndtering af omdirigeringer

Vi kan aktivere eller deaktivere automatisk efter omdirigeringer til en bestemt forbindelse ved hjælp af setInstanceFollowRedirects () metode med rigtigt eller falsk parameter:

con.setInstanceFollowRedirects (false);

Det er også muligt at aktivere eller deaktivere automatisk omdirigering for alle forbindelser:

HttpUrlConnection.setFollowRedirects (false);

Opførelsen er som standard aktiveret.

Når en anmodning returnerer en statuskode 301 eller 302, der angiver en omdirigering, kan vi hente Beliggenhed header og opret en ny anmodning til den nye URL:

hvis (status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_MOVED_PERM) {String location = con.getHeaderField ("Location"); URL newUrl = ny URL (placering); con = (HttpURLConnection) newUrl.openConnection (); }

9. Læsning af svaret

Læsning af svaret på anmodningen kan gøres ved analysering af InputStream af HttpUrlConnection eksempel.

For at udføre anmodningen kan vi bruge getResponseCode (), Opret forbindelse(), getInputStream () eller getOutputStream () metoder:

int status = con.getResponseCode ();

Lad os endelig læse svaret på anmodningen og placere den i en indhold Snor:

BufferedReader in = ny BufferedReader (ny InputStreamReader (con.getInputStream ())); Streng inputLine; StringBuffer indhold = nyt StringBuffer (); mens ((inputLine = in.readLine ())! = null) {content.append (inputLine); } in.close ();

Til luk forbindelsen, kan vi bruge koble fra() metode:

con.disconnect (); 

10. Læsning af svaret på mislykkede anmodninger

Hvis anmodningen mislykkes, forsøger du at læse InputStream af HttpUrlConnection eksempel fungerer ikke. I stedet, vi kan forbruge den strøm, der leveres af HttpUrlConnection.getErrorStream ().

Vi kan beslutte hvilken InputStream at bruge ved at sammenligne HTTP-statuskoden:

int status = con.getResponseCode (); Læser streamReader = null; hvis (status> 299) {streamReader = ny InputStreamReader (con.getErrorStream ()); } andet {streamReader = ny InputStreamReader (con.getInputStream ()); }

Og endelig kan vi læse streamReader på samme måde som det foregående afsnit.

11. Opbygning af det fulde svar

Det er ikke muligt at få den fulde svarrepræsentation ved hjælp af HttpUrlConnection eksempel.

Imidlertid, vi kan bygge det ved hjælp af nogle af de metoder, som HttpUrlConnection instans tilbud:

offentlig klasse FullResponseBuilder {offentlig statisk streng getFullResponse (HttpURLConnection con) kaster IOException {StringBuilder fullResponseBuilder = ny StringBuilder (); // læse status og besked // læse overskrifter // læse svar indhold returnere fullResponseBuilder.toString (); }}

Her læser vi delene af svarene, herunder statuskode, statusmeddelelse og overskrifter, og føjer disse til en StringBuilder eksempel.

Lad os først tilføje svarstatusoplysningerne:

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

Dernæst får vi overskrifterne med getHeaderFields () og tilføj hver af dem til vores StringBuilder i formatet headernavn: HeaderValues:

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

Endelig læser vi svarets indhold som vi gjorde tidligere, og tilføj det.

Bemærk, at getFullResponse metoden vil validere, om anmodningen var vellykket eller ej for at afgøre, om den skal bruges con.getInputStream () eller con.getErrorStream () for at hente anmodningens indhold.

12. Konklusion

I denne artikel viste vi, hvordan vi kan udføre HTTP-anmodninger ved hjælp af HttpUrlConnection klasse.

Den fulde kildekode for eksemplerne kan findes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found