搜索​​​​

清除过滤器
文章
姚 鑫 · 八月 19, 2021

查询关键字Private,SoapBindingStyle,SoapBodyUse,SoapNameSpace

# 第121章 查询关键字 - Private 指定查询是否为私有查询。 # 用法 要指定此查询为私有查询,请使用以下语法: ```java Query name(formal_spec) As classname [ Private ] { //implementation } ``` 否则,请省略此关键字或将该词放在该关键字之前。 # 详解 私有类成员只能由同一类(或其子类)的其他成员使用。请注意,其他语言通常使用单词`Protected`来描述这种可见性,使用单词`Private`来表示从子类不可见。 # 默认 如果省略此关键字,则此查询不是私有的。 # 第122章 查询关键字 - SoapBindingStyle 指定此查询用作`Web方法`时使用的绑定样式或`SOAP`调用机制。仅适用于定义为`Web服务`或`Web客户端`的类。 # 用法 要覆盖查询使用的默认绑定样式(当它用作`Web方法`时),请使用以下语法: ```java Query name(formal_spec) As classname [ WebMethod, SoapBindingStyle = soapbindingstyle ] { //implementation } ``` 其中`soapbindingstyle`为下列值之一: - `document` - 此`Web方法`使用文档式调用。 使用这种绑定样式,`SOAP`消息被格式化为文档,并且通常只有一个部分。 在`SOAP`消息中,``元素通常包含单个子元素。``元素的每个子元素对应一个消息部分。 - `rpc` - 此`Web方法`使用`RP`C(远程过程调用)风格的调用。 使用这种绑定样式,`SOAP`消息被格式化为具有多个部分的消息。 在`SOAP`消息中,``元素包含一个子元素,其名称取自相应的操作名称。此元素是生成的包装元素,它为方法的参数列表中的每个参数包含一个子元素。 重要提示:对于手动创建的`Web服务`,此关键字的默认值通常比较合适。当使用`SOAP`向导从`WSDL`生成`Web客户端`或`服务`时,InterSystems IRIS会将此关键字设置为适用于该`WSDL`;如果修改此值,`Web客户端`或服务可能不再工作。 # 详情 此关键字允许指定此查询在作为`Web方法`调用时使用的绑定样式。 对于给定查询,此关键字覆盖`SoapBindingStyle`类关键字。 # 默认 如果忽略此关键字,``元素的`style`属性将由`SoapBindingStyle`类关键字的值决定。 # WSDL的关系 (请注意,与方法关键字和查询关键字相比,同名的`class关键字`对`WSDL`的影响更大。) # 对SOAP消息的影响 有关信息,请参阅`SoapBindingStyle`类关键字的条目。 # 第123章 查询关键字 - SoapBodyUse 指定该查询用作`web方法`时,输入和输出使用的编码。 仅应用于定义为`web服务`或`web客户端`的类。 # 用法 要覆盖查询的输入和输出使用的默认编码(当它被用作`web方法`时),请使用以下语法: ```java Query name(formal_spec) As classname [ WebMethod, SoapBodyUse = encoded ] { //implementation } ``` 其中,`soapbodyuse`是下列值之一: - `literal` - 这个`web方法`使用文字数据。 也就是说,`SOAP`消息的``中的`XML`与`WSDL`中给出的模式完全匹配。 - `encoded` = 这个web方法使用soap编码的数据。 也就是说,`SOAP`消息的``中的`XML`根据所使用的`SOAP`版本使用适当的SOAP编码,满足以下规范的要求: - `SOAP 1.1` (https://www.w3.org/TR/2000/NOTE-SOAP-20000508/) - `SOAP 1.2` (https://www.w3.org/TR/soap12-part2/) 重要提示:对于手工创建的`web服务`,这个关键字的默认值通常是合适的。 当使用`SOAP`向导从`WSDL`生成`web客户端`或服务时, IRIS将此关键字设置为适合该`WSDL`的; 如果修改了该值,`web客户端`或服务可能不再工作。 # 详解 该关键字允许您指定该查询作为`web方法`调用时的输入和输出的编码。 对于给定的查询,此关键字覆盖`SoapBodyUse`类关键字。 # 默认 如果忽略此关键字,则使用`SoapBodyUse`类关键字的值。 # 与WSDL的关系以及对SOAP消息的影响 有关信息,请参阅`SoapBodyUse`类关键字的条目。 # 第124章 查询关键字 - SoapNameSpace 在`WSDL`中的绑定操作级别指定名称空间。 仅应用于定义为`web服务`或`web客户端`的类。 # 用法 要在绑定操作级别覆盖默认命名空间(当查询被用作`web方法`时),请使用以下语法: ```java Query name(formal_spec) As classname [ SoapNameSpace = "soapnamespace", WebMethod ] { //implementation } ``` 其中,`soapnamespace`是一个名称空间`URI`。 注意,如果`URI`包含冒号(`:`),则字符串必须用引号括起来。 也就是说,你可以使用以下方法: ```java Query MyQuery() [ SoapNameSpace = "http://www.mynamespace.org", WebMethod ] ``` 或以下: ```java Query MyQuery() [ SoapNameSpace = othervalue, WebMethod ] ``` 但以下情况并非如此: ```java Query MyQuery() [ SoapNameSpace = http://www.mynamespace.org, WebMethod ] ``` 重要提示:对于手工创建的`web服务`,这个关键字的默认值通常是合适的。 当使用`SOAP`向导从`WSDL`生成`web客户`端或服务时, IRIS将此关键字设置为适合该WSDL的; 如果修改了该值,`web客户端`或服务可能不再工作。 # 详解 该关键字允许指定查询作为`web方法`调用时使用的`XML`名称空间。 注意:此关键字仅在查询使用`rpc`样式绑定时有效。 也就是说,查询(或包含它的类)必须用等于`rpc`的`SoapBindingStyle`标记。 (如果为使用文档样式绑定的查询指定此关键字,则`WSDL`将不是自一致的。) # 默认 如果忽略此关键字,则`web方法`位于由`web服务`或客户端类的`namespace`参数指定的命名空间中。 # 与WSDL的关系以及对SOAP消息的影响 有关信息,请参阅`SoapNameSpace`方法关键字的条目。
公告
Claire Zheng · 八月 19, 2021

InterSystems开发者竞赛:InterSystems IRIS Analytics

