Kaip naudoti java.net.URLConnection HTTP užklausų paleidimui ir apdorojimui

Jame dažnai pateikiamas java.net.URLConnection naudojimas, o „ Oracle Tutorial“ yra per trumpas.

Ši pamoka iš esmės rodo tik tai, kaip paleisti GET užklausą ir perskaityti atsakymą. Jis niekada nepaaiškina, kaip jį naudoti, kad galėtumėte atlikti POST užklausą, nustatyti užklausų antraštes, skaityti atsakymų antraštes, tvarkyti slapukus, siųsti HTML formą, įkelti failą ir tt

Taigi, kaip aš galiu naudoti java.net.URLConnection paleisti ir apdoroti „išplėstinius“ HTTP užklausas?

1695 m
08 мая '10 в 9:16 2010-05-08 09:16 BalusC yra nustatytas gegužės 08, 10, 09:16, 2010-05-08 09:16
@ 12 atsakymų

Visų pirma, atsisakymas: paskelbti kodo fragmentai yra svarbiausi pavyzdžiai. Jums reikės valdyti ArrayIndexOutOfBoundsException IOException ir RuntimeException , pvz., „ NullPointerException , „ ArrayIndexOutOfBoundsException ir įvertinti save.


Paruošimas

Pirmiausia turime žinoti bent jau URL ir kodavimą. Parametrai yra neprivalomi ir priklauso nuo funkcinių reikalavimų.

 String url = "http://example.com"; String charset = "UTF-8"; // Or in Java 7 and later, use the constant: java.nio.charset.StandardCharsets.UTF_8.name() String param1 = "value1"; String param2 = "value2"; // ... String query = String.format("param1=%s URLEncoder.encode(param1, charset), URLEncoder.encode(param2, charset)); 

Užklausos parametrai turi būti formato name=value ir turi būti derinami > . Paprastai taip pat URL kodavimo užklausos parametrus nurodomas kodavimas naudojant URLEncoder#encode() .

String#format() yra tik patogumui. Man tai patinka, kai reikia daugiau nei du kartus styginių sutankinimo operatoriaus.


Skambinimas HTTP GET su užklausos parametrais (pasirinktinai)

Tai triviška užduotis. Tai yra numatytasis užklausos metodas.

 URLConnection connection = new URL(url + "?" + query).openConnection(); connection.setRequestProperty("Accept-Charset", charset); InputStream response = connection.getInputStream(); // ... 

Bet kuri užklausos eilutė turi būti sujungta su URL naudojant ? . „ Accept-Charset antraštė gali parodyti serveriui, kokie kodavimo parametrai yra. Jei Accept-Charset užklausos eilutės, galite palikti „ Accept-Charset . Jei nereikia nustatyti jokių URL#openStream() , galite naudoti net URL#openStream() metodą URL#openStream() .

 InputStream response = new URL(url).openStream(); // ... 

Bet kuriuo atveju, jei kita šalis yra „ HttpServlet , tada jos „ doGet() ir parametrai bus prieinami „ HttpServletRequest#getParameter() .

Jei norite atlikti bandymus, galite atspausdinti atsakymo kūną į stdout, kaip parodyta žemiau:

 try (Scanner scanner = new Scanner(response)) { String responseBody = scanner.useDelimiter("\\A").next(); System.out.println(responseBody); } 

Atlikite HTTP POST užklausą su užklausos parametrais

Nustatant URLConnection#setDoOutput() į true netiesiogiai nustatomas POST užklausos metodas. Standartinė HTTP POST žiniatinklio formų forma yra tipo application/x-www-form-urlencoded , kur užklausos eilutė parašyta užklausos įstaigai.

 URLConnection connection = new URL(url).openConnection(); connection.setDoOutput(true); // Triggers POST. connection.setRequestProperty("Accept-Charset", charset); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset); try (OutputStream output = connection.getOutputStream()) { output.write(query.getBytes(charset)); } InputStream response = connection.getInputStream(); // ... 

