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 ID和AccessKey Secret。
    
    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 ID和AccessKey Secret。
    
    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 ID和AccessKey Secret。
    
    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 ID和AccessKey Secret。
    
    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判断请求消息是否压缩,并正确解压。

响应压缩

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