亲爱的社区开发者们,大家好! 欢迎积极参与新一轮InterSystems开发者竞赛! 🏆 InterSystems开发者竞赛:InterSystems IRIS Analytics 🏆 竞赛时间:2021年8月23日-9月12日 奖金总额: $8,750 登录页面即可参赛: https://contest.intersystems.com 奖项设置 1. 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出: 🥇 第一名 - $4,000 🥈 第二名 - $2,000 🥉 第三名 - $1,000 2. 社区提名奖(Community Nomination)- 获得总投票数最多的应用: 🥇 第一名 - $1,000 🥈 第二名 - $500 🥉 第三名 - $250 如果同时多位参赛者获得同样的票数,均被视为优胜者,将平分奖金 谁可以参加? 任何开发者社区的成员均可参加,InterSystems内部员工除外(InterSystems contractor员工可以参加)。还没有账号?现在来建一个! 👥 开发者可以组团 创建一个协作应用程序,组团限定人数为2-5人。 请注意,要在您的README文件中标注您的团队成员——社区用户profile 参赛时间安排 🛠 8月23日 - 9月5日: 应用开发、提交阶段 ✅ 9月 6日 - 12日: 投票阶段 注意:在整个参赛期间(开发与投票期间,即8月23日-9月12日),开发者可持续编辑、提升其应用 主题 💡 应用InterSystems IRIS开发分析解决方案(Analytics Solution) 💡 使用一个或多个InterSystems IRIS分析功能,如: Adaptive Analytics 自适应分析(AtScale) InterSystems Reports (Logi) InterSystems BI (DeepSee) InterSystems NLP (iKnow) 创造一个简单的、引人注目的、清晰的可视化产品和/或故事。 以下是参赛须知: 有效应用程序:100%全新的Open Exchange Apps或已有的应用程序(但有显著提升)。所有参赛者/团队提交的应用程序只有经过我们团队的审核之后才会被批准参赛。 该应用应该在 IRIS Community Edition or IRIS for Health Community Edition or IRIS Advanced Analytics Community Edition 上工作。 该应用需开源并在GitHub上发布。 该应用的README文件应为英文,包含安装步骤,并包含视频demo或/和应用程序如何运行的描述。 资源助力 1. 示例应用程序和说明: 1.1. Adaptive Analytics(自适应分析): Adaptive Analytics in Action (视频) 1.2 InterSystems报告: A look at InterSystems Reports (视频) InterSystems Reports Resource guide Running InterSystems Reports in containers IRIS reports server demo (OEX) 1.3 IRIS BI 案例: IRIS Analytics Template Samples BI Covid19 analytics Analyze This Game of Throne Analytics Pivot Subscriptions Error Globals Analytics Creating InterSystems IRIS BI Solutions Using Docker & VSCode (视频) The Freedom of Visualization Choice: InterSystems BI (视频) InterSystems BI(DeepSee) Overview (线上课程) InterSystems BI(DeepSee) Analyzer Basics (线上课程) 1.4 InterSystems NLP (iKnow): iKnow Source Code Samples Aviation Set Analysis iKnow First Look (线上课程) 2. Sample数据: Hole Foods database for IRIS BI (与SamplesBI包一起安装) Adventure Works, zip Synthea 3. 将数据导入IRIS的工具: CSVGEN and CSVGENUI S3 External Table 4. IRIS初学者 Build a Server-Side Application with InterSystems IRIS Learning Path for beginners 5. 如何将您的APP提交给大赛 如何在InterSystems Open Exchange上发布应用程序 如何把参赛APP提交给大赛 参赛评比 投票规则即将发布,敬请期待! So! 期待您的精彩提交!加入我们的编程马拉松,赢取大奖 ❗️ 点击此处,查看 官方竞赛条款解读❗️
文章
Claire Zheng · 八月 17, 2021

【视频】FHIR标准和国际基于FHIR的互联互通实践

当前医院面临更多互联互通需求,如预约挂号与分级诊疗、检验结果共享、医联体信息化、监管数据上报、临床辅助决策支持等,都需要对多源数据进行集成与整合。医疗机构内部和跨机构数据交换与共享,对互联互通提出新的要求。HL7 FHIR是国际上医疗行业实现数据交换和信息共享的标准之一,正在快速得到医疗行业广泛关注。InterSystems中国技术总监乔鹏在视频中分享了FHIR标准与国际互联互通的一些实践经验。
文章
Claire Zheng · 八月 17, 2021

FHIR标准和国际基于FHIR的互联互通实践(7):国际互联互通实践

国际互联互通的需求是在不断增长,这跟咱们国内的情况是非常类似的。这些年美国在互联互通领域的政策跟实践还是不少的,比如大家可能听到过包括“有意义的使用(Meaningful Use)”,“21世纪治愈法案(21st Century Cures Act)”,还有更多的政策上的驱动。这里先介绍一下“有意义的使用(Meaningful Use)”。 “有意义的使用(Meaningful Use)”其实源于2009年奥巴马签署的美国复兴与投资法案。“有意义的使用(Meaningful Use)”是它的俗称,标准的名称应该是“电子健康档案激励计划”。电子健康档案激励计划提出了很多使用标准,这些标准促进了认证电子病历的使用,分成了三个阶段:从2011年开始是第一阶段,第一阶段使用电子健康档案的技术来做数据的获取共享。之后在2014年做了第二个阶段,第二阶段来强调护理协调和患者信息的交流。第三个阶段是从2017年开始,它的目标是做一些更高级应用,例如电子处方临床学的支持。不过在“有意义的使用(Meaningful Use)”的过程中间,遇到了很多问题,因为它专注在电子病历的认证和使用上,很多用户抱怨已经被认证过的电子病历的能力是不足的。 所以在2018年4月份的时候, CMS将“有意义的使用(Meaningful Use)”,从“电子档案激励计划”改成了“促进互操作性计划”。在2018年的时候,“有意义的使用(Meaningful Use)”相当于是终结了。其替代者,也就是“促进互通的计划”,它现在还在执行。 上图是2020年的评分的标准,大家可以看到红框里面标出来的都是主要的评分项,基本上都集中在互联互通的能力之上的。现在美国正在执行的这些互操作性的政策,其实主要是美国的21世纪治愈法案(21st Century Cures Act),这个法案下有很多的子法律条款,提出了更具体、更可操作、更有计划性的互操作路线。 我挑几个给大家做个介绍。 首先第一个就是可信交换框架和共同协议草案,它设定了4个目标。这4个目标都是针对于提高医疗结果为目标的,它在这个目标里定义了未来的分阶段来进行设定目标,未来4年的目标就是建立所谓的“学习健康体系”。“学习健康体系”实现了临床、科研、公卫、患者个人、医保等各个利益方的互操作能力的健康信息体系。要实现这个目标,美国有一些具体的行动。行动之一就是ONC发布了一个“美国互操作核心数据集(U.S. Core Data for Interoperability)”。这个数据集跟咱们卫生数据集有点像,但是它包含的是数据类、数据元以及规范,建议了术语绑定的数据集。 这个数据集其实挺小的。这个数据集目前现在有两个版本,第一版本已经发布了。 上图包括了尚未发布的第二版的核心数据集,总共只有18个种类,这些数据集比我们的数据集要小得多。美国联邦政府现在要求所有的医疗机构都必须以HL7 FHIR R4的标准来共享交换核心数据集里面所有的患者数据。 还有另外一个法案,最新的“互操作能力和患者访问法规(The Interoperability and Patient Access final rule [CMS-9115-F])”。法规要求每个医院和保险公司都要开放针对于患者个人的数据查询的能力,需要使用FHIR的API,使用FHIR 4.0.1的标准来作为数据交换的基础,患者可以自己自由选择第三方的应用来查看、分享自己的数据。 这个法规从今年(2021年)1月1号开始实施的,目标要在三年之内能够完成。新一届的美国政府还要求所有的机构全都要全面的支持FHIR R4的API和FHIR的美国核心 Profile(总共25个Profile)。所以 FHIR在美国处于一个被快速采纳的阶段。 当然还有其他的机构,除了美国政策驱动之外,行业标准开发组织也在积极采用FHIR,例如说IHE。目前IHE总共开发了251个场景用例,现在基于FHIR已经达到了41个。IHE不仅在使用FHIR资源作为内容的格式,它也在使用FHIR的API来替代原来的互操作实现的方式。 FHIR在科研领域也大展身手。目前用于前瞻性临床研究的这些临床数据,其实很大程度上还是人工收集和分析出来的,需要手动查看临床数据图表、收集这些数据,增加了研究时间并且创造了很多出错的机会。通过FHIR标准,能够用FHIR标准化的协议和API使数据分析流程更加现代化。 “火神计划(Project Vulcan)”就是针对于科研发展的计划,这个计划的目标是将临床研究跟临床护理能够连接起来,让整个利益相关方能够聚集在一起,以弥合临床护理和临床研究之间的现有差距,战略性地连接行业合作,最大限度地利用集体资源,并提供集成的工具和资源。 这个项目在2019年9月份启动,目前有三个方向: 第一个就是建立表型数据的交换标准,其目标是使用FHIR在各种环境中使用和交换匿名化的患者病历级信息,这需要对FHIR资源进行进一步开发; 第二个是通过FHIR获取电子病历系统的数据,并直接生成科研所需数据的能力。当前正在和FDA协作处理药品数据; 第三个是采用FHIR资源描述科研活动计划。当前目标是将“临床数据交换标准联盟”的ODM-XML格式的活动计划转换为FHIR标准。 “火神加速器计划(HL7 Accelerator Program: Project Vulcan)”是一个比较典型的、能够体现出美国的标准合作应用模式的计划。 这个模式是将各个利益方都纳入进来。在支持科研和药品研发的计划中间包含了很多利益方,比如说标准开发组织HL7国际,政府代表FDA,科研机构(比如约翰逊霍普金斯医学院),当然还有行业团体(比如临床研究组织协会),很多的技术厂商(包括InterSystems公司)。通过多方参与来加速标准在科研和药品研发中间的落地。 其他国家也有很多启动了FHIR标准的互联互通的计划——例如沙特,沙特采用FHIR来进行排班计划,德国试图建立FHIR文档仓库上的所有能力,英国在使用FHIR来管理儿童的健康预警。 除此之外,有一个“全球数字健康伙伴关系”联盟,这是一个由30个国家和地区,以及世卫组织组成的合作的项目,中国香港特别行政区也在里面。它为全球参与者提供了交流数据共享、电子健康记录、电子处方、患者访问等最佳实践的机会。上图汇总了这些参与方使用互操作标准的情况。可以看到FHIR的标准的采纳度已经达到了17个,很快就会赶上最流行的V2,V2现在是19个。 以上全球对于互操作标准的采纳以及FHIR使用情况的简单介绍,如需了解更多,欢迎留言与我们交流!
文章
Claire Zheng · 八月 17, 2021

