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
相关产品推荐
相关产品推荐

