Java HttpURLConnection获取HTML响应乱码问题求助及代码示例
Hey there, let's tackle that garbled response issue first—it's a common gotcha with compressed content!
Your garbled output is caused by a simple oversight: you added Accept-Encoding: gzip, deflate to your request headers, which tells the server to send compressed content. But your original code reads the raw compressed binary data directly with InputStreamReader without decompressing it first—hence the unreadable characters.
Fixed Code
Here's the adjusted code with compression handling added:
import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.zip.GZIPInputStream; import java.util.zip.InflaterInputStream; public class HttpExample { public static void main(String[] args) throws IOException { String request = "your target url"; URL url = new URL(request); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // Keep your existing request headers conn.setRequestMethod("GET"); conn.setRequestProperty("Host", "the host site"); conn.setRequestProperty("Upgrade-Insecure-Requests", "1"); conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Linux; Android 4.4.2; SM-G350E Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36"); conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); conn.setRequestProperty("Cache-Control", "max-age=0"); conn.setRequestProperty("Accept-Encoding", "gzip, deflate"); conn.setRequestProperty("Accept-Language", "en-US,en;q=0.8"); conn.setRequestProperty("Referer", "the referer"); conn.setRequestProperty("Cookie", "MASANG_SESSION=4e5cgroc4jp74avrjg0g07d8o0; AWSELB=0FA97BBB0EC801F2C80B193E135DA89732D0ED599FE3E2B41CAFD3B1AC5974239BBAC347246D3B929A392DD3E3ED437652A2CB236E774C97C108D1CE69E0D8E158CB02341A; sso=dcfd12917c9c8c2ee230abd3a38908d8; MASANG_SESSION=4e5cgroc4jp74avrjg0g07d8o0; _ga=GA1.2.1394751435.1517184495; _gid=GA1.2.565595090.1517184495; _gat=1"); conn.setRequestProperty("Accept-Charset", "UTF-8"); // Handle compressed streams InputStream inputStream = conn.getInputStream(); String contentEncoding = conn.getContentEncoding(); if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) { inputStream = new GZIPInputStream(inputStream); } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) { inputStream = new InflaterInputStream(inputStream); } // Read content with explicit UTF-8 encoding BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); String inputLine; while ((inputLine = in.readLine()) != null) { sb.append(inputLine).append(System.lineSeparator()); // Preserve line breaks for proper HTML structure } in.close(); conn.disconnect(); // Don't forget to close the connection // Print the result System.out.println("result:::" + sb.toString()); } }
Key fixes to note:
- Check the
Content-Encodingresponse header to detect compression type - Wrap the input stream with
GZIPInputStreamorInflaterInputStreamif needed - Explicitly specify
StandardCharsets.UTF_8when creatingInputStreamReaderto avoid system default encoding issues - Add line separators back when appending lines to keep HTML structure intact
1. How to Get HTTP Response Body as String in Java?
The core logic is to:
- Retrieve the response input stream (with decompression if needed)
- Read it with a character stream using the correct encoding
- Build the final string
You can wrap this into a reusable utility method:
public static String getHttpResponse(String urlStr) throws IOException { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); InputStream inputStream = conn.getInputStream(); String contentEncoding = conn.getContentEncoding(); if (contentEncoding != null && contentEncoding.equalsIgnoreCase("gzip")) { inputStream = new GZIPInputStream(inputStream); } else if (contentEncoding != null && contentEncoding.equalsIgnoreCase("deflate")) { inputStream = new InflaterInputStream(inputStream); } BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line).append(System.lineSeparator()); } reader.close(); conn.disconnect(); return sb.toString(); }
2. Java HttpURLConnection GET/POST Request Examples
Basic GET Request Example
public static String sendGetRequest(String urlStr) throws IOException { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); // Handle compression InputStream inputStream = conn.getInputStream(); if ("gzip".equalsIgnoreCase(conn.getContentEncoding())) { inputStream = new GZIPInputStream(inputStream); } BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line); } reader.close(); conn.disconnect(); return sb.toString(); }
POST Request Example (Sending Form Data)
import java.net.URLEncoder; import java.util.Map; public static String sendPostRequest(String urlStr, Map<String, String> formParams) throws IOException { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); conn.setDoOutput(true); // Enable output for POST data conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // Build form data string StringBuilder postData = new StringBuilder(); for (Map.Entry<String, String> entry : formParams.entrySet()) { if (postData.length() != 0) postData.append('&'); postData.append(URLEncoder.encode(entry.getKey(), "UTF-8")); postData.append('='); postData.append(URLEncoder.encode(entry.getValue(), "UTF-8")); } // Write data to output stream OutputStream os = conn.getOutputStream(); os.write(postData.toString().getBytes(StandardCharsets.UTF_8)); os.flush(); os.close(); // Read response InputStream inputStream = conn.getInputStream(); if ("gzip".equalsIgnoreCase(conn.getContentEncoding())) { inputStream = new GZIPInputStream(inputStream); } BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line); } reader.close(); conn.disconnect(); return sb.toString(); }
For POST requests, remember to set setDoOutput(true) and use the correct Content-Type header matching your request body format.
内容的提问来源于stack exchange,提问作者hema ezzat