Pastaba: kai norite programiniu būdu išsiųsti HTML formą, nepamirškite <input type="hidden"> bet kurio <input type="hidden"> porų name=value porų į užklausos eilutę ir, žinoma, name=value pora <input type="submit"> kad norite „stumti“ programiškai (nes ji paprastai buvo naudojama serverio pusėje, norint atskirti, ar paspaudžiamas mygtukas, ir, jei taip, koks iš jų).

Taip pat galite perduoti gautą URLConnection prie „ HttpURLConnection ir vietoj to naudoti „ HttpURLConnection#setRequestMethod() . Bet jei bandote naudoti ryšį išėjimui, vis tiek reikia nustatyti URLConnection#setDoOutput() true .

 HttpURLConnection httpConnection = (HttpURLConnection) new URL(url).openConnection(); httpConnection.setRequestMethod("POST"); // ... 

Bet kokiu atveju, jei kita šalis yra „ HttpServlet , tada jos „ doPost() , o parametrai bus prieinami „ HttpServletRequest#getParameter() .


Tiesą sakant, HTTP užklausos pašalinimas

Galite aiškiai paleisti HTTP užklausą, naudodami URLConnection#connect() , tačiau prašymas bus automatiškai paleistas pagal užklausą, kai norite gauti bet kokią informaciją apie HTTP atsakymą, pvz., Atsako kūną, naudodami URLConnection#getInputStream() ir pan. Pirmiau pateikti pavyzdžiai tai daro, todėl connect() yra iš tikrųjų nereikalingas.