FHIR标准和国际基于FHIR的互联互通实践(6):FHIR如何用一个标准涵盖尽可能多的用例?

回过头来,业务场景都是千人千面的, FHIR怎么能够用一个标准涵盖尽可能多的用例?HL7吸收了V3的教训,在V3里面不成功的、或者说采纳度比较低的一个原因就V3试图穷举所有用例,由HL7组织自己来规范这些用例。这个是蛮沉重的教训,这也是V3的方法论虽然好,但是这套实施的路线在国际上有很大障碍的原因。 HL7已经不试图再自己穷举所有用例开发标准。它在FHIR的标准开发上,使用的是80/20原则。80/20的原则就是它自己专注在80%的业务都需要的那些数据部分上,其它20%交给使用者自己去进行相应的扩展,也就说它有很好的扩展性。 FHIR到底怎么来进行扩展?FHIR可以对模型、值集、API进行扩展,并且进一步的进行约束。而这些扩展本身也是资源,因此扩展可以像其它资源一样被创建、被访问、被交换。 怎么把你的扩展告诉别人? 在HL7 V2年代扩展很容易做,用z字段就可以来做扩展。但是你自己做的扩展约束需要通过文档和人工沟通的方式跟对方来进行人工沟通,告诉人家你是怎么扩展的,你是怎么约束的,你是怎么计划使用HL7消息。 而FHIR是通过Profile(规范)来进行约束和扩展表达的。将你做的扩展和约束与被扩展和约束的资源通过Profile(规范)来进行关联,然后注册这些Profile(规范),让别人能够找到。对方的技术系统只要通过你发给他的这些约束和扩展过的资源里面所标记的Profile的URL,就可以来得到获取并够解析Profile(规范),这样就能够理解你所做的约束和扩展,实现机器可读。这是FHIR跟之前标准在扩展模式上非常大的区别。 另外因为涉及到了用例,通常Profile(规范)是级联的。先按国家和地区的通用用例来建立一个区域级的、一个大的、有共性的Profile(规范),然后区域内的医疗机构可以以此为基础来创建自己下一级的Profile(规范),自己可能有一些扩展——例如说梅奥诊所,它可以基于美国的核心的Profile(规范)、扩展过的患者的资源上,来进行自己的一些患者信息扩展——这种级联扩展方式能够保证最大程度的互操作能力,即在同一个区域里面的所有机构,都共享一个通用的资源,可以保证互操作能力的最大化实现。 另外一个概念就是实施指南(Implementation Guides)。FHIR本身是一个平台规范,它本身关注在能力建设和生态建设上,这意味着广大的用户可以基于FHIR来开发出不同的解决方案。而实施指南就是说明如何使用FHIR的资源和能力来构建解决方案的。 注意区别Profile(规范)与FHIR的实施指南(Implementation Guide)。FHIR实施指南(Implementation Guide)相当于是什么?相当于经线,描述的是针对业务场景所需要的使用的方法;而Profile(规范)相当于是纬线,描述的是应用场景所需要的标准本身。HL7组织提供了一个实施指南注册的一个网站,大家都可以将自己的用例的实施指南注册在上面,所有人都可以看到、获取、利用、学习它。 上图是我把网站上列出来的所有注册的实施指南做的一个汇总。从这张汇总出来的实施指南的统计图来看,它涉及的业务场景是非常广泛的,包括了电子病历访问、管理、公卫、财务等等,这也说明了FHIR资源的覆盖面其实非常广,它可以覆盖从临床、管理、财务、设备、组学等方方面面。 FHIR还有生态。HL7设计FHIR初衷就是让它成为一个生态的标准,围绕着FHIR其实已经有一个不断扩大的生态圈。这里面列出来一些包括刚才我们提到的SMART on FHIR。 注:本文根据InterSystems中国技术总监乔鹏演讲整理而成。
文章
Claire Zheng · 八月 17, 2021

FHIR标准和国际基于FHIR的互联互通实践(5):FHIR以及InterSystems FHIR参考架构

FHIR是快速医疗互操作资源(Fast Healthcare Interoperability Resources)的缩写,所以FHIR的核心是资源模型。它的颗粒度和结构都优于之前的V2 、V3、CDA标准,而且能够灵活扩展。另外一个优势就是它的API,它不仅提供了针对于资源模型本身的原子化的CRUD(创建、读取、更新、删除的这样一些原子化操作),而且提供了查询这种更复杂操作的能力,同样API是可以扩展的。 此外,之前的互操作标准基本上都不会涉及到数据的保存,而FHIR资源仓库提供了一个全新的架构、全新的思路来使用FHIR,实现这种互操作。 这是InterSystems公司FHIR的参考架构,处于核心的就是FHIR服务器,它向外提供API的接口能力,包括FHIR的事务、FHIR的各种交互跟FHIR操作,底层是FHIR资源仓库,它可以持久化所有的FHIR资源,同时允许FHIR服务器对FHIR资源进行事务性的操作,所有需要使用FHIR API的客户端都可以使用FHIR服务器发布出来的API来进行相应的操作与访问。 上文我们讲到有常见的4种互操作的方式,HL7 FHIR支持所有的这些方式,而且它提供了第5种互操作方式。 首先,通过RESTful API它能够提供一个更紧密的业务集成度、去中心化的互操作能力,比较适合于搭建医疗微服务业务环境,同时比较适合于像云、互联网、物联网这种有紧密业务集成需求的环境。 另外FHIR依然支持以消息、文档方式来进行使用。这两种使用方式兼顾了传统互操作的模式,主要的目标是解决低业务集成度和跨数据管理域的集成和交换需求。 FHIR也可以基于服务来提供这种互操作,例如IHE已经有了大量的场景规范基于FHIR来实现了。 第五种就是我们说的资源仓库。大家可能会觉得奇怪,它怎么会成为一种互操作的方式? 我们先来看看互联互操作需求的起源:上图是比较传统的三层架构的开发模式,从底层的数据模型进行设计,到业务逻辑层,再到用户界面层,创造的是烟囱一样的应用。这种烟囱应用之间就需要通过互操作来打通,实现信息的共享和交换。 假设建设的不是烟囱类型的应用,我们还需要基于消息、文档的交换吗? 来看看生物界。世界上最大的生物是一种巨大的菌丝,在美国的俄勒冈州的蓝山有一种蜜真菌,它被科学家认为这是世界上最大的生物。地下的菌丝是一个整体,连在一起的,看起来独立的一个个蘑菇,其实都是这个巨大生命体的一部分。科学家估计在蓝山的蜜真菌的面积能够达到9.6平方公里,年龄已经差不多1900岁,甚至有人说可能在6500岁之间。 如果说我们把FHIR的资源仓库视为菌丝,基于FHIR资源仓库开发的应用,就是一个个的小蘑菇,它们只需要关注用户界面和业务逻辑,因为它们所有的数据存储和数据访问能力都是由标准的FHIR服务器提供的,而FHIR服务器下面可以接非常多的FHIR资源仓库,也就说资源仓库可以不止一个。这就是虚拟的集中式架构,在虚拟集中式的架构下的所有应用天生就是互联互通的,这就是FHIR的第5种互操作模式。 大家可能会问真有人这么做吗?还真有——SMART on FHIR就是比较典型的这种应用方式。 SMART是 “可替代医疗应用的、可重复使用技术”的缩写,它起初是哈佛医学院跟波士顿儿童医院在2011年开启的一个项目,它这个项目目标是用来创建这种可复用、可替代的应用开发架构。显然FHIR提供的这种标准化的数据模型和API是SMART能够实现的基础——的确是,在2014年SMART 跟 FHIR融合出来一个新的项目就是今天的SMART on FHIR。这个应用程序开发的架构使用标准的FHIR资源模型,使用标准的FHIR API来操作资源数据,使用OAuth2 和OpenID实现统一的认证授权,而开发者只需要关注在业务逻辑和应用层面。它开发出来的SMART应用底层的数据都保存在FHIR服务器和FHIR资源仓库里面,这些应用跟我们的手机的APP一样,都是即插即用的。这些即插即用的应用可以在所有支持 FHIR的服务器和FHIR资源仓库上实现,而且可以复用。 这些应用程序里面并不保存数据,我们不用担心数据跟应用共存亡的问题,因此这些应用其实可以随时被替代。如果你觉得它不好,有一个更好的应用你觉得喜欢,就直接把旧的扔了,插一个新的应用就ok了,这种建设的应用天生就是互联互通的。 注:本文根据InterSystems中国技术总监乔鹏演讲整理而成。
文章
Claire Zheng · 八月 17, 2021

