第三十章 使用 MTOM 进行附件 - 控制 MTOM 打包

文章目录

  • [第三十章 使用 MTOM 进行附件 - 控制 MTOM 打包](#第三十章 使用 MTOM 进行附件 - 控制 MTOM 打包)
  • [控制 `MTOM` 打包](#控制 MTOM 打包)
  • 示例
    • [Web Service](#Web Service)
    • [`Web Client`](#Web Client)

第三十章 使用 MTOM 进行附件 - 控制 MTOM 打包

控制 MTOM 打包

默认情况下,创建 MTOM 包时,它使用以下规则:

  • 它以内联方式输出二进制字符串( %Binary或在 %xsd.base64Binary)。
  • 它使用附件输出二进制流。

可以使用 MTOM 属性参数来更改此默认值:

  • 1 表示将此属性作为附件输出。
  • 0 表示以内联方式输出此属性。

Web 服务或 Web 客户端未使用 MTOM 时,MTOM 属性参数不起作用。

此外,此属性参数对 Web 服务的 WSDL 没有影响。

示例

此示例展示了 Web 服务接收二进制文件并将其发送回调用者。

相应的 Web 客户端发送一个带有硬编码文件名的文件,从 Web 服务接收相同的文件,然后使用新名称保存它以证明它已成功发送。

Web Service

Web服务如下:

java 复制代码
/// Receive an attachment and send it back
Class MTOM.RoundTripWS Extends %SOAP.WebService
{

///  Name of the web service.
Parameter SERVICENAME = "RoundTrip";

///  SOAP namespace for the web service
Parameter NAMESPACE = "https://www.roundtrip.org";

///  Receive an attachment and send it back
Method ReceiveFile(attachment As %GlobalBinaryStream) As %GlobalBinaryStream [ WebMethod ]
{
  Set ..MTOMRequired=1
  Quit attachment
}

}

Web Client

生成的 Web 客户端 (MTOMClient.RoundTripSoap) 包含方法 ReceiveFile(),该方法调用同名的 Web 方法。此方法最初如下:

java 复制代码
Method ReceiveFile(attachment As %xsd.base64Binary) As %xsd.base64Binary 
[ Final, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ]
{
 Quit ..WebMethod("ReceiveFile").Invoke($this,"https://www.roundtrip.org/MTOM.RoundTripWS.ReceiveFile",
 .attachment)
}

由于我们发送的文件可能超出字符串长度限制,因此我们对方法签名进行如下调整:

java 复制代码
Method ReceiveFile(attachment As %GlobalBinaryStream) As %GlobalBinaryStream 
[ Final, SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ]
{
 Quit ..WebMethod("ReceiveFile").Invoke($this,"https://www.roundtrip.org/MTOM.RoundTripWS.ReceiveFile",
 .attachment)
}

默认情况下,Web 客户端不需要 MTOM;也就是说,未定义 MTOMREQUIRED 参数。

为了使用这个代理客户端,我们创建以下类:

java 复制代码
Include %systemInclude

Class MTOMClient.UseClient
{

/// For this example, hardcode what we are sending
ClassMethod SendFile() As %GlobalBinaryStream
{
  Set client=##class(MTOMClient.RoundTripSoap).%New()
  Set client.MTOMRequired=1

  //reset location to port 8080 to enable tracing
  Set client.Location="https://devsys:8080/csp/mysamples/MTOM.RoundTripWS.cls"

  //create file
  Set filename="c:\sample.pdf"
  Set file=##class(%Library.FileBinaryStream).%New()
  Set file.Filename=filename

  //create %GlobalBinaryStream
  Set attachment=##class(%GlobalBinaryStream).%New()
  Do attachment.CopyFrom(file)
  
  //call the web service
  Set answer=client.ReceiveFile(attachment)
  
  //save the received file to prove we made the round trip successfully
  Set newfilename="c:\roundtrip"_$h_"sample.pdf"
  Set newfile=##class(%Library.FileBinaryStream).%New()
  Set newfile.Filename=newfilename
  Do newfile.CopyFromAndSave(answer)
  
  Quit answer
}

}
相关推荐
不羁。。4 分钟前
【撸靶笔记】第七关:GET - Dump into outfile - String
数据库·笔记·oracle
yangchanghua1112 小时前
pgsql 如何查询今天范围内的数据(当天0点0分0秒 - 当天23点59分59秒....)
数据库·pgsql
larance2 小时前
SQLAlchemy 的异步操作来批量保存对象列表
数据库·python
python_chai2 小时前
从数据汇总到高级分析,SQL 查询进阶实战(下篇)—— 分组、子查询与窗口函数全攻略
数据库·sql·mysql
在努力的前端小白2 小时前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
未来之窗软件服务2 小时前
自建知识库,向量数据库 (九)之 量化前奏分词服务——仙盟创梦IDE
数据库·仙盟创梦ide·东方仙盟·自建ai·ai分词
冒泡的肥皂5 小时前
MVCC初学demo(一
数据库·后端·mysql
.Shu.6 小时前
Redis Reactor 模型详解【基本架构、事件循环机制、结合源码详细追踪读写请求从客户端连接到命令执行的完整流程】
数据库·redis·架构
Bruce_Liuxiaowei8 小时前
MySQL完整重置密码流程(针对 macOS)
mysql
麦麦大数据9 小时前
F003疫情传染病数据可视化vue+flask+mysql
mysql·flask·vue·大屏·传染病