CSB实现了接入RESTful服务,开放成RESTful服务后的附件传输功能,支持上传或下载附件。
前提条件
- 已经接入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二进制流:使用POST,设置
- 下载附件: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文本文件):
- 业务服务端处理方式
根据Content-Type: application/octet-stream判断请求消息内容格式,并正确处理。
- 修改CSB客户端代码
- 多附件二进制流
- 修改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文本文件):
说明- 通过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-urlencoded或Content-Type: application/octet-stream正确解析对应form数据。
- 修改CSB客户端代码
下载附件
CSB HTTP SDK会自动解析HTTP响应,并根据HTTP Header的Content-Type: application/octet-stream设置HttpReturn对象的response或responseBytes。
示例代码如下:
HttpReturn ret = HttpCaller.invokeReturn(builder.build());
ret.responseBytes; //响应结果的二进制数据。
ret.response; //响应结果的字符串数据。
FAQ
- 什么场景使用“Body二进制流”,什么场景使用“多附件二进制流”?
上传方式 HTTP Query参数 HTTP Form参数 上传附件数量 Body二进制流 支持 不支持 1个 多附件二进制流 支持 支持 1个或多个 - 最大支持附件大小是多少?
Broker目前最多支持15 M附件大小,不管附件数量,一次请求合计不能超过15 M。