FHIR标准和国际基于FHIR的互联互通实践(4):HL7的互操作标准

在国际上有很多互操作标准的开发组织,在我们医院信息化、医疗信息化领域有40多个标准开发组织,最广为人知的就是HL7国际、IHE,当然SNOMED也是,它开发的是行业术语跟语义的标准。 这些标准开发组织和和政府对于互操作标准有很多的测试和一致性认证,例如说HL7有FHIR连接马拉松(FHIR Connectathons),今年HL7中国也在正在开始做 FHIR连接马拉松测试(FHIR Connectathons)。IHE也有自己的连接马拉松(IHE Connectathons)测试。美国政府的 ONC IT认证计划,都是针对于互操作性的一些测试和认证。 我们来看看FHIR。在 HL7的提供的互操作标准里面,有很多的标准。我们现在提到的 FHIR是它最新的。HL7的标准的历史比较长,有40多年历史的V2,采纳度非常高,红色这张柱子是我们当前所处的 时间段,虽然它的采纳度在下降,但是仍比其他标准的采纳度都高。 V2有问题——V2的问题就是它的结构过于灵活,标准化程度不高,这也是我们使用它的一些问题。在使用V2的时候,我们通常面临的问题就是要使用V2标准的双方要坐下来谈怎么使用V2消息,才能够真正实现互联互通。在上世纪90年代的时候,HL7发布了V3版本的互操作标准,这也是个消息标准。 大家可以看看到上图里V3的采纳度历史最高峰已经过去了,最高峰也大概只到HL7 V2的一半。为什么会有这种低的采纳度?是因为V3虽然方法论很好——大家知道V3可能都知道参考信息模型,但是V3标准非常复杂,即便是非常有经验的集成工程师要使用V3来做一个集成,恐怕也要数周的时间,这也是V3在全球采纳度整体来说不高的一个原因。 此外有CDA,CDA是一个文档的标准,现在我们恰恰处在 CDA实施的这么一个高峰,采纳度的高峰。最近10年美国CDA的采纳度有一个非常快速的提升,原因是美国的市场上关于互联互通需求的提升,造成了这种以文档方式来进行共享交换的CDA标准采纳度的上升。 FHIR是最新的标准,大家可以看到FHIR标准现在其实还处于标准采纳度爬坡的阶段。它目前采纳度并不是很高,差不多刚刚跟V3降下来的采纳度到相同的水平。但是根据HL7组织的预测,FHIR将会成为未来广受欢迎的、或者说采纳度最高的它自己的标准。 注:本文根据InterSystems中国技术总监乔鹏演讲整理而成。
文章
Claire Zheng · 八月 17, 2021

FHIR标准和国际基于FHIR的互联互通实践(3):常见的互操作范式

实现互通的方式方法有很多种,我们通常会见到4种:消息交换、文档交换、服务和 API。 消息交换是最常见的一种互操作的方式,在医疗用得非常多。消息交换是基于消息引擎的,通常它应用在低业务集成度和跨数据管理域的业务环境里面。通常消息是基于临床事件,描述临床事件发生的上下文,并且能够在临床事件发生的时候,通过消息引擎把它路由给消息的接收方。 消息交换的本质是一个中心化的互操作方式,中心化的方式也能够保证消息的先进先出。我们常见的消息标准有HL7 V2、 HL7 V3的消息。 文档交换是另外一种常见的互操作方式。有别于基于临床事件的消息,文档是一种阶段性的、小结性的、完整的医疗信息的汇总。它的应用场景也是低业务集成度、跨数据管理域的环境,不过通常情况下,文档交换通常都是用在机构之间的,而不是在一家医疗机构内部的不同业务系统之间。可以通过消息引擎,当然也可以使用其他的方式来进行相应的交换。文档的标准,我们最常见的有HL7 CDA。 服务的交换是另外一种。服务是什么?服务是封装好的,并且暴露出来的一组内聚的应用系统的功能。基于服务交互的互操作,需要双方规范互操作的业务流程和角色。服务交互通常是基于面向服务的这种架构、通过服务总线来进行交互的,也是应用在低业务集成度和跨数据管理的业务环境。服务是基于规范的业务流程、角色的,但是在医疗行业并不是所有的医疗流程都已经或者是能够规范的,所以服务交互目前来看还是有一定的适用范围。最常见的国际上的服务标准是IHE。 API是现在最流行的。API在当今的网络经济里已经是无处不在了。它是概述了一组明确定义的规范,允许应用程序能够建立在另一个应用程序已有的数据和功能之上,而且不需要去了解其他的应用系统的系统设计。有别于消息和文档,API可以仅传输必要的信息,效率比较高,不需要传完整的上下文,所以它不需要中心化的消息,本质上是一个去中心化的架构,比较适合于业务集成度更紧密的互操作的场景。 目前面临的是传统的医疗边界被突破了——例如互联网医院这样的使用场景——我们需要扩大互操作性、互操作对象和数据,而这也驱动了医疗API的出现,这也是我这次介绍的一个重点,HL7 FHIR标准。 注:本文根据InterSystems中国技术总监乔鹏演讲整理而成。
文章
Claire Zheng · 八月 17, 2021

FHIR标准和国际基于FHIR的互联互通实践(2):互操作标准构成

在医疗行业要实现互操作,应该要达到语义级别。只有达到语义级别才能保障医疗信息的准确和医疗行为的安全。而要达到语义级别,我们需要基于标准。 这里标准特别多,我们把它称之为五位一体。标准有5个方面。 首先是词汇/术语标准,是相互通讯的健康医疗信息系统需要依赖于结构化的词汇术语、代码值集、分类系统来进行相应的表述。词汇和术语的标准就是表达健康概念的标准。例如我们在使用的世界卫生组织的ICD-10,当然还有其他的,比如SNOMED-CT等等。 第二是内容标准,是描述信息交换过程中间的数据内容和结构的标准。它还包括了通用数据的定义,例如我们熟悉的HL7 CDA、 HL7 V2、 C-CDA,这些都是内容标准。 第三是传输标准,定义了计算机系统、文档架构、临床模板、用户界面,数据的连接之间的交换的消息的格式,传输的方式等等。通过传输方式,可以来确定是通过推、还是拉的方式来进行数据的共享交换。在这个层面DICOM 、IHE都是传输的一个标准。 第四是隐私与安全的标准,也就是说我们要确定谁、什么时候、出于什么目的、可以使用哪种个人健康信息的权利,以及我们如何来保护这些健康信息的机密性、可用性、完整性的一些标准。美国有HIPPA,欧洲的GDPR,这些都是关于隐私和安全的。 第五是标识符的标准,标识符的标准是用来唯一标识患者、机构、医护技、设备等等的标准,例如说我们互联互通里面用到的OID。 注:本文根据InterSystems中国技术总监乔鹏演讲整理而成。
文章
Claire Zheng · 八月 17, 2021