HTTP atsakymo informacijos rinkimas

  • HTTP atsakymo būsena :

    Čia jums reikia „ HttpURLConnection . Jei reikia, pirmiausia išsiųskite jį.

     int status = httpConnection.getResponseCode(); 
  • HTTP atsakymo antraštės :

     for (Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) { System.out.println(header.getKey() + "=" + header.getValue()); } 
  • HTTP atsakymo kodavimas :

    Kai Content-Type turi charset parametrą, atsakymo įstaiga greičiausiai grindžiama tekstu, ir norėtume apdoroti atsako kūną nurodytu simbolių kodavimu serverio pusėje.

     String contentType = connection.getHeaderField("Content-Type"); String charset = null; for (String param : contentType.replace(" ", "").split(";")) { if (param.startsWith("charset=")) { charset = param.split("=", 2)[1]; break; } } if (charset != null) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(response, charset))) { for (String line; (line = reader.readLine()) != null;) { // ... System.out.println(line) ? } } } else { // It likely binary content, use InputStream/OutputStream. } 

Sesijos priežiūra

Serverio pusės sesiją paprastai palaiko slapukas. Kai kuriose žiniatinklio formose reikia prisijungti ir / arba sekti sesijos metu. „ CookieHandler API galite naudoti slapukų palaikymui. Prieš siųsdami HTTP užklausas, turite paruošti „ CookieManager su „ CookiePolicy ACCEPT_ALL .

 // First set the default cookie manager. CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL)); // All the following subsequent URLConnections will use the same cookie manager. URLConnection connection = new URL(url).openConnection(); // ... connection = new URL(url).openConnection(); // ... connection = new URL(url).openConnection(); // ... 

Atkreipkite dėmesį, kad tai, kaip žinote, ne visada tinkamai veikia bet kokiomis aplinkybėmis. Jei jums nepavyksta, geriausia būtų rankiniu būdu sukompiliuoti ir nustatyti slapukų antraštes. Iš esmės turite užfiksuoti visus „ Set-Cookie antraštes iš prisijungimo atsakymo arba pirmosios GET užklausos, o tada persiųsti ją per vėlesnius prašymus.

 // Gather all cookies on the first request. URLConnection connection = new URL(url).openConnection(); List<String> cookies = connection.getHeaderFields().get("Set-Cookie"); // ... // Then use the same cookies on all subsequent requests. connection = new URL(url).openConnection(); for (String cookie : cookies) { connection.addRequestProperty("Cookie", cookie.split(";", 2)[0]); } // ... 

split(";", 2)[0] egzistuoja, kad atsikratytų slapukų požymių, nesusijusių su serverio pusėje, pvz., expires , path ir tt Taip pat galite naudoti cookie.substring(0, cookie.indexOf(';')) vietoj split() .


Srautinio transliavimo režimas

HttpURLConnection “ pagal nutylėjimą buferis visą užklausos HttpURLConnection prieš jį faktiškai siunčiant, neatsižvelgiant į tai, ar fiksuotas turinio ilgis nustatomas nepriklausomai naudojant connection.setRequestProperty("Content-Length", contentLength); . Tai gali sukelti „ OutOfMemoryException kai vienu metu siunčiate didelius POST užklausas (pavyzdžiui, įkeliate failus). Norėdami to išvengti, turite nustatyti HttpURLConnection#setFixedLengthStreamingMode() .

 httpConnection.setFixedLengthStreamingMode(contentLength); 

Bet jei turinio ilgis iš tikrųjų nėra žinomas iš anksto, galite naudoti srautinio režimo režimą, atitinkamai nustatydami „ HttpURLConnection#setChunkedStreamingMode() . Tai nustato „HTTP Transfer-Encoding antraštę chunked , todėl užklausos įstaiga siunčiama gabalais. Toliau pateiktas pavyzdys siunčia kūną į 1 KB gabalus.

 httpConnection.setChunkedStreamingMode(1024); 

Vartotojo agentas

Gali atsitikti, kad užklausa grąžina netikėtą atsakymą, o ji veikia gerai su tikra žiniatinklio naršykle. Serverio pusė tikriausiai blokuoja užklausas pagal User-Agent užklausos antraštę. URLConnection numatytasis Java/1.6.0_19 , kur paskutinė dalis akivaizdžiai yra JRE versija. Galite pakeisti šią funkciją:

 connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"); // Do as if you're using Chrome 41 on Windows 7. 

Naudokite eilutę User-Agent iš naujausios naršyklės .


Klaidų tvarkymas

Jei HTTP atsakymo kodas yra 4nn (kliento klaida) arba 5nn (serverio klaida), galite perskaityti HttpURLConnection#getErrorStream() kad sužinotumėte, ar serveris atsiuntė naudingų klaidų duomenų.

 InputStream error = ((HttpURLConnection) connection).getErrorStream(); 

Jei HTTP atsakymo kodas yra -1, kažkas nepavyko, kai buvo tvarkomas ryšys ir atsakymas. „ HttpURLConnection atliekamas senose HttpURLConnection , šiek tiek iškreiptas, kai nuorodos išsaugomos. Galite jį išjungti, nustatydami http.keepAlive sistemos nuosavybę į false . Tai galite padaryti programiškai programos pradžioje:

 System.setProperty("http.keepAlive", "false"); 

Failo įkėlimas

Paprastai naudojate kelių multipart/form-data kodavimą mišriam POST turiniui (dvejetainiai ir simboliai). Kodavimas išsamiau aprašytas RFC2388 .

 String param = "value"; File textFile = new File("/path/to/file.txt"); File binaryFile = new File("/path/to/file.bin"); String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value. String CRLF = "\r\n"; // Line separator required by multipart/form-data. URLConnection connection = new URL(url).openConnection(); connection.setDoOutput(true); connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); try ( OutputStream output = connection.getOutputStream(); PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, charset), true); ) { // Send normal param. writer.append("--" + boundary).append(CRLF); writer.append("Content-Disposition: form-data; name=\"param\"").append(CRLF); writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF); writer.append(CRLF).append(param).append(CRLF).flush(); // Send text file. writer.append("--" + boundary).append(CRLF); writer.append("Content-Disposition: form-data; name=\"textFile\"; filename=\"" + textFile.getName() + "\"").append(CRLF); writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF); // Text file itself must be saved in this charset! writer.append(CRLF).flush(); Files.copy(textFile.toPath(), output); output.flush(); // Important before continuing with writer! writer.append(CRLF).flush(); // CRLF is important! It indicates end of boundary. // Send binary file. writer.append("--" + boundary).append(CRLF); writer.append("Content-Disposition: form-data; name=\"binaryFile\"; filename=\"" + binaryFile.getName() + "\"").append(CRLF); writer.append("Content-Type: " + URLConnection.guessContentTypeFromName(binaryFile.getName())).append(CRLF); writer.append("Content-Transfer-Encoding: binary").append(CRLF); writer.append(CRLF).flush(); Files.copy(binaryFile.toPath(), output); output.flush(); // Important before continuing with writer! writer.append(CRLF).flush(); // CRLF is important! It indicates end of boundary. // End of multipart/form-data. writer.append("--" + boundary + "--").append(CRLF).flush(); } 

Jei kita pusė yra „ HttpServlet , tuomet jos „ doPost() ir dalys bus prieinamos „ HttpServletRequest#getPart() (atkreipkite dėmesį, taigi ne getParameter() ir tt!). Tačiau metodas getPart() yra palyginti naujas, jis įvedamas Servlet 3.0 (Glassfish 3, Tomcat 7 ir tt). Prieš pradedant „Servlet 3.0“, naudokite „ Apache Commons FileUpload“, kad analizuotumėte multipart/form-data užklausą. Taip pat žr. Šį atsakymą į FileUpload ir Servelt 3.0 metodų pavyzdžius.


Dirbkite su nepatikimomis arba netinkamai sukonfigūruotomis HTTPS svetainėmis

Kartais reikia įtraukti HTTPS URL, galbūt todėl, kad rašote žiniatinklio grandiklį. Tokiu atveju greičiausiai susidursite su javax.net.ssl.SSLException: Not trusted server certificate kai kuriose HTTPS svetainėse, kurios neatnaujina SSL sertifikatų, arba java.security.cert.CertificateException: No subject alternative DNS name matching [hostname] found arba javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name kai kurie netinkamai sukonfigūruoti HTTPS puslapiai.

Kitas vienkartinis static HttpsURLConnection jūsų žiniatinklio grandiklio klasėje turėtų padaryti „ HttpsURLConnection švelnesnę šių HTTPS svetainių atžvilgiu ir todėl HttpsURLConnection šių išimčių.

 static { TrustManager[] trustAllCertificates = new TrustManager[] { new X509TrustManager() { @Override public X509Certificate[] getAcceptedIssuers() { return null; // Not relevant. } @Override public void checkClientTrusted(X509Certificate[] certs, String authType) { // Do nothing. Just allow them all. } @Override public void checkServerTrusted(X509Certificate[] certs, String authType) { // Do nothing. Just allow them all. } } }; HostnameVerifier trustAllHostnames = new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; // Just allow them all. } }; try { System.setProperty("jsse.enableSNIExtension", "false"); SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCertificates, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HttpsURLConnection.setDefaultHostnameVerifier(trustAllHostnames); } catch (GeneralSecurityException e) { throw new ExceptionInInitializerError(e); } } 

Paskutiniai žodžiai

Apache HttpComponents HttpClient yra daug patogiau :)


HTML analizavimas ir išgavimas

Jei viskas, ko jums reikia, analizuoja ir išgauna duomenis iš HTML, geriau naudoti HTML analizatorių, pvz., Jsoup

2465
08 мая '10 в 9:16 2010-05-08 09:16 atsakymą pateikė BalusC gegužės 8 d. 10 val. 9:16 2010-05-08 09:16

Dirbant su HTTP, beveik visada naudinga kreiptis į „ HttpURLConnection o ne į bazinės klasės „ URLConnection (nes URLConnection yra abstrakta klasė, kai prašote URLConnection.openConnection() prie HTTP URL, vis tiek grįšite).

Tada vietoj httpURLConnection.setRequestMethod("POST") , kuris gali būti natūralesnis (o taip pat leidžia nurodyti kitus užklausos metodus, pvz., PUT, DELETE, ...).

border=0

Ji taip pat suteikia naudingų HTTP konstantų, kad galėtumėte:

 int responseCode = httpURLConnection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { 
80
06 дек. Paal Thorstensen atsakymas 06 d. 2011-12-06 05:20 '11, 5:20, 2011-12-06 05:20

Įkvėptas šio ir kitų klausimų apie SO, sukūriau minimalų atviro kodo -htt-kliento šaltinį, kuris įkūnija daugumą čia aptinkamų metodų.

„google-http-java-client“ taip pat yra puikus atviro kodo šaltinis.

47
13 июня '12 в 19:37 2012-06-13 19:37 Atsakymą davė Davidas Chandleris birželio 13 d. 12 val. 7:37 2012-06-06 19:37

Yra dvi parinktys, kurias galite naudoti su HTTP URL: GET / POST

GET užklausa: -

 HttpURLConnection.setFollowRedirects(true); // defaults to true String url = "https://name_of_the_url"; URL request_url = new URL(url); HttpURLConnection http_conn = (HttpURLConnection)request_url.openConnection(); http_conn.setConnectTimeout(100000); http_conn.setReadTimeout(100000); http_conn.setInstanceFollowRedirects(true); System.out.println(String.valueOf(http_conn.getResponseCode())); 

POST užklausa: -

 HttpURLConnection.setFollowRedirects(true); // defaults to true String url = "https://name_of_the_url" URL request_url = new URL(url); HttpURLConnection http_conn = (HttpURLConnection)request_url.openConnection(); http_conn.setConnectTimeout(100000); http_conn.setReadTimeout(100000); http_conn.setInstanceFollowRedirects(true); http_conn.setDoOutput(true); PrintWriter out = new PrintWriter(http_conn.getOutputStream()); if (urlparameter != null) { out.println(urlparameter); } out.close(); out = null; System.out.println(String.valueOf(http_conn.getResponseCode())); 
19
18 дек. atsakymą pateikė Utkash Bhatt 18 d. 2014-12-18 15:58 '14, 15:58 2014-12-18 15:58

Man taip pat įkvėpė šis atsakymas.

Dažnai dalyvauju projektuose, kuriuose turiu atlikti HTTP, ir galbūt nenoriu naudoti daugelio trečiųjų šalių priklausomybių (kurias pateikia kiti ir tt ir tt).

Pradėjau rašyti savo komunalines paslaugas, remiantis kai kuriais iš šių pokalbių (ne viskas, kas buvo padaryta):

 package org.boon.utils; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.util.Map; import static org.boon.utils.IO.read; public class HTTP { 

Tada yra tik krūva ar statiniai metodai.

 public static String get( final String url) { Exceptions.tryIt(() -> { URLConnection connection; connection = doGet(url, null, null, null); return extractResponseString(connection); }); return null; } public static String getWithHeaders( final String url, final Map<String, ? extends Object> headers) { URLConnection connection; try { connection = doGet(url, headers, null, null); return extractResponseString(connection); } catch (Exception ex) { Exceptions.handle(ex); return null; } } public static String getWithContentType( final String url, final Map<String, ? extends Object> headers, String contentType) { URLConnection connection; try { connection = doGet(url, headers, contentType, null); return extractResponseString(connection); } catch (Exception ex) { Exceptions.handle(ex); return null; } } public static String getWithCharSet( final String url, final Map<String, ? extends Object> headers, String contentType, String charSet) { URLConnection connection; try { connection = doGet(url, headers, contentType, charSet); return extractResponseString(connection); } catch (Exception ex) { Exceptions.handle(ex); return null; } } 

Tada rašykite ...

 public static String postBody( final String url, final String body) { URLConnection connection; try { connection = doPost(url, null, "text/plain", null, body); return extractResponseString(connection); } catch (Exception ex) { Exceptions.handle(ex); return null; } } public static String postBodyWithHeaders( final String url, final Map<String, ? extends Object> headers, final String body) { URLConnection connection; try { connection = doPost(url, headers, "text/plain", null, body); return extractResponseString(connection); } catch (Exception ex) { Exceptions.handle(ex); return null; } } public static String postBodyWithContentType( final String url, final Map<String, ? extends Object> headers, final String contentType, final String body) { URLConnection connection; try { connection = doPost(url, headers, contentType, null, body); return extractResponseString(connection); } catch (Exception ex) { Exceptions.handle(ex); return null; } } public static String postBodyWithCharset( final String url, final Map<String, ? extends Object> headers, final String contentType, final String charSet, final String body) { URLConnection connection; try { connection = doPost(url, headers, contentType, charSet, body); return extractResponseString(connection); } catch (Exception ex) { Exceptions.handle(ex); return null; } } private static URLConnection doPost(String url, Map<String, ? extends Object> headers, String contentType, String charset, String body ) throws IOException { URLConnection connection; connection = new URL(url).openConnection(); connection.setDoOutput(true); manageContentTypeHeaders(contentType, charset, connection); manageHeaders(headers, connection); IO.write(connection.getOutputStream(), body, IO.CHARSET); return connection; } private static void manageHeaders(Map<String, ? extends Object> headers, URLConnection connection) { if (headers != null) { for (Map.Entry<String, ? extends Object> entry : headers.entrySet()) { connection.setRequestProperty(entry.getKey(), entry.getValue().toString()); } } } private static void manageContentTypeHeaders(String contentType, String charset, URLConnection connection) { connection.setRequestProperty("Accept-Charset", charset == null ? IO.CHARSET : charset); if (contentType!=null  !contentType.isEmpty()) { connection.setRequestProperty("Content-Type", contentType); } } private static URLConnection doGet(String url, Map<String, ? extends Object> headers, String contentType, String charset) throws IOException { URLConnection connection; connection = new URL(url).openConnection(); manageContentTypeHeaders(contentType, charset, connection); manageHeaders(headers, connection); return connection; } private static String extractResponseString(URLConnection connection) throws IOException {  HttpURLConnection http = (HttpURLConnection)connection; int status = http.getResponseCode(); String charset = getCharset(connection.getHeaderField("Content-Type")); if (status==200) { return readResponseBody(http, charset); } else { return readErrorResponseBody(http, status, charset); } } private static String readErrorResponseBody(HttpURLConnection http, int status, String charset) { InputStream errorStream = http.getErrorStream(); if ( errorStream!=null ) { String error = charset== null ? read( errorStream ) : read( errorStream, charset ); throw new RuntimeException("STATUS CODE =" + status + "\n\n" + error); } else { throw new RuntimeException("STATUS CODE =" + status); } } private static String readResponseBody(HttpURLConnection http, String charset) throws IOException { if (charset != null) { return read(http.getInputStream(), charset); } else { return read(http.getInputStream()); } } private static String getCharset(String contentType) { if (contentType==null) { return null; } String charset = null; for (String param : contentType.replace(" ", "").split(";")) { if (param.startsWith("charset=")) { charset = param.split("=", 2)[1]; break; } } charset = charset == null ? IO.CHARSET : charset; return charset; } 

Na, jūs suprantate, kad ...

Čia pateikiami testai:

 static class MyHandler implements HttpHandler { public void handle(HttpExchange t) throws IOException { InputStream requestBody = t.getRequestBody(); String body = IO.read(requestBody); Headers requestHeaders = t.getRequestHeaders(); body = body + "\n" + copy(requestHeaders).toString(); t.sendResponseHeaders(200, body.length()); OutputStream os = t.getResponseBody(); os.write(body.getBytes()); os.close(); } } @Test public void testHappy() throws Exception { HttpServer server = HttpServer.create(new InetSocketAddress(9212), 0); server.createContext("/test", new MyHandler()); server.setExecutor(null); // creates a default executor server.start(); Thread.sleep(10); Map<String,String> headers = map("foo", "bar", "fun", "sun"); String response = HTTP.postBodyWithContentType("http://localhost:9212/test", headers, "text/plain", "hi mom"); System.out.println(response); assertTrue(response.contains("hi mom")); assertTrue(response.contains("Fun=[sun], Foo=[bar]")); response = HTTP.postBodyWithCharset("http://localhost:9212/test", headers, "text/plain", "UTF-8", "hi mom"); System.out.println(response); assertTrue(response.contains("hi mom")); assertTrue(response.contains("Fun=[sun], Foo=[bar]")); response = HTTP.postBodyWithHeaders("http://localhost:9212/test", headers, "hi mom"); System.out.println(response); assertTrue(response.contains("hi mom")); assertTrue(response.contains("Fun=[sun], Foo=[bar]")); response = HTTP.get("http://localhost:9212/test"); System.out.println(response); response = HTTP.getWithHeaders("http://localhost:9212/test", headers); System.out.println(response); assertTrue(response.contains("Fun=[sun], Foo=[bar]")); response = HTTP.getWithContentType("http://localhost:9212/test", headers, "text/plain"); System.out.println(response); assertTrue(response.contains("Fun=[sun], Foo=[bar]")); response = HTTP.getWithCharSet("http://localhost:9212/test", headers, "text/plain", "UTF-8"); System.out.println(response); assertTrue(response.contains("Fun=[sun], Foo=[bar]")); Thread.sleep(10); server.stop(0); } @Test public void testPostBody() throws Exception { HttpServer server = HttpServer.create(new InetSocketAddress(9220), 0); server.createContext("/test", new MyHandler()); server.setExecutor(null); // creates a default executor server.start(); Thread.sleep(10); Map<String,String> headers = map("foo", "bar", "fun", "sun"); String response = HTTP.postBody("http://localhost:9220/test", "hi mom"); assertTrue(response.contains("hi mom")); Thread.sleep(10); server.stop(0); } @Test(expected = RuntimeException.class) public void testSad() throws Exception { HttpServer server = HttpServer.create(new InetSocketAddress(9213), 0); server.createContext("/test", new MyHandler()); server.setExecutor(null); // creates a default executor server.start(); Thread.sleep(10); Map<String,String> headers = map("foo", "bar", "fun", "sun"); String response = HTTP.postBodyWithContentType("http://localhost:9213/foo", headers, "text/plain", "hi mom"); System.out.println(response); assertTrue(response.contains("hi mom")); assertTrue(response.contains("Fun=[sun], Foo=[bar]")); Thread.sleep(10); server.stop(0); } 

Čia galite rasti kitus:

https://github.com/RichardHightower/boon

Mano tikslas yra pateikti bendrus dalykus, kuriuos norėčiau padaryti šiek tiek paprastesniu būdu nei tada.

17
17 окт. Atsakymas, kurį pateikė RickHigh Oct 17 '13 в 8:35 2013-10-17 08:35

Я предлагаю вам взглянуть на код kevinsawicki/http-request , в основном это оболочка поверх HttpUrlConnection , он предоставляет гораздо более простой API, если вы просто хочу сделать запросы прямо сейчас, или вы можете взглянуть на источники (они не слишком большие), чтобы посмотреть, как обрабатываются соединения.

Pavyzdys. Сделайте запрос GET с типом контента application/json и некоторыми параметрами запроса:

 // GET http://google.com?q=baseball%20gloves String response = HttpRequest.get("http://google.com", true, "q", "baseball gloves", "size", 100) .accept("application/json") .body(); System.out.println("Response was: " + response); 
17
ответ дан fernandohur 25 окт. '14 в 0:57 2014-10-25 00:57

Первоначально я был введен в заблуждение этой статьей , которая поддерживает HttpClient .

Позже я понял, что HttpURLConnection собирается остаться из этого статьи

В соответствии с блогом Google :