Doe een eenvoudig HTTP-verzoek in Java

1. Overzicht

In deze korte tutorial presenteren we een manier om HTTP-verzoeken in Java uit te voeren - door de ingebouwde Java-klasse te gebruiken HttpUrlConnection.

Merk op dat Java, beginnend met JDK 11, een nieuwe API biedt voor het uitvoeren van HTTP-verzoeken, die bedoeld is als vervanging voor het HttpUrlConnection, de HttpClient API.

2. HttpUrlConnection

De HttpUrlConnection klasse stelt ons in staat voer standaard HTTP-verzoeken uit zonder het gebruik van extra bibliotheken. Alle klassen die we nodig hebben, maken deel uit van de java.net pakket.

De nadelen van het gebruik van deze methode zijn dat de code kan omslachtiger zijn dan andere HTTP-bibliotheken en biedt geen meer geavanceerde functionaliteiten zoals speciale methoden voor het toevoegen van headers of authenticatie.

3. Een verzoek aanmaken

We kunnen een HttpUrlConnection instantie met behulp van de openConnection () methode van de URL klasse. Merk op dat deze methode alleen een verbindingsobject maakt, maar de verbinding nog niet tot stand brengt.

De HttpUrlConnection class wordt gebruikt voor alle soorten verzoeken door de requestMethod kenmerk toe aan een van de waarden: GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE.

Laten we een verbinding maken met een bepaalde URL met de GET-methode:

URL url = nieuwe URL ("// voorbeeld.com"); HttpURLConnection con = (HttpURLConnection) url.openConnection (); con.setRequestMethod ("GET");

4. Verzoekparameters toevoegen

Als we parameters aan een verzoek willen toevoegen, we moeten de doOutput eigendom aan waaren schrijf vervolgens een Draad van het formulier param1 = waarde¶m2 = waarde naar de OutputStream van de HttpUrlConnection voorbeeld:

Kaartparameters = nieuwe HashMap (); parameters.put ("param1", "val"); con.setDoOutput (true); DataOutputStream out = nieuwe DataOutputStream (con.getOutputStream ()); out.writeBytes (ParameterStringBuilder.getParamsString (parameters)); out.flush (); out.close ();

Om de transformatie van het parameter kaarthebben we een utility class geschreven met de naam ParameterStringBuilder met een statische methode, getParamsString (), dat transformeert een Kaart in een Draad van het vereiste formaat:

openbare klasse ParameterStringBuilder {openbare statische String getParamsString (Mapparams) genereert UnsupportedEncodingException {StringBuilder resultaat = nieuwe StringBuilder (); voor (Map.Entry entry: params.entrySet ()) {result.append (URLEncoder.encode (entry.getKey (), "UTF-8")); result.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. Verzoekkopteksten instellen

Het toevoegen van headers aan een verzoek kan worden bereikt door de setRequestProperty () methode:

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

Om de waarde van een header van een verbinding te lezen, kunnen we de getHeaderField () methode:

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

6. Time-outs configureren

HttpUrlConnection klasse staat toe de verbinding en uitleestime-outs instellen. Deze waarden bepalen het tijdsinterval dat moet worden gewacht tot de verbinding met de server tot stand is gebracht of tot gegevens beschikbaar zijn om te lezen.

Om de time-outwaarden in te stellen, kunnen we de setConnectTimeout () en setReadTimeout () methoden:

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

In het voorbeeld stellen we beide time-outwaarden in op vijf seconden.

7. Omgaan met cookies

De java.net pakket bevat klassen die het werken met cookies vergemakkelijken, zoals Cookie Manager en HttpCookie.

De eerste die lees de cookies uit een reactiekunnen we de waarde van de Set-Cookie header en parseer het naar een lijst met HttpCookie voorwerpen:

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

Vervolgens zullen we voeg de cookies toe aan de cookie-opslag:

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

Laten we eens kijken of er een cookie is aangeroepen gebruikersnaam aanwezig is, en zo niet, dan voegen we het toe aan de cookie-opslag met de waarde "john":

Optioneel usernameCookie = cookies.stream () .findAny (). Filter (cookie -> cookie.getName (). Equals ("gebruikersnaam")); if (gebruikersnaamCookie == null) {cookieManager.getCookieStore (). add (null, nieuwe HttpCookie ("gebruikersnaam", "john")); }

Eindelijk, naar voeg de cookies toe aan het verzoek, we moeten de Koekje header, na het sluiten en heropenen van de verbinding:

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

8. Omgaan met omleidingen

Wij kunnen schakel automatisch volgende omleidingen voor een specifieke verbinding in of uit door de setInstanceFollowRedirects () methode met waar of false parameter:

con.setInstanceFollowRedirects (false);

Het is ook mogelijk om schakel automatische omleiding in of uit voor alle verbindingen:

HttpUrlConnection.setFollowRedirects (false);

Standaard is het gedrag ingeschakeld.

Wanneer een verzoek een statuscode 301 of 302 retourneert, wat een omleiding aangeeft, kunnen we het Plaats header en maak een nieuw verzoek naar de nieuwe URL:

if (status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_MOVED_PERM) {Stringlocatie = con.getHeaderField ("Locatie"); URL newUrl = nieuwe URL (locatie); con = (HttpURLConnection) newUrl.openConnection (); }

9. Het antwoord lezen

Het aflezen van de reactie op het verzoek kan gedaan worden door het ontleden van het InputStream van de HttpUrlConnection voorbeeld.

Om het verzoek uit te voeren, kunnen we de getResponseCode (), aansluiten(), getInputStream () of getOutputStream () methoden:

int status = con.getResponseCode ();

Laten we tot slot het antwoord van het verzoek lezen en het in een inhoud Draad:

BufferedReader in = nieuwe BufferedReader (nieuwe InputStreamReader (con.getInputStream ())); String inputLine; StringBuffer-inhoud = nieuwe StringBuffer (); while ((inputLine = in.readLine ())! = null) {content.append (inputLine); } in.close ();

Naar sluit de verbinding, kunnen we de verbinding verbreken() methode:

con.disconnect (); 

10. Lezen van het antwoord op mislukte verzoeken

Als het verzoek mislukt, probeert u het InputStream van de HttpUrlConnection instantie zal niet werken. In plaats daarvan, we kunnen de stroom van HttpUrlConnection.getErrorStream ().

We kunnen beslissen welke InputStream te gebruiken door de HTTP-statuscode te vergelijken:

int status = con.getResponseCode (); Lezer streamReader = null; if (status> 299) {streamReader = nieuwe InputStreamReader (con.getErrorStream ()); } anders {streamReader = nieuwe InputStreamReader (con.getInputStream ()); }

En tot slot kunnen we de streamReader op dezelfde manier als in het vorige gedeelte.

11. Bouwen aan de volledige respons

Het is niet mogelijk om de volledige responsweergave te krijgen met behulp van de HttpUrlConnection voorbeeld.

Echter, we kunnen het bouwen met behulp van enkele van de methoden die het HttpUrlConnection instantie aanbiedingen:

openbare klasse FullResponseBuilder {openbare statische String getFullResponse (HttpURLConnection con) gooit IOException {StringBuilder fullResponseBuilder = nieuwe StringBuilder (); // lees status en bericht // lees headers // lees reactie inhoud retour fullResponseBuilder.toString (); }}

Hier lezen we de delen van de antwoorden, inclusief de statuscode, statusbericht en kopteksten, en voegen deze toe aan een StringBuilder voorbeeld.

Laten we eerst de informatie over de antwoordstatus toevoegen:

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

Vervolgens krijgen we de headers met behulp van getHeaderFields () en voeg ze allemaal toe aan onze StringBuilder in het formaat HeaderName: HeaderValues:

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

Ten slotte lezen we de inhoud van het antwoord zoals we eerder deden en voeg het toe.

Merk op dat de getFullResponse methode zal valideren of het verzoek succesvol was of niet om te beslissen of het moet worden gebruikt con.getInputStream () of con.getErrorStream () om de inhoud van het verzoek op te halen.

12. Conclusie

In dit artikel hebben we laten zien hoe we HTTP-verzoeken kunnen uitvoeren met behulp van de HttpUrlConnection klasse.

De volledige broncode van de voorbeelden is te vinden op GitHub.


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