FHIR标准和国际基于FHIR的互联互通实践(1):如何定义互联互通?

什么是互联互通?我们所说的互联互通其实就是国际上的互操作性,HIMSS对于互操作性定义的是:不同的信息系统、设备、应用系统之间、程序之间,在机构区域和国家边界之内,以及跨机构、区域和国家边界,以协调的方式来访问交换集成和协作使用数据的能力。 它对于使用效果提出了一些目标,比如希望能够提供及时和无缝的信息的可移植性,和优化个人和人群的健康。这是它定义的对于互操作性的4个不同的级别: 基础级别就比较简单,仅仅打通了系统之间进行数据通讯的通道; 结构级别,在基础级别之上定义了数据交换的格式和语法; 再上面有语义级别,语义级别是建立在行业通用的数据模型和数据编码之上的,使用标准化的行业语义来定义数据元素,使用标准的值集,因此语义级别的互操作性才是全行业可以理解的,并且有确定的行业意义的这种互操作,也就是说语义级别的互操作才是基于标准的互操作; 在语义级别之上,还有组织级别的互操作。通常这些都是由国家、国际的行业协会、行业标准开发组织开发的,加入了很多的其他方面的一些考虑,比如说政策的、社会的、法律的,分析了通用的业务流程和工作流,在这个基础之上设定了参与互操作的各方的角色、权限、服务、知情同意策略等等。 我国目前的互联互通标准化成熟度测试,其实就是组织级别的互操作。 注:本文根据InterSystems中国技术总监乔鹏演讲整理而成。
文章
姚 鑫 · 八月 14, 2021

属性关键字InitialExpression,Internal,Inverse,MultiDimensional

# 第101章 属性关键字 - InitialExpression 指定此属性的初始值。 # 用法 要指定此属性的初始值,请使用以下语法: ```java Property name As classname [ InitialExpression = initialexpression ]; ``` 其中,`initialexpression`是用大括号括起来的常量或ObjectScript表达式。 # 详解 此关键字指定属性的初始值。该值是在创建新实例时由类的`%New()`方法分配的。(如果属性是瞬态的的,则其初始值由创建实例时`%New()`调用的代码或实例从磁盘加载到内存时`%OpenId()`调用的代码确定。) 初始表达式的值必须适合给定的属性类型。 表达式可以是任意复杂的,有以下限制: - 初始表达式不能引用其他属性。也就是说,诸如{`..therPropertyname`}这样的表达式无效。 - 初始表达式不能实例化对象,也不能包括对象引用。 - 初始表达式不能调用实例方法(只能调用类方法)。 - 必须在ObjectScript中指定初始表达式。 - 表达式执行的代码不应报告错误。InterSystems IRIS不提供处理表达式返回的错误的方法。 - 如果表达式执行的代码导致发生其他处理,则InterSystems IRIS不提供处理该处理结果的方法。 子类继承`InitialExpression`关键字的值并可以重写它。 # 默认 `InitialExpression`关键字的默认值为`NULL`。 # 示例 下面显示了几个使用ObjectScript表达式的示例: ```java Property DateTime As %Date [ InitialExpression = {$zdateh("1966-10-28",3)} ]; Property MyString As %String [ InitialExpression = {$char(0)} ]; /// 此参数使用参数值进行初始化 Property MyProp As %String [ InitialExpression = {..#MYPARM} ]; /// 这是由一个类方法初始化的 Property MyProp2 As %Numeric [ InitialExpression = {..Initialize()} ]; ``` # 第102章 属性关键字 - Internal 指定此属性定义是否为内部定义(不显示在类文档中)。 # 用法 要指定此属性为内部属性,请使用以下语法: ```java Property propertyname As classname [ Internal ]; ``` 否则,请省略此关键字或将该词放在该关键字之前。 # 详解 类文档中不显示内部类成员。如果希望用户看到某个类,但不能看到其所有成员,则此关键字非常有用。 # 默认 如果省略此关键字,则此属性将显示在类文档中。 # 第103章 属性关键字 - Inverse 指定此关系的反面。关系属性需要。不用于其他属性。 # 用法 要在相关类中指定与该关系属性相反的关系属性,请使用以下语法: ```java Relationship Chapters As Chapter [ Cardinality = cardinality; Inverse = inverse ]; ``` 其中,`Inverse`是相关类中属性的名称。 # 详解 此关键字指定关系的反向方的名称,即相关类中对应关系属性的名称。反向属性必须存在于相关类中,并且具有正确的基数值。 关系属性需要`Inverse`关键字。非关系属性会忽略它。 # 默认 没有默认值。定义关系时,必须指定逆序关键字。 # 示例 ```java Relationship Chapters As Chapter [ Cardinality = many; inverse = Book ]; ``` # 第104章 属性关键字 - MultiDimensional 指定此属性具有多维数组的特征。 # 用法 要指定此属性具有多维数组的特征,请使用以下语法: ```java Property Data [ Multidimensional ]; ``` 否则,省略此关键字或将单词Not放在关键字的前面。 # 详解 多维属性不同于其他属性,如下所示: - IRIS不为其提供属性方法。 - 当对象被验证或保存时,它被忽略。 - 它不会保存到磁盘,除非应用程序包含专门保存它的代码。也就是说,属性也是自动瞬态的。 - 它不能暴露给Java或其他客户端。 - 它不能存储在或通过SQL表公开。 多维属性很少见,但它提供了一种有用的方法来临时包含关于对象状态的信息。 # 默认 如果省略此关键字,则属性不是多维的。
文章
Michael Lei · 八月 12, 2021

翻译:Windows、Caché 和病毒扫描程序

我最近看到一个客户问题,是使用 Caché 数据库上运行的病毒扫描程序导致应用程序间歇性变慢和用户响应时间不佳。 出乎意料的是,这是一个常见问题,所以本帖就是提个醒,要将主要 Caché 组件排除在病毒扫描之外。 通常,病毒扫描必须排除 CACHE.DAT 数据库文件和 Caché 二进制文件。 如果防病毒软件扫描 CACHE.DAT 和 InterSystems 文件,那么系统性能_将_受到较大影响。 具体来说,防病毒软件必须排除的 Caché 文件包括: * Caché 数据库 (CACHE.DAT)。 * Ensemble/bin 或 cache/bin 目录中的 Caché 可执行文件。 * 写入映像日志 (WIJ)。 * 日志目录中的日志文件。 更多详细信息,请参见在线文档。 [更多 Caché 文档](http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GSA_thirdparty)
文章
姚 鑫 · 八月 9, 2021

方法关键字SoapRequestMessage,SoapTypeNameSpace,SqlName,SqlProc

# 第八十一章 方法关键字 - SoapRequestMessage 当多个`web方法`具有相同的`SoapAction`时使用此方法。 在默认场景中,该关键字指定请求消息的`SOAP`正文中的顶级元素的名称。 仅适用于定义为`web服务`或`web客户端`的类。 # 用法 要在请求消息的`SOAP`体中指定顶级元素的名称,请使用以下语法: ```java Method name(formal_spec) As returnclass [ WebMethod, SoapAction = "MyAct", SoapRequestMessage="MyReqMessage" ] { //implementation } ``` 其中`soaprequestmessage`是有效的XML标识符。 # 详解 注意:此关键字仅对包装的文档/文字`document/literal`消息有效。 对于包装的文档/文字消息,该关键字指定请求消息的`SOAP`主体中的顶部元素的名称。(默认情况下,包装文档/文字消息。 如果对同一`web服务`中的多个`web方法`使用相同的`SoapAction`值,请指定此关键字。否则,一般不需要这个关键字。 # 与WSDL的关系 `SoapRequestMessage`关键字影响`web服务`的`WSDL`的``部分。例如,考虑以下web方法: ```java Method Add(a as %Numeric,b as %Numeric) As %Numeric [ SoapAction = MyAct,SoapRequestMessage=MyReqMessage, WebMethod ] { Quit a + b } ``` 对于这个web服务,WSDL包含以下内容: ```xml ``` 这些元素在``部分中相应地定义。 默认情况下,如果方法没有指定`SoapRequestMessage`关键字,``部分将改为如下所示: ```xml ``` 如果使用`SOAP`向导从`WSDL` IRIS `web服务`或客户端, IRIS将此关键字设置为适合该WSDL的。 # 对Message的影响 对于前面显示的`web方法`,`web服务`需要以下形式的请求消息: ```xml 12 ``` 相反,如果该方法没有指定`SoapRequestMessage`关键字,则该消息将如下所示: ```xml 12 ``` # 第八十二章 方法关键字 - SoapTypeNameSpace 为此`web方法`使用的类型指定`XML`命名空间。仅适用于定义为`web服务`或`web客户端`的类。 # 用法 若要重写类型的默认`XML`命名空间(当该方法用作web方法时),请使用以下语法: ```java Method name(formal_spec) As returnclass [ SoapTypeNameSpace = "soapnamespace", SoapBindingStyle = document, WebMethod ] { //implementation } ``` 其中`soapnamespace`是命名空间`URI`。请注意,如果`URI`包含冒号(`:`),则该字符串必须加引号。也就是说,可以使用以下内容: ```java Method MyMethod() [ SoapTypeNameSpace = "http://www.mynamespace.org", SoapBindingStyle = document, WebMethod ] ``` 或以下内容: ```java Method MyMethod() [ SoapTypeNameSpace = othervalue, SoapBindingStyle = document, WebMethod ] ``` 但不包括以下内容: ```java Method MyMethod() [ SoapTypeNameSpace = http://www.mynamespace.org, SoapBindingStyle = document, WebMethod ] ``` 重要提示:对于手动创建的`web服务`,该关键字的默认值通常是合适的。当使用SOAP向导从`WSDL`生成`web客户端`或服务时,InterSystems IRIS会将该关键字设置为适合该`WSDL`;如果修改该值,`web客户端`或服务可能不再工作。 # 详解 此关键字指定此`web方法`使用的类型的XML命名空间。 注意:只有当方法使用文档样式绑定时,此关键字才有作用。也就是说,方法(或包含它的类)必须用等于`document`的`SoapBindingStyle`标记。(对于使用`rpc-style`绑定的方法,指定这个关键字是没有意义的。) # 默认 如果省略此关键字,则此方法的类型位于由`web服务`或`客户端`类的`TYPENAMESPACE`参数指定的命名空间中。如果未指定`TYPENAMESPACE`,则类型将位于由`web服务`或客户端的`are`参数指定的命名空间中。 # 与WSDL的关系 `SoapTypeNameSpace`关键字影响`WSDL`的以下部分: ``元素中的命名空间声明。指定的命名空间(例如,`http://www.customtypes.org`)将添加到这里。例如: ```xml ... xmlns:ns2="http://www.customtypes.org" xmlns:s0="http://www.wbns.org" xmlns:s1="http://webservicetypesns.org" ... targetNamespace="http://www.wbns.org" ``` 在本例中,`http://www.customtypes.org`命名空间被分配给前缀`ns2`。 请注意,`WSDL`还像往常一样声明了以下名称空间: - `Web服务`的命名空间(`http://www.wsns.org`),在本例中,它被分配给前缀`s0`,也用作`Web服务`的目标命名空间。 - 网络服务的类型命名空间`http://www.webservicetypesns.org`),在本例中它被分配给`前缀s1`。 如果在`web服务`类中没有指定类型命名空间,则该命名空间不包含在`WSDL`中。 - ``元素,它包含一个``元素,该元素的`targetNamespace`属性等于为`SoapTypeNameSpace`指定的命名空间: ```xml ... ... ``` 相反,如果没有指定`SoapTypeNameSpace`,那么`WSDL`的这一部分将如下所示。请注意,``元素的`targetNamespace`是`web服务`类型的命名空间: ```xml ... ... ``` (此外,如果在`web服务类`中没有指定类型命名空间,则`targetNamespace`将改为`web服务`的命名空间。) # 对消息的影响 `SOAP`消息可能如下所示(为了可读性,添加了换行符和空格): ```xml 3 ``` 请注意,``元素位于`“http://www.customtypes.org”`命名空间中。 相反,如果没有指定`SoapTypeNameSpace`关键字,则消息可以如下所示: ```xml 3 ``` # 第八十三章 方法关键字 - SqlName 覆盖投影`SQL`存储过程的默认名称。 仅当此方法被投影为`SQL`存储过程时应用。 # 用法 要覆盖方法投射为`SQL`存储过程时使用的默认名称,请使用以下语法: ```java ClassMethod name(formal_spec) As returnclass [ SqlProc, SqlName = sqlname ] { //implementation } ``` 其中`sqlname`是`SQL`标识符。 # 详解 如果将此方法投影为`SQL`存储过程,则使用此名称作为存储过程的名称。 # 默认 如果忽略这个关键字, IRIS确定`SQL`名称如下: ```java CLASSNAME_METHODNAME ``` 默认使用大写字母。 但是,在调用存储过程时可以使用任何情况,因为SQL是不区分大小写的。 因此,在下面的示例中,默认的`SQL name`值是`TEST1_PROC1`。 这个默认值是在`SELECT`语句中指定的: ```java Class User.Test1 Extends %Persistent { ClassMethod Proc1(BO,SUM) As %INTEGER [ SqlProc ] { ///definition not shown } Query Q1(KD As %String,P1 As %String,P2 As %String) As %SqlQuery { SELECT SUM(SQLUser.TEST1_PROC1(1,2)) AS Sumd FROM SQLUser.Test1 } } ``` # 第八十四章 方法关键字 - SqlProc 指定是否可以作为`SQL`存储过程调用该方法。 只有类方法(而不是实例方法)可以作为SQL存储过程调用。 # 用法 要指定该方法可以作为`SQL`存储过程调用,请使用以下语法: ```java ClassMethod name(formal_spec) As returnclass [ SqlProc ] { //implementation } ``` 否则,忽略该关键字或将`Not`放在该关键字之前。 # 详解 该关键字指定可以作为`SQL`存储过程调用该方法。 只有类方法(而不是实例方法)可以作为`SQL`存储过程调用。 存储过程由子类继承。 # 默认 如果忽略此关键字,则该方法作为`SQL`存储过程不可用。
文章
姚 鑫 · 八月 8, 2021

方法关键字SoapBindingStyle,SoapBodyUse,SoapMessageName,SoapNameSpace

# 第七十七章 方法关键字 - SoapBindingStyle 指定此方法用作`web方法`时使用的绑定样式或`SOAP`调用机制。仅适用于定义为`web服务`或`web客户端`的类。 # 用法 若要重写方法使用的默认绑定样式(当它用作`web方法`时),请使用以下语法: ```java Method name(formal_spec) As returnclass [ WebMethod, SoapBindingStyle = soapbindingstyle ] { //implementation } ``` 其中`soapbindingstyle`是下列之一: - `document`文档(默认)—此`web方法`使用文档样式的调用。 使用这种绑定风格,`SOAP消息`被格式化为文档,并且通常只有一个部分。 在`SOAP消息`中,``元素通常包含一个子元素。``元素的每个子元素对应于一个消息部分。 - `rpc` —这个`web方法`使用`rpc`(远程过程调用)风格的调用。 使用这种绑定风格,`SOAP消息`被格式化为具有多个部分的消息。 在`SOAP消息`中,``元素包含一个子元素,其名称取自相应的操作名称。这个元素是一个生成的包装元素,它为方法的参数列表中的每个参数包含一个子元素。 重要提示:对于手动创建的`web服务`,该关键字的默认值通常是合适的。当使用`SOAP`向导从`WSDL`生成`web客户端`或`服务`时,InterSystems IRIS会将此关键字设置为适合该`WSDL`;如果修改该值,`web客户端`或服务可能不再工作。 # 详解 此关键字允许指定`web方法`使用的绑定样式。它影响`SOAP`主体的格式(但不影响任何`SOAP`头)。 # 默认 如果省略此关键字,则``元素的样式属性将改为由`SoapBindingStyle`类关键字的值确定。 # 与WSDL的关系 SoapBindingStyle方法关键字指定了WSDL的部分中< soap:operation >元素的样式属性的值。例如,如果SoapBindingStyle方法关键字是document,则WSDL可能如下所示: ```xml ... ... ... ``` 相比之下,如果`SoapBindingStyle`是`rpc`,则`WSDL`可以改为如下所示: ```xml ... ... ... ``` 绑定样式还会影响`web方法`的请求和响应``元素,如下所示: = 如果绑定样式是文档,默认情况下,每条消息只有一个部分。例如: ```xml ``` 如果`ARGUMENTSTYLE`参数是`message`,那么一条消息可以有多个部分。例如: ```xml ``` - 如果绑定样式是`rpc`,消息可以有多个部分。例如: ```xml ``` # 与 %XML.DataSet 一起使用 如果将此关键字与使用 `%XML.DataSet` 类型的对象作为输入或输出的方法一起使用,则存在一些限制。 # 第七十八章 方法关键字 - SoapBodyUse 当此方法用作 `Web方法`时,指定此方法的输入和输出使用的编码。仅适用于定义为 `Web服务`或 `Web客户端`的类。 # 用法 若要重写方法的输入和输出使用的默认编码(当它用作`web方法`时),请使用以下语法: ```java Method name(formal_spec) As returnclass [ WebMethod, SoapBodyUse = soapbodyuse ] { //implementation } ``` 其中`soapbodyuse`是下列之一: - `literal`文字(默认)-此`web方法`使用文字数据。也就是说,`SOAP消息`的``中的`XML`与`WSDL`中给出的模式完全匹配。 - `encoded`编码——这个`web方法`使用`SOAP`编码的数据。也就是说,`SOAP消息`的``中的`XML`使用了适合所使用的`SOAP`版本的`SOAP`编码,如以下规范所要求的: - `SOAP 1.1` (https://www.w3.org/TR/2000/NOTE-SOAP-20000508/) - `SOAP 1.2` (https://www.w3.org/TR/soap12-part2/) 重要提示:对于手动创建的`web服务`,该关键字的默认值通常是合适的。当使用`SOAP`向导从`WSDL`生成`web客户端`或服务时,InterSystems IRIS会将此关键字设置为适合该WSDL;如果修改该值,web客户端或服务可能不再工作。 # 详情 此关键字指定`web方法`的输入和输出的编码。 # 默认 如果省略此关键字,将使用`SoapBodyUse`类关键字的值。 # 与 %XML.DataSet 一起使用 如果将此关键字与使用 `%XML.DataSet` 类型的对象作为输入或输出的方法一起使用,则存在一些限制。 # 第七十九章 方法关键字 - SoapMessageName 指定此`web方法`的响应消息的``元素的`name`属性。 仅适用于定义为`web服务`或`web客户端`的类。 # 用法 要覆盖响应消息的``元素的默认名称,请使用以下语法: ```java Method name(formal_spec) As returnclass [ WebMethod, SoapMessageName = MyResponse ] { //implementation } ``` 其中`soapmessagename`是在`XML`中有效的任何标识符。 # 详解 注意:此关键字仅对使用`SoapBindingStyle`等于`document`(这是默认设置)的`web方法`有效。 此关键字指定响应消息正文的子元素的名称。 # 默认 如果省略此关键字,消息名称就是结尾附加了响应的`web方法`的名称。 `web方法`的名称取自`web服务`中的`web方法`定义;这只能通过重命名该方法来更改。 # 与WSDL的关系 `SoapMessageName`关键字影响`web服务`的`WSDL`的``和``部分。例如,以下web方法: ```java Method Add(a as %Numeric,b as %Numeric) As %Numeric [ SoapMessageName=MyResponseMessage,WebMethod ] { Quit a + b } ``` 对于这个`web服务`,WSDL的``和``部分如下所示: ```xml ``` 默认情况下,如果方法没有指定`SoapMessageName`关键字,`AddSoapOut`消息将包含一个名为`addressponse`的元素,而不是`MyResponseMessa` 注意,`SoapMessageName`不影响响应消息的子元素(例如`AddResult`)。 如果使用`SOAP Wizard`从`WSDL`生成`web`服务或客户端,InterSystems IRIS将此关键字设置为适合该`WSDL`的关键字。 # 对SOAP消息的影响 `web服务`可能会发送如下响应消息: ```xml 42 ``` 默认情况下,如果该方法没有指定`SoapMessageName`关键字,则``元素将改为``。 # 第八十章 方法关键字 - SoapNameSpace 指定`web方法`使用的`XML`命名空间。 仅适用于定义为`web服务`或`web客户端`的类。 # 用法 要覆盖方法使用的默认`XML`命名空间(当该方法作为一个`web方法`使用时),请使用以下语法: ```java Method name(formal_spec) As returnclass [ SoapNameSpace = "soapnamespace", WebMethod ] { //implementation } ``` 其中`soapnamespace`是一个命名空间`URI`。 注意,如果`URI`包含冒号(`:`),则字符串必须用引号括起来。 也就是说,你可以使用以下方法: ```java Method MyMethod() [ SoapNameSpace = "http://www.mynamespace.org", WebMethod ] ``` 或以下: ```java Method MyMethod() [ SoapNameSpace = othervalue, WebMethod ] ``` 但不包括以下内容: ```java Method MyMethod() [ SoapNameSpace = http://www.mynamespace.org, WebMethod ] ``` 重要提示:对于手动创建的`web服务`,该关键字的默认值通常是合适的。 使用`SOAP`向导从`WSDL`生成`web`客户端或服务时,InterSystems IRIS将此关键字设置为适合该`WSDL`的关键字; 如果修改该值,`web客户端`或服务可能不再工作。 # 详解 这个关键字指定了这个`web方法`使用的`XML`名称空间。 注意:这个关键字只有在方法使用`rpc`样式绑定时才有效果。 也就是说,方法(或包含它的类)必须用`SoapBindingStyle`等于`rpc`来标记。 (如果为使用文档样式绑定的方法指定此关键字,则WSDL将不会是自一致的。) # 默认 如果忽略此关键字,则该方法位于`web服务`或客户端类的`namespace`参数指定的名称空间中。 # WSDL的关系 对于InterSystems IRIS web服务服务,`SoapNameSpace`关键字影响``元素中的名称空间声明。 这里添加了指定的名称空间(例如`http://www.customtypes.org`)。 例如: ```xml ... xmlns:ns2="http://www.customtypes.org" xmlns:s0="http://www.wsns.org" ... targetNamespace="http://www.wsns.org" ``` 在本例中,`http://www.customtypes.org`名称空间被分配给前缀`ns2`。 请注意,`WSDL`通常还声明了`web服务`的名称空间(`http://www.wsns.org`)。 在本例中,该名称空间被分配给前缀`s0`,并且也用作目标名称空间。 # 对SOAP消息的影响 一个可能的`SOAP消息`可能如下所示(为了可读性添加了换行符和空格): ```xml 42 ``` 注意,``元素位于`http://www.webservicetypesns.org`名称空间中。 相反,如果我们没有指定`SoapNameSpace`关键字,则消息将如下所示: ```xml 42 ``` 在本例中,``元素位于web服务的名称空间`http://www.wsns.org`中。
文章
姚 鑫 · 八月 7, 2021

方法关键字Requires,ReturnResultsets,ServerOnly,SoapAction

# 第七十三章 方法关键字 - Requires 指定用户或进程调用此方法必须拥有的权限列表。 # 用法 要指定此方法应限于具有指定权限的用户或进程,请使用以下语法: ```java Method name(formal_spec) As returnclass [ Requires = privilegelist ] { //implementation } ``` 其中,`privilegelist` 要么是单个特权,要么是用引号括起来的以逗号分隔的特权列表。 每个权限都采用`resource:permission`的形式,其中`permission`是`Use`、`Read`或`Write`(或单字母缩写`U`、`R`或`W`)。 若要为一个资源`resource`指定多个权限,请使用单字母缩写。 # 详情 用户或进程必须拥有权限列表中的所有权限才能调用该方法。 调用没有指定权限的方法会导致``错误。 如果方法从超类继承了`Requires`关键字,则可以通过设置关键字的新值将其添加到所需特权的列表中。 不能以这种方式删除所需的特权。 # 默认 如果忽略此关键字,则调用此方法不需要特殊权限。 # 示例 下面的方法需要对`Sales`数据库的读权限和对`Marketing`数据库的写权限。 (注意,如果一个数据库有写权限,它会自动有读权限。) ```java ClassMethod UpdateTotalSales() [ Requires = "%DB_SALES: Read, %DB_MARKETING: Write" ] { set newSales = ^["SALES"]Orders set totalSales = ^["MARKETING"]Orders set totalSales = totalSales + newSales set ^["MARKETING"]Orders = totalSales } ``` 若要为一个资源指定多个权限,请使用单字母缩写。 以下两种方法在功能上是等价的: ```java ClassMethod TestMethod() [ Requires = "MyResource: RW" ] { write "You have permission to run this method" } ClassMethod TestMethodTwo() [ Requires = "MyResource: Read, MyResource: Write" ] { write "You have permission to run this method" } ``` # 第七十四章 方法关键字 - ReturnResultsets 指定此方法是否返回结果集(以便`ODBC`和`JDBC`客户机能够检索它们)。 # 用法 要指定该方法返回至少一个结果集,请使用以下语法: ```java ClassMethod name(formal_spec) As returnclass [ ReturnResultsets, SqlName = CustomSets, SqlProc ] { //implementation } ``` 否则,忽略此关键字或将单词`Not`紧接在关键字之前。 # 详解 此关键字指定该方法至少返回一个结果集。如果方法可能返回一个或多个结果集,则将此关键字设置为`true`。如果没有,`xDBC`客户端将无法检索结果集。 # 默认 如果省略此关键字,`xDBC`客户端将无法检索结果集。 # 第七十五章 方法关键字 - ServerOnly 指定此方法是否将被投影到Java客户端。 # 用法 将方法投影到`Java`客户端,请使用以下语法: ```java Method name(formal_spec) As returnclass [ ServerOnly=n ] { //implementation } ``` 其中`n`为下列其中之一: - `0`表示该方法可以映射。 - `1`表示该方法不会被映射。 # 详解 该关键字指定方法不会被投影到`Java`客户机。 # 提示 要查看类的哪些方法是`server-only`的,请在终端中使用以下实用程序: ```java do dumpMethods^%occLGUtil("Sample.Person") ``` 参数是完全限定类名。 该实用程序生成一个报告,该报告指出关于每个方法的基本信息:该方法是否为存根,该方法是否仅为服务器,以及(如果该方法是从某个属性派生的)派生该方法的属性。 # 默认 如果忽略这个关键字,这个方法如果是存根方法就不会被投影(但是如果不是存根方法就会被投影)。 ```java DHC-APP>do dumpMethods^%occLGUtil("Sample.Person") Method=%%OIDGet UseStub=0 serveronly=1 Method=%%OIDIsValid UseStub=1 serveronly=0 PropName=%%OID MethodName=IsValid Method=%%OIDSet UseStub=1 serveronly=1 PropName=%%OID MethodName=Set Method=%1Check UseStub=0 serveronly=1 Method=%AcquireLock UseStub=0 serveronly=1 Method=%AddJrnObjToSyncSet UseStub=0 serveronly=1 Method=%AddToSaveSet UseStub=0 serveronly=1 ``` # 第七十六章 方法关键字 - SoapAction 指定当通过HTTP将此方法作为`web方法`调用时,要在`HTTP`头中使用的`SOAP`操作。仅适用于定义为`web服务`或`web客户端`的类。 # 用法 要指定将此方法用作`web方法`时在HTTP头中使用的`SOAP`操作,请使用以下语法: ```java Method name(formal_spec) As returnclass [ WebMethod, SoapAction = soapaction ] { //implementation } ``` 其中`soapaction`是下列之一: - `“[default]”—SOAP`操作的默认值,即`NAMESPACE/Package.Class.Method` - `"customValue"` -使用`customValue`作为`SOAP`操作。 该值应该是标识`SOAP`请求意图的`URI`。 如果指定了一个自定义的值,它必须在`web服务`的每个`web方法`中是唯一的,或者你必须为每个`web方法`指定`SoapRequestMessage`关键字(并且为该关键字使用唯一的值)。 - "" -使用空值作为`SOAP`操作。这种情况很少见。 # 详情 `web方法`的`SOAP`动作通常用于路由请求`SOAP消息`。 例如,防火墙可以使用它来适当地过滤`SOAP请求消息`。 InterSystems IRIS `web服务`使用`SOAP操作`(与消息本身结合)来确定如何处理请求消息。 该关键字允许指定在作为`web方法`调用此方法时使用的HTTP `SOAP`动作。 对于`SOAP 1.1`, `SOAP`动作包含在`SOAPAction HTTP`报头中。 对于`SOAP 1.2`,它包含在`Content-Type` HTTP报头中。 # 默认 如果忽略`SoapAction`关键字,`SOAP`动作的形式如下: ```java NAMESPACE/Package.Class.Method ``` 其中`NAMESPACE`是`web服务`的`NAMESPACE`参数的值,`Package.Class`是`web服务`类的名称,`Method`是`web方法`的名称。 # WSDL的关系 `SoapAction`关键字影响`web服务`的`WSDL`中`的`部分。 例如,以下web方法: ```java Method Add(a as %Numeric,b as %Numeric) As %Numeric [ SoapAction = MySoapAction,WebMethod ] { Quit a + b } ``` 对于这个`web服务`,`WSDL`的``部分如下所示: ```xml ``` 默认情况下,如果方法没有指定`SoapAction`关键字,``元素可能会像下面这样: ```xml ``` 如果使用`SOAP`向导从`WSDL`生成 `web服务`服务或客户端,将此关键字设置为适合于该`WSDL`的关键字。 # 对消息的影响 对于前面显示的`web方法`,`web服务`期望收到以下形式的请求消息(对于SOAP 1.1): ```xml POST /csp/gsop/ROBJDemo.BasicWS.cls HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; InterSystems IRIS;) Host: localhost:8080 Connection: Close Accept-Encoding: gzip SOAPAction: MySoapAction Content-Length: 379 Content-Type: text/xml; charset=UTF-8 ... ``` 默认情况下,如果方法没有指定`SoapAction`关键字,`SoapAction`行可能会像下面这样: ```xml SOAPAction: http://www.mynamespace.org/ROBJDemo.BasicWS.Add ``` 注意,对于`SOAP 1.2`,细节略有不同。 在这种情况下,`web服务`期望收到如下形式的请求消息: ```xml POST /csp/gsop/ROBJDemo.BasicWS.cls HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; InterSystems IRIS;) Host: localhost:8080 Connection: Close Accept-Encoding: gzip Content-Length: 377 Content-Type: application/soap+xml; charset=UTF-8; action="MySoapAction" ... ```