Jetty Client为何没有GzipContentEncoder?如何实现请求压缩?
Jetty Client实现请求压缩的方法
Jetty Client本身并未内置请求压缩的编码器,但可以通过自定义ContentEncoder扩展实现请求体的GZIP压缩,以下是具体步骤:
1. 实现自定义GZIP请求编码器
继承Jetty的org.eclipse.jetty.client.util.ContentEncoder类,重写encode方法完成GZIP压缩逻辑:
import org.eclipse.jetty.client.util.ContentEncoder; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.zip.GZIPOutputStream; public class GZIPContentEncoder extends ContentEncoder { public GZIPContentEncoder() { super("gzip"); } @Override public byte[] encode(byte[] content) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (GZIPOutputStream gzipOut = new GZIPOutputStream(baos)) { gzipOut.write(content); } return baos.toByteArray(); } }
2. 注册编码器并发起压缩请求
创建HttpClient实例后,将自定义编码器添加到客户端的内容编码器列表,同时设置对应的请求头告知服务器请求体已压缩:
import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.client.Request; import org.eclipse.jetty.client.util.StringContentProvider; import java.util.concurrent.ExecutionException; public class JettyClientGzipRequest { public static void main(String[] args) throws IOException, InterruptedException, ExecutionException { HttpClient httpClient = new HttpClient(); httpClient.start(); // 注册自定义GZIP编码器 httpClient.getContentEncoders().add(new GZIPContentEncoder()); try { Request request = httpClient.newRequest("http://example.com/api") .method("POST") // 设置请求体并指定gzip编码 .content(new StringContentProvider("待压缩的请求内容"), "text/plain") .contentEncoding("gzip") // 可选:告知服务器客户端支持的响应压缩格式 .header("Accept-Encoding", "gzip, deflate"); request.send(result -> { if (result.isSucceeded()) { System.out.println("请求成功,响应状态码:" + result.getResponse().getStatus()); } else { result.getFailure().printStackTrace(); } }); } finally { httpClient.stop(); } } }
注意事项
- 需确保目标服务器支持解析GZIP压缩的请求体,否则会导致请求解析失败
- 必须显式设置
Content-Encoding: gzip请求头,让服务器知晓请求体的压缩格式 - 若处理流式请求体,需调整编码器实现以支持流式压缩,而非一次性处理字节数组
内容的提问来源于stack exchange,提问作者V John
相关产品推荐
相关产品推荐

