CSB实现了接入RESTful服务,开放成RESTful服务后的附件传输功能,支持上传或下载附件。

前提条件

使用约束

  • 仅适用于接入RESTful服务,并开放成RESTful服务场景。对于接入HSF服务、Dubbo服务和WebService服务场景,CSB Broker只能获取附件,不支持转发给后端的HSF服务、Dubbo服务和WebService服务。
  • 目前仅实现部分HTTP附件交互场景。支持场景如下:
    • 上传附件:
      • HTTP Body二进制流:使用POST,设置Content-Type: application/octet-stream,适合于仅上传单个二进制流。
      • 多附件二进制流:使用POST,设置Content-Type: multipart/form-data,适合于有普通form的业务数据,同时还有多个附件上传场景。
    • 下载附件:HTTP Body返回二进制流,设置Content-Type: application/octet-stream
  • 仅支持新版本服务,即在发布设置页面选择新版(推荐)。如果您未进行发布设置,则在第一次发布服务时选择新版发布(推荐)示例详情-发布者-发布设置
  • 单个文件最大15 M,可以通过jvm -Dcsb_httpAttachmentTotalMBSize=M字节数来修改,Broker端通过csb_httpAttachmentTotalMBSize配置。
  • 最多同时发送5个附件,可以通过jvm -Dcsb_httpAttachmentMaxAmount=文件数来修改。Broker端通过csb_httpAttachmentMaxAmount配置。
  • Broker向后端业务服务发送多附件请求的响应超时时间为120秒(csb_httpAttachmentClientTimeoutSeconds)。
  • 不支持自定义消息转换的响应逻辑。
  • 每个Broker建立最多60个多附件传输的HTTP连接(csb_httpAttachmentClientMaxConn)。

上传附件

  • HTTP Body二进制流
    • 修改CSB客户端代码

      CSB客户端示例代码:

      HttpParameters.Builder builder = new HttpParameters.Builder();
      builder.requestURL("http://localhost:8086/CSB") // 设置CSB服务地址。
        .api("http2http1") // 设置服务名。
        .version("1.0.0") // 设置版本号。
        .method("post") // 设置调用方式, get或post。
        .accessKey("ak").secretKey("sk"); // 设置AccessKey ID和AccessKey Secret。
      
      try {
        // 设置请求参数。
        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请求示例如下(上传xml文本文件):

      客户端示例代码-HTTP
    • 业务服务端处理方式

      根据Content-Type: application/octet-stream判断请求消息内容格式,并正确处理。

  • 多附件二进制流
    • 修改CSB客户端代码

      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 {
        // 设置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")), true); //对文件进行压缩传输。
      
        HttpReturn ret = HttpCaller.invokeReturn(builder.build());
      } catch (Exception e) {
        // error process
      }

      HTTP请求示例如下(上传xml文本文件):

      多附件二进制流-CSB 客户端代码-HTTP
      说明
      • 通过builder.putParamsMap()方式设置的参数都是以application/x-www-form-urlencoded; charset=UTF-8方式提交请求。服务端需正确解码,以便得到正确的参数值。
      • 所有附件均以Content-Type: application/octet-stream上传。
    • 业务服务端处理方式
      • 根据Content-Type: multipart/form-data判断是否是多附件上传请求,并正确解析请求内容。
      • 根据每个form表单的Content-Type: application/x-www-form-urlencodedContent-Type: application/octet-stream正确解析对应form数据。

下载附件

CSB HTTP SDK会自动解析HTTP响应,并根据HTTP Header的Content-Type: application/octet-stream设置HttpReturn对象的responseresponseBytes

示例代码如下:

HttpReturn ret = HttpCaller.invokeReturn(builder.build());
ret.responseBytes; //响应结果的二进制数据。
ret.response; //响应结果的字符串数据。

FAQ

  • 什么场景使用“Body二进制流”,什么场景使用“多附件二进制流”?
    上传方式 HTTP Query参数 HTTP Form参数 上传附件数量
    Body二进制流 支持 不支持 1个
    多附件二进制流 支持 支持 1个或多个
  • 最大支持附件大小是多少?

    Broker目前最多支持15 M附件大小,不管附件数量,一次请求合计不能超过15 M。