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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:37:06