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

Java服务端如何解压Python客户端发送的压缩JSON请求数据?

没问题,我来帮你搞定对应的Java服务端实现!先理清楚你的Python客户端核心逻辑:它把JSON格式的请求数据用zlib.compress()压缩后,通过POST请求发送到指定URL。所以Java服务端要完成三个核心步骤:接收压缩请求体、用zlib解压数据、解析JSON并打印内容。

下面给你两种常用的实现方案,你可以根据自己的项目技术栈选择:

方案1:Spring Boot服务端(推荐,现代Java服务端主流选择)

如果你用Spring Boot开发服务端,直接写一个Controller就能搞定,代码如下:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.io.ByteArrayOutputStream;
import java.util.zip.Inflater;

@RestController
public class DataReceiverController {

    // Jackson的ObjectMapper,用来解析JSON
    private final ObjectMapper objectMapper = new ObjectMapper();

    // 匹配客户端请求的URL路径
    @PostMapping("/eventfull/send/data")
    public String handleCompressedRequest(@RequestBody byte[] compressedBytes) throws Exception {
        // 1. 解压zlib压缩的数据
        byte[] decompressedData = decompressZlib(compressedBytes);
        
        // 2. 解析JSON
        JsonNode jsonNode = objectMapper.readTree(decompressedData);
        
        // 3. 格式化打印JSON内容
        System.out.println("Received decompressed JSON data:");
        System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonNode));
        
        return "Data received and processed successfully";
    }

    // 封装zlib解压逻辑
    private byte[] decompressZlib(byte[] compressedData) throws Exception {
        Inflater inflater = new Inflater(); // 默认支持Python zlib.compress()生成的带zlib头的压缩数据
        inflater.setInput(compressedData);
        
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        
        while (!inflater.finished()) {
            int bytesInflated = inflater.inflate(buffer);
            outputStream.write(buffer, 0, bytesInflated);
        }
        
        inflater.end();
        return outputStream.toByteArray();
    }
}

补充说明:

  • 这里直接用@RequestBody byte[]接收请求体,因为你的Python客户端大概率没设置Content-Encoding请求头,Spring不会自动帮你解压,手动处理更稳妥。
  • 如果你的客户端后续加上了headers={"Content-Encoding": "deflate"},也可以配置Spring自动解压,不过手动处理的兼容性更强。

方案2:原生Servlet服务端(适合传统Java Web项目)

如果你的项目是基于原生Servlet的,用下面的代码实现:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.Inflater;

@WebServlet("/eventfull/send/data")
public class DataReceiverServlet extends HttpServlet {

    private final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1. 读取请求体的压缩字节
        byte[] compressedBytes = readRequestBody(request);
        
        try {
            // 2. 解压数据
            byte[] decompressedData = decompressZlib(compressedBytes);
            
            // 3. 解析并打印JSON
            JsonNode jsonNode = objectMapper.readTree(decompressedData);
            System.out.println("Received decompressed JSON data:");
            System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonNode));
            
            response.setStatus(HttpServletResponse.SC_OK);
            response.getWriter().write("Data processed successfully");
        } catch (Exception e) {
            e.printStackTrace();
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            response.getWriter().write("Failed to process data: " + e.getMessage());
        }
    }

    // 读取请求体字节流
    private byte[] readRequestBody(HttpServletRequest request) throws IOException {
        InputStream inputStream = request.getInputStream();
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        return outputStream.toByteArray();
    }

    // zlib解压逻辑,和Spring版本一致
    private byte[] decompressZlib(byte[] compressedData) throws Exception {
        Inflater inflater = new Inflater();
        inflater.setInput(compressedData);
        
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        
        while (!inflater.finished()) {
            int bytesInflated = inflater.inflate(buffer);
            outputStream.write(buffer, 0, bytesInflated);
        }
        
        inflater.end();
        return outputStream.toByteArray();
    }
}

依赖说明:

不管用哪种方案,解析JSON都需要Jackson的依赖,如果是Maven项目,在pom.xml里添加:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 可以替换成最新稳定版 -->
</dependency>

内容的提问来源于stack exchange,提问作者Aamir Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:22:12