You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java HttpURLConnection获取HTML响应乱码问题求助及代码示例

Hey there, let's tackle that garbled response issue first—it's a common gotcha with compressed content!

解决HttpURLConnection GET请求乱码问题

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-Encoding response header to detect compression type
  • Wrap the input stream with GZIPInputStream or InflaterInputStream if needed
  • Explicitly specify StandardCharsets.UTF_8 when creating InputStreamReader to avoid system default encoding issues
  • Add line separators back when appending lines to keep HTML structure intact

Answers to Your Other Questions

1. How to Get HTTP Response Body as String in Java?

The core logic is to:

  1. Retrieve the response input stream (with decompression if needed)
  2. Read it with a character stream using the correct encoding
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:55:44