CSB 按照 HTTP 协议的规范实现了 HTTP 请求和响应内容的压缩传输。

使用约束

  • 仅支持新版本服务(serviceModel version: 2.0)。
  • 仅支持 gzip 压缩。

前提条件

使用的 CSB SDK 版本为 http-client-1.1.5.8ws-client-1.1.5.8

application/x-www-form-urlencoded 请求压缩

  • 修改 CSB 客户端代码

    示例代码:

    HttpParameters.Builder builder = new HttpParameters.Builder();
    builder.requestURL("http://localhost:8086/CSB") // 设置CSB服务地址。CSB服务地址即创建该实例时绑定的SLB的地址。
      .api("http2http1") // 设置服务名
      .version("1.0.0") // 设置版本号
      .method("post") // 设置调用方式, get/post
      .accessKey("ak").secretKey("sk"); // 设置 accessKey 和 secretKey
    
    try {
      builder.setContentEncoding(ContentEncoding.gzip);//设置请求消息压缩
    
      // 设置请求参数
      builder.putParamsMap("name", "name中文1").putParamsMap("times", "3");
      HttpReturn ret = HttpCaller.invokeReturn(builder.build());
    } catch (HttpCallerException e) {
      // error process
    }

    HTTP 请求示例如下:

    application/x-www-form-urlencoded 请求压缩-HTTP
  • 业务服务端处理方式

    根据 Content-Encoding: gzip 判断请求消息是否压缩,并正确解压,然后再使用 URL 解码参数。

Content-Type: application/json 请求压缩

  • 修改 CSB 客户端代码

    示例代码:

    HttpParameters.Builder builder = new HttpParameters.Builder();
    builder.requestURL("http://localhost:8086/CSB") // 设置 CSB 服务地址。CSB服务地址即创建该实例时绑定的SLB的地址。
      .api("http2http1") // 设置服务名
      .version("1.0.0") // 设置版本号
      .method("post") // 设置调用方式, get/post
      .accessKey("ak").secretKey("sk"); // 设置accessKey 和 设置secretKey
    
    try {
      builder.setContentEncoding(ContentEncoding.gzip);//设置请求消息压缩
    
      // 设置请求参数
      builder.putParamsMap("name", "name1中文sdfs sdlkfsadfksdkfds").putParamsMap("times", "3");
      Map<String, String> kvMap = new HashMap<String, String>();
      for (int i = 0; i < 100; ++i) {
        kvMap.put(String.valueOf(i), "abc中文佛挡杀佛顶替枯lksd" + i);
      }
      builder.contentBody(new ContentBody(JSON.toJSONString(kvMap)));
    } catch (HttpCallerException e) {
      // error process
    }

    HTTP 请求示例如下:

    Content-Type: application/json 请求压缩-HTTP
  • 业务服务端处理方式

    根据 Content-Encoding: gzip 判断请求消息是否压缩,并正确解压。

application/octet-stream 请求压缩

  • 修改 CSB 客户端代码

    示例代码:

    HttpParameters.Builder builder = new HttpParameters.Builder();
    builder.requestURL("http://localhost:8086/CSB") // 设置 CSB 服务地址。CSB服务地址即创建该实例时绑定的SLB的地址。
      .api("http2http1") // 设置服务名
      .version("1.0.0") // 设置版本号
      .method("post") // 设置调用方式, get/post
      .accessKey("ak").secretKey("sk"); // 设置accessKey 和 设置secretKey
    
    try {
      builder.setContentEncoding(ContentEncoding.gzip);//设置请求消息压缩
    
      // 设置请求参数
      builder.putParamsMap("name", "name中文1").putParamsMap("times", "3");
      builder.contentBody(new ContentBody(new File("文件名.xxx")));
      HttpReturn ret = HttpCaller.invokeReturn(builder.build());
    } catch (HttpCallerException e) {
      // error process
    }

    HTTP 请求示例如下:

    application/octet-stream 请求压缩
  • 业务服务端处理方式

    根据 Content-Encoding: gzip 判断请求消息是否压缩,并正确解压。

multipart/form-data 请求压缩

  • 修改 CSB 客户端代码

    示例代码:

    HttpParameters.Builder builder = new HttpParameters.Builder();
    builder.requestURL("http://localhost:8086/CSB") // 设置请求的URL
      .api("http2http1") // 设置服务名
      .version("1.0.0") // 设置版本号
      .method("post") // 设置调用方式, get/post
      .accessKey("ak").secretKey("sk"); // 设置accessKey和secretKey
    
    try {
      builder.setContentEncoding(ContentEncoding.gzip);//设置请求消息压缩
    
      // 设置form请求参数
      builder.putParamsMap("times", "2").putParamsMap("name", "we中文wesdsfsfdsasdefds");
    
      //设置上传附件
      builder.addAttachFile("file1", new File("文件名1.xxx")); //默认按请求消息的压缩标记来判断是否压纹
      builder.addAttachFile("file2", "fileName2", new FileInputStream(new File("文件名2.yyy")),ContentEncoding.none);  //明确不压缩
    
      HttpReturn ret = HttpCaller.invokeReturn(builder.build());
    } catch (Exception e) {
      // error process
    }

    HTTP 请求示例如下:

    multipart/form-data 请求压缩
  • 业务服务端处理方式

    根据 Content-Encoding: gzip 判断请求消息是否压缩,并正确解压。

响应压缩

CSB HTTP SDK 会自动解析 HTTP 响应,并根据 HTTP Header 的 Content-Encoding: gzip 自动解压响应消息。