文章 姚 鑫 · 六月 19, 2021 5m read

第十二章 XML其他示例

其他示例

Flexible Reader类

/// desc:灵活读取类
ClassMethod Read(mydir, myfile, class, element)
{
	set reader=##class(%XML.Reader).%New()
	if $extract(mydir,$length(mydir))'="/" {set mydir=mydir_"/"}
	set file=mydir_myfile
	set status=reader.OpenFile(file)
	if $$$ISERR(status) {do $System.Status.DisplayError(status)}

	do reader.Correlate(element,class)

	while reader.Next(.object,.status)
	{
		if $$$ISERR(status) {do $System.Status.DisplayError(status)}
		set status=object.%Save()
		if $$$ISERR(status) {do $System.Status.DisplayError(status)}
	}
}

请注意,当读入Person对象时,会自动读入其相应的Address对象。

0
0 236
文章 姚 鑫 · 六月 18, 2021 6m read

第十一章 重新定义读取器处理相关对象的方式

重新定义读取器处理相关对象的方式

%XML.Reader找到与启用了XML的类相关的XML元素时,读取器会调用该类的XMLNew()方法,后者又会在默认情况下调用%New()。也就是说,当读取器找到相关元素时,它会创建相关类的新对象。新对象由从XML文档读取的数据填充。

可以通过在启用XML的类中(或在自己的自定义XML适配器中)重新定义来自定义此行为。例如,此方法可以改为打开该类的现有实例。然后,现有实例接收从XML文档读取的数据。

以下示例显示如何修改以使用XML文档中的新数据更新现有实例。

在这两个示例中,为简单起见,我们假设XML文档中的一个节点包含一个ID,我们可以将该ID与类的范围中的ID进行比较。当然,我们可以用其他方式将XML文档与现有对象进行比较。

%XML.Reader调用XMLNew()

作为参考,在两种情况下自动调用方法:

  • %XML.Reader在调用%XML.ReaderNext()方法调用。在将XML元素(在外部文档中)与启用了XML的类关联之后, 方法从文档中获取下一个元素,调用创建相应对象的实例,然后将该元素导入到对象中。
  • 同样,为相关XML元素的任何对象值属性调用。

示例1:修改启用XML的类中的

此文件映射到以下InterSystems IRIS类(部分显示):

Class GXML.PersonWithXMLNew Extends (%Persistent, %Populate, %XML.Adaptor)
{

Parameter XMLNAME = "Person";

/// make sure this is the same as the XMLNAME of the property 
/// in this class that is of type %XML.Id
Parameter NAMEOFEXPORTID As %String = "IRISID";

Property IdForExport As %XML.Id(XMLNAME = "IRISID", XMLPROJECTION = "ELEMENT") [ Private, Transient ];

Property Name As %Name;

Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h");

Property Address As GXML.Address;

Property Doctors As list Of GXML.Doctor;
0
0 170
文章 姚 鑫 · 六月 17, 2021 6m read

第十章 XML元素和属性

检查必需的元素和属性

默认情况下,next()方法不检查是否存在与标记为必需的属性相对应的元素和属性。要使读取器检查此类元素和属性是否存在,请在调用Next()之前将读取器的CheckRequired属性设置为1。出于兼容性原因,此属性的默认值为0。

如果将设置为1,并且调用,而导入的XML缺少必需的元素或属性,则next()方法会将参数设置为错误代码。例如:

SAMPLES>set next= reader.Next(.object,.status)
 
SAMPLES>w next
0
SAMPLES>d $system.Status.DisplayError(status)
 
ERROR #6318: Property required in XML document: ReqProp

处理意外的元素和属性

由于源XML文档可能包含意外的元素和属性,因此提供参数来指定导入此类文档时的反应方式。

控制如何导入空元素和属性

为对象启用XML时,需要指定将空值和空字符串投影到XML的方式

其中一个选项是在支持XML的类中将设置为等于(不区分大小写)。在这种情况下,当使用%XML. IRIS对象时, IRIS使用读取器的属性的值来确定如何处理空元素或属性,如下所示:

  • 如果读取器的IgnoreNull
0
0 218
文章 姚 鑫 · 六月 16, 2021 7m read

第九章 将XML导入到对象中

本章介绍如何使用%XML.Reader将XML文档导入到 IRIS对象中。

注意:使用的任何XML文档的XML声明都应该指明该文档的字符编码,并且文档应该按照声明的方式进行编码。如果未声明字符编码, IRIS将使用前面的“输入和输出的字符编码”中描述的默认值。如果这些默认值不正确,请修改XML声明,使其指定实际使用的字符集。

还可以使用%XML.Reader读取任意XML文档并返回DOM(文档对象模型)。

创建XML读取器概述

IRIS提供了一些工具,用于读取XML文档并创建与该文档的元素相对应的启用XML的 IRIS对象的一个或多个实例。基本要求如下:

  • 该对象的类定义必须扩展%XML.Adaptor。除了少数例外,该对象引用的类还必须扩展%XML.Adaptor

提示:如果相应的XML模式可用,可以使用它来生成类(以及任何支持的类)。

  • 要导入XML文档,创建%XML.Reader的实例,然后调用该实例的方法。这些方法指定XML源文档,将XML元素与启用XML的类相关联,并将源中的元素读取到对象中。

%XML.Reader使用类中的%XML.Adaptor提供的方法执行以下操作:

  • 它使用InterSystems IRIS SAX接口解析和验证传入的XML文档。验证可以包括DTD或XML架构验证。
0
0 297
文章 姚 鑫 · 六月 15, 2021 5m read

第八章 Other Options of the Writer

Other Options of the Writer

Canonicalize()

方法的作用是:以规范化的形式编写XML节点。此方法具有以下签名:

method Canonicalize(node As %XML.Node, ByRef PrefixList, formatXML As %Boolean = 0) as %Status
  • node是文档的一个子树,作为%XML.Node的实例。
  • PrefixList是以下其中之一:
    • 对于包含式规范化,将PrefixList指定为“c14n”。 在本例中,输出的形式是XML Canonicalization Version 1.0,由https://www.w3.org/TR/xml-c14n
    • 对于排他规范化,将指定为具有以下节点的多维数组:
Node Value
PrefixList(前缀),其中前缀是名称空间前缀 与此名称空间前缀一起使用的名称空间
  • FormatXML控制格式。如果format XML为true,则编写器使用为编写器实例指定的格式,而不是XML规范化规范指定的格式。因此,输出不是规范的XML,但是已经对规范的XML进行了命名空间处理。
0
0 187
文章 姚 鑫 · 六月 15, 2021 5m read

第七章 控制命名空间分配的外观

控制命名空间分配的外观

除了控制命名空间分配外,还可以控制命名空间分配在XML输出中的显示方式。具体地说,可以控制以下内容:

显式名称空间分配与隐式名称空间分配

将元素和属性分配给命名空间时,XML中有两种等效的表示形式,由编写器实例的SuppressXmlns属性控制。

为一个名为Person的对象生成XML输出,该对象被分配给名称空间“http://www.person.org”(通过前面讨论的namespace类参数)。 使用缺省输出(等于0)的示例如下:

<Person xmlns="http://www.person.com" GroupID="4">
  <Name>Uberoth,Amanda Q.</Name>
  <DOB>1952-01-13</DOB>
</Person>

另一种可能的形式完全相同,如下所示。 这是使用等于1生成的,它确保显式分配给名称空间的每个元素都显示为该名称空间的前缀。

<s01:Person xmlns:s01="http://www.person.com" GroupID="4">
  <s01:Name>Uberoth,Amanda Q.</s01:Name>
  <s01:DOB>1952-01-13</s01:DOB>
</s01:Person>
1
0 186
文章 姚 鑫 · 六月 13, 2021 6m read

第六章 控制名称空间的使用

控制名称空间的使用

如将对象投射到XML中所述,可以将类分配给名称空间,以便相应的XML元素属于该名称空间,还可以控制类的属性是否也属于该名称空间。

将类中的对象导出为XML时,%XML.Write提供其他选项,例如指定元素是否为其父级的本地元素。本节包括以下主题:

  • 默认情况下,%XML.Writer如何处理命名空间
  • 如何指定本地元素是否合格
  • 如何指定元素是否为其父元素的本地元素
  • 如何指定属性是否合格
  • 命名空间分配方式的摘要

注意:在InterSystems IRIS XML支持中,可以按类指定名称空间。通常,每个类都有自己的命名空间声明;但是,通常只需要一个或少量的命名空间。还可以在逐个类的基础上指定相关信息(而不是以某种全局方式)。这包括控制元素是否为其父元素的本地元素以及子元素是否合格的设置。为简单起见,建议使用一致的方法。

名称空间的默认处理

若要将启用XML的类分配给命名空间,请设置该类的Namespace参数,如将对象投影到XML中所述。在会自动插入命名空间声明,生成命名空间前缀,并在适当的地方应用前缀。例如,以下类定义:

Class GXML.Objects.WithNamespaces.Person Extends (%Persistent, %Populate, %XML.Adaptor)
{
Parameter NAMESPACE = "http://www.person.com";
Property Name As %Name [ Required ];
Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h") [ Required ];
Property GroupID As %Integer(MAXVAL=10,MINVAL=1,XMLPROJECTION="ATTRIBUTE");
}
0
0 221
文章 姚 鑫 · 六月 12, 2021 6m read

第五章 生成XML元素

生成XML元素

如果使用RootElement()启动文档的根元素,则负责生成该根元素内的每个元素。有三个选择:

将对象生成为元素

可以从InterSystems IRIS对象生成输出作为元素。在本例中,使用object()方法,该方法写入支持XML的对象。输出包括该对象中包含的所有对象引用。可以指定此元素的名称,也可以使用在对象中定义的默认值。

只能在RootElement()EndRootElement()方法之间使用object()方法。

此示例为给定启用XML的类的所有已保存实例生成输出:

/// desc:将表里数据输出本地文件里
/// w ##class(PHA.TEST.Xml).WriteAll("Sample.Person")
ClassMethod WriteTableAllToXml(cls As %String = "", directory As %String = "E:\temp\")
{
    if '##class(%Dictionary.CompiledClass).%ExistsId(cls) {
        Write !, "类不存在或未编译"
        Quit 
    }
    s check=$classmethod(cls, "%Extends", "%XML.Adaptor")
    If 'check {
        Write !, "类不扩展%XML.Adaptor"
        Quit 
    }
        
    s filename = directory_"Person"_".xml"
    
    s writer = ##class(%XML.Writer).%New()
    s writer.Indent=1
    s status = writer.OutputToFile(filename)
    if $$$ISERR(status) { do $System.Status.DisplayError(status) quit  }
    
    s status=writer.RootElement("SampleOutput")
    if $$$ISERR(status) { do $System.Status.DisplayError(status) quit  }

    //获取给定类范围内对象的ID
    s stmt = ##class(%SQL.Statement).%New()
    s status = stmt.%PrepareClassQuery(cls,"Extent")
    if $$$ISERR(status) { do $System.Status.DisplayError(status) quit  }
    
    s rset = stmt.%Execute()
    while (rset.%Next()) {
        //对于每个ID,写入该对象
        set objid = rset.%Get("ID")
        set obj = $CLASSMETHOD(cls,"%OpenId",objid)
        set status = writer.Object(obj)
        if $$$ISERR(status) {Do $System.Status.DisplayError(status) Quit}}
        
    d writer.EndRootElement()
    d writer.EndDocument()
    q ""
}
0
0 189
文章 姚 鑫 · 六月 11, 2021 4m read

第四章 添加命名空间声明

添加命名空间声明

默认行为

%XML.Writer会自动插入命名空间声明,生成命名空间前缀,并在适当的地方应用前缀。例如,以下类定义:

Class Sample.Person Extends (%Persistent, %Populate, %XML.Adaptor)
{

Parameter NAMESPACE = "http://www.yaoxin.com";
}

如果导出此类的多个对象,则会看到类似以下内容:

DHC-APP> w ##class(Demo.XmlDemo).Obj2Xml(1)
<?xml version="1.0" encoding="UTF-8"?>
<Person xmlns="http://www.yaoxin.com">
  <Name>yaoxin</Name>
  <SSN>111-11-1117</SSN>
  <DOB>1990-04-25</DOB>
  <s01:Home xmlns="" xmlns:s01="http://www.yaoxin.com">
    <Street>889 Clinton Drive</Street>
    <City>St Louis</City>
    <State>WI</State>
    <Zip>78672</Zip>
  </s01:Home>
  <s01:Office xmlns="" xmlns:s01="http://www.yaoxin.com">
    <Street>9619 Ash Avenue</Street>
    <City>Ukiah</City>
    <State>AL</State>
    <Zip>56589</Zip>
  </s01:Office>
  <Spouse>
    <Name>濮氶懌</Name>
    <SSN>111-11-1115</SSN>
    <FavoriteColors>
      <FavoriteColorsItem>Red</FavoriteColorsItem>
      <FavoriteColorsItem>Orange</FavoriteColorsItem>
      <FavoriteColorsItem>Yellow</FavoriteColorsItem>
      <FavoriteColorsItem>Green</FavoriteColorsItem>
    </FavoriteColors>
  </Spouse>
  <FavoriteColors>
    <FavoriteColorsItem>Red</FavoriteColorsItem>
    <FavoriteColorsItem>Orange</FavoriteColorsItem>
    <FavoriteColorsItem>Yellow</FavoriteColorsItem>
  </FavoriteColors>
  <Age>31</Age>
</Person>
0
0 243
文章 姚 鑫 · 六月 10, 2021 4m read

第三章 指定输出的字符集

指定输出的字符集

若要指定要在输出文档中使用的字符集,可以设置Writer实例的Charset属性。选项包括“UTF-8”“UTF-16”以及InterSystems IRIS支持的其他字符集。

Writing the Prolog

XML文件的序言(根元素之前的部分)可以包含文档类型声明、处理指令和注释。

影响Prolog的属性

writer实例中,以下属性会影响:

Charset

控制两件事声明中的字符集声明和(相应的)输出中使用的字符集编码。

NoXmlDeclaration

控制输出是否包含XML声明。在大多数情况下,默认值是0,这意味着已经编写了声明。如果没有指定字符集,并且输出定向到字符串或字符流,则默认为1,并且不写入任何声明。

生成文档类型声明

在根元素之前,可以包含文档类型声明,该声明声明了文档中使用的模式。 要生成文档类型声明,需要使用方法,该方法有一个必选参数和三个可选参数。 就本文档而言,文档类型声明包括以下可能的部分:

<!DOCTYPE doc_type_name external_subset [internal_subset]>

如这里所示,文档类型有一个名称,根据XML规则,该名称必须是根元素的名称。 声明可以包含外部子集、内部子集或两者。

0
0 331
文章 姚 鑫 · 六月 9, 2021 6m read

第二章 从对象写入XML输出

本章介绍如何从InterSystems IRIS对象生成XML输出。

创建XML编写器概述

InterSystems IRIS提供了用于为InterSystems IRIS对象生成XML输出的工具。可以指定XML投影的详细信息,如将对象投影到XML中所述。然后创建一个Writer方法,该方法指定输出的整体结构:字符编码、对象的显示顺序、是否包括处理指令等。

基本要求如下:

  • 如果需要特定对象的输出,则该对象的类定义必须扩展%XML.Adaptor。除了少数例外,该对象引用的类还必须扩展%XML.Adaptor

  • 输出方法必须创建%XML.Writer的实例,然后使用该实例的方法。

下面的终端会话显示了一个简单的示例,在该示例中,我们访问启用了XML的对象并为其生成输出:

/// d ##class(Sample.Person).Populate(100)
/// w ##class(PHA.TEST.Xml).Obj2Xml(1)
ClassMethod Obj2Xml(ID)
{
	s obj = ##class(Sample.Person).%OpenId(ID)
	s xml = ##class(%XML.Writer).%New()
	s xml.Indent=1
	s status = xml.RootObject(obj)
	q ""
}

0
1 242
文章 姚 鑫 · 六月 8, 2021 8m read

第一章 InterSystems XML工具简介

介绍了如何使用 IRIS XML工具。

InterSystems IRIS为XML处理带来了对象的力量--可以使用对象作为XML文档的直接表示,反之亦然。由于InterSystems IRIS包括本机对象数据库,因此可以将此类对象直接用于数据库。此外,InterSystems IRIS提供了用于处理XML文档和(文档对象模型)的工具,即使它们与任何InterSystems IRIS类无关。

用XML表示对象数据

有些InterSystems IRIS 工具主要用于支持的类。要为类启用XML,需要将添加到其超类列表中。类使能够将该类的实例表示为XML文档。可以添加类参数和属性参数来微调投影。

image

对于启用了XML的类,数据可以采用以下所有形式:

  • 包含在类实例中。根据类的不同,还可以将数据保存到磁盘,在磁盘中数据可以像其他持久类一样以所有相同的方式使用。
  • 包含在XML文档中,可以是文件、流或其他文档。
  • 包含在DOM(文档对象模型)中。

下图概述了用于在这些表单之间转换数据的工具:

类使能够创建XML文档。输出目的地通常是文件或流。确定要包括在输出中的对象,系统根据在类定义中建立的规则生成输出。

类使能够将合适的文档导入到类实例中。源通常是文件或流。要使用此类,需要指定类名和文档中包含的元素之间的关联。给定的元素必须具有相应类所需的结构。

0
0 354
文章 姚 鑫 · 六月 6, 2021 2m read

Caché 网络实用工具

第一章 发送HTTP请求☆☆☆☆☆

第二章 设置和获取HTTP标头☆☆☆☆☆

第三章 发送HTTP请求☆☆☆☆☆

第四章 收发电子邮件☆

第五章 向邮件添加附件☆

第六章 从POP3服务器提取电子邮件☆

第七章 从POP3服务器提取电子邮件☆

第八章 处理收到的电子邮件☆

第九章 创建、编写和阅读MIME邮件☆

第十章 使用FTP☆☆☆☆☆

第十一章 发送和接收IBM WebSphere MQ消息☆

第十二章 IBM WebSphere MQ检索邮件☆

第十三章 使用SSH☆

第十四章 其他InterSystems %Net工具☆☆☆

第十五章 Caché WebSocket☆☆☆

前言

手册帮助程序员使用%Net包中的一些关键类,这些类为许多有用的Internet协议提供了易于使用的接口。因为这个包的类文档相当广泛,所以本手册提供了一个快速、有条理的概述,而不是深入研究每个参数、属性和方法。熟悉本手册中提到的协议和第三方工具。

预告

下一期系列将用一个月的时间连载,《Caché XML》,敬请期待。

交流群

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9VqwzNP-1608850948003)(3E1D939266954ED48BDAEA9B8086B11E)]

大型免费课程,进群410039091获取课程目录

  • 适合所有阶段程序员,总有一款你遗漏的知识点!
0
0 213
文章 姚 鑫 · 六月 5, 2021 5m read

第七章 Caché JSON %JSON快速参考

%JSON快速参考

本节提供本章中讨论的%JSON方法、属性和参数的快速参考。

%JSON.Adaptor方法

这些方法提供了从JSON序列化和序列化到JSON的能力。

%JSONExport()

%JSON.Adaptor.%JSONExport()将启用的类序列化为JSON文档,并将其写入当前设备。

   method %JSONExport(%mappingName As %String = "") as %Status
  • %mappingName(可选)-要用于导出的映射的名称。基本映射由"" 表示,并且是默认映射。

%JSONExportToStream()

%JSON.Adaptor.%JSONExportToStream()将启用`JSON的类序列化为JSON文档并将其写入流。

  • export - 包含序列化的JSON文档的导出流。
  • %mappingName(可选)-要用于导出的映射的名称。基本映射由表示,并且是默认映射。

%JSONExportToString()

将启用JSON的类序列化为JSON文档,并将其作为字符串返回。

  • -包含序列化的JSON文档的字符串。
  • 可选)-要用于导出的映射的名称。基本映射由表示,并且是默认映射。

%JSONImport()

将JSON或动态实体输入导入此对象。

0
0 355
文章 姚 鑫 · 六月 5, 2021 7m read

第六章 Caché JSON 使用JSON适配器

JSON适配器是一种将ObjectScript对象(registered, serial or persistent)映射到JSON文本或动态实体的方法。本章涵盖以下主题:

  • 导出和导入-介绍启用JSON的对象并演示%JSON.Adaptor导入和导出方法
  • 带参数映射-描述控制如何将对象属性转换为字段的属性参数。
  • 使用扩展数据映射块-介绍将多个参数映射应用到单个类的方法。
  • 格式化-演示如何使用格式化字符串。
  • 快速参考-提供本章中讨论的每个类成员的简要说明。

Exporting and Importing

从JSON序列化或序列化到JSON的任何类都需要子类%JSON.Adaptor,它包括以下方法:

  • %JSONExport()将启用JSON的类序列化为JSON文档,并将其写入当前设备。
  • 将启用JSON的类序列化为JSON文档并将其写入流。
  • 将启用JSON的类序列化为JSON文档并将其作为字符串返回。
  • 将JSON作为字符串或流导入,或者作为%DynamicAbstractObject的子类导入,并返回启用JSON的类的实例。

为了演示这些方法,本节中的示例将使用这两个类:

启用JSON的类和

  Class Model.Location Extends (%Persistent, %JSON.Adaptor)
  {
    Property City As %String;
    Property Country As %String;
  }
0
0 277
文章 姚 鑫 · 六月 3, 2021 10m read

第十五章 Caché WebSocket

使用WebSockets (RFC 6455)

web是围绕请求/响应范例构建的:客户机向服务器发送请求,服务器通过向客户机发送响应进行响应。此范式和HTTP本身不允许此通信协议的反向形式,即服务器与客户机启动请求/响应周期。已经开发了许多技术来解决了这个问题,即服务器可以启动与客户机的对话。这些技术通常被称为基于推送或 comet-based的技术,它们都存在不适合在web基础设施上进行全面部署的问题。目前使用的三种主要技术如下所述。

Short Polling 短轮询

使用这种技术,客户端定期发送HTTP请求来检测服务器状态的变化,服务器被编程为立即响应。空响应表示没有变化。

问题:

  • 轮询频率(和响应能力)受到客户机可以容忍的刷新延迟的限制。
  • 每个请求都是一个完整的HTTP请求/响应往返过程,这会导致大量的HTTP流量,而这又会给服务器和网络基础设施带来无法接受的负担
  • 每个消息交换都承载着协议的开销,如果消息大小超过了最大传输单元()(通常是以太网的1500字节),则会特别繁重。

Long Polling 长轮询

使用这种技术,客户端发送请求,但服务器只在需要通知客户端更改时才响应。客户端通常在服务器发送响应消息时发送另一个“长轮询”请求。

问题:

0
0 229
文章 姚 鑫 · 六月 2, 2021 2m read

第十四章 其他InterSystems %Net工具

下面是%Net中其他一些有用类的简短列表:

%Net.URLParser

InterSystems IRIS提供了一个实用程序类%Net.URLParser,可以使用它将URL字符串解析为其组成部分。例如,当您重定向HTTP请求时,这很有用。

该类包含一个类方法Parse(),它接受一个包含URL值的字符串,并通过引用返回一个包含URL各部分的数组。例如:

/// w ##class(PHA.TEST.HTTP).URLParser()
ClassMethod URLParser()
{
	Set url = "https://www.google.com/search?q=Java+site%3Adocs.intersystems.com&oq=Java+site%3Adocs.intersystems.com"
	Do ##class(%Net.URLParser).Parse(url,.components)
	zw components
}

返回时,组件将包含此URL各部分的数组:

Element Value Description
components("fragment") null URL的片段(#字符后面)
components("host") URL请求的主机
w URL的网络地址
0
0 163
文章 姚 鑫 · 六月 1, 2021 3m read

第十三章 使用SSH

%Net.SSH软件包支持SSH(安全外壳)通信。本主题简要介绍此包中的类。

创建SSH会话

%Net.SSH.Session表示会话。要使用此类,请执行以下操作:

  1. 创建类的实例。
  2. 使用Connect()实例方法连接到服务器。
  3. 使用AuthenticateWithKeyPair()或向服务器验证身份。
  4. 使用%Net.SSH.Session的其他方法执行进出远程系统的单个文件的SCP(安全复制)操作、执行远程命令、传输TCP通信或执行SFTP操作。

例如,使用将会话用于操作。此方法通过引用返回可用于操作的实例。

重要提示:有关可以使用这些类的受支持平台的信息,请参阅和的类参考。

示例:通过SFTP列出文件

以下方法显示了如何通过SFTP在服务器上写入文件列表:

Method SFTPDir(ftpserver, username, password) As %Status
{
    set ssh = ##class(%Net.SSH.Session).%New()
    do ssh.Connect(ftpserver)
    do ssh.AuthenticateWithUsername(username,password)
    //open an SFTP session and get that returned by reference
    do ssh.OpenSFTP(.sftp)
    //get a list of files
    do sftp.Dir(".",.files)
    set i=$ORDER(files(""))
    while i'="" {
        write $listget(files(i),1),!
        set i=$ORDER(files(i))
    }
    quit $$$OK
}
0
0 268
文章 姚 鑫 · 五月 31, 2021 4m read

第十二章 IBM WebSphere MQ检索邮件

检索邮件

要检索邮件,请执行以下操作:

  1. 按照“创建连接对象”中的说明创建连接对象。在这种情况下,请创建%Net.MQRecv的实例。Connection对象有一个消息队列,可以从中检索消息。
  2. 根据需要调用以下方法:
  • %Get()-通过引用返回字符串消息作为第一个参数。
  • -给定初始化的文件字符流,此方法从队列中检索消息,并将其放入与该流关联的文件中。请注意,必须设置流的Filename属性才能对其进行初始化。不支持二进制流。
  1. 检查调用的方法返回的值。请参阅“获取错误代码”。请记住,当队列为空时,IBM WebSphere MQ返回2033
  2. 检索完消息后,调用对象的方法以释放动态链接库的句柄。

示例1:ReceiveString()

下面的类方法从队列检索消息。

///Method returns string or null or error message
ClassMethod ReceiveString() As %String
{
 Set recv=##class(%Net.MQRecv).%New()
 Set queue="mqtest"
 Set qm="QM_antigua"
 Set chan="S_antigua/TCP/antigua(1414)"
 Set logfile="c:\mq-recv-log.txt"
 
 Set check=recv.%Init(queue,qm,chan,logfile)
 If 'check  Quit recv.%GetLastError()

 Set check=recv.%Get(.msg)
 If 'check {
     Set reasoncode=recv.%GetLastError()
     If reasoncode=2033 Quit ""
     Quit "ERROR: "_reasoncode
     }
 
 Quit msg
}
0
0 223
文章 姚 鑫 · 五月 30, 2021 8m read

第十一章 发送和接收IBM WebSphere MQ消息

InterSystems IRIS为IBM WebSphere MQ提供了一个接口,可以使用该接口在InterSystems IRIS和IBM WebSphere MQ的消息队列之间交换消息。要使用此接口,必须能够访问IBM WebSphere MQ服务器,并且IBM 客户端必须与InterSystems IRIS在同一台计算机上运行。

该接口由和类组成,这两个类都是%Net.abstractMQ的子类。这些类使用由InterSystems IRIS在所有合适的平台上自动安装的动态链接库。(这是Windows上的;其他平台的文件扩展名不同。)。反过来,InterSystems IRIS动态链接库需要IBM 动态链接库。

该界面仅支持发送和接收文本数据,不支持二进制数据。

使用IBM WebSphere MQ的RIS接口

通常,要使用IBM 的InterSystems IRIS接口,请执行以下操作:

  1. 确保有权访问IBM WebSphereMQv7.x或更高版本。具体而言:
  • IBM WebSphere MQ客户端必须与InterSystems IRIS安装在同一台计算机上。请注意,安装程序会根据需要更新环境变量并添加其他系统变量。
0
0 510
文章 姚 鑫 · 五月 29, 2021 4m read

第十章 使用FTP

IRIS提供了一个类%Net.FtpSession,可以使用它从InterSystems IRIS内建立与FTP服务器的会话。

建立FTP会话

要建立FTP会话,请执行以下操作:

  1. 创建%Net.FtpSession的实例。
  2. 可以选择设置此实例的属性,以控制会话的常规行为:
  • Timeout 超时指定等待FTP服务器回复的时间(以秒为单位)。
  • SSLConfiguration指定用于连接的激活的SSL/TLS配置(如果有)。如果FTP服务器使用HTTPS,请使用此选项。
  • 指定在读取文件内容或写入文件内容时要使用的转换表。
  • 启用PASV模式。
  • 当服务器使用时,适用。默认情况下,当的实例连接到服务器时,它会检查证书服务器名称是否与用于连接到服务器的DNS名称匹配。如果这些名称不匹配,则不允许连接。

若要禁用此检查,请将属性设置为0。

  1. 调用Connect()方法以连接到特定的FTP服务器。
  2. 调用ascii()或方法将传输模式分别设置为ASCII模式或二进制模式。要查看当前传输模式,请检查实例的Type属性的值。

注意:的每个方法都返回一个状态,应该检查该状态。这些方法还设置提供有关会话状态的有用信息的属性的值:

  • 如果当前已连接,则为TRUE,否则为FALSE。
  • 包含上次与FTP服务器通信时的返回代码。
  • ReturnMessage
0
0 335
文章 姚 鑫 · 五月 28, 2021 5m read

第九章 创建、编写和阅读MIME邮件

Iris提供了一个可以用于创建MultiPart Mime消息(%Net.MimePart)的类。创建要添加到SOAP消息的附件时,请使用此类;请参阅创建Web服务和Web客户端。因为是一个常见的标准,所以有许多其他可能的应用程序,例如电子邮件处理和HTTP Multipart Post。

MIME消息概述

MIME格式的文档被称为MIME部分。每个MIME部件都有标题,包含邮件正文(文本或二进制)或包含额外的MIME部件。具有MIME版本标题的MIME部分可以用作顶级文档,称为MIME消息。下图显示了示例:

image

在该示例中,EF具有未显示的附加子部分。

要表示MIME部件,请使用 类,该类提供用于设置零件的标题和内容的属性。

创建MIME部分

要创建一个MIME部件,执行以下步骤:

  1. 创建%Net.MIMEPart的实例。
  2. 做以下其中一项:
  • 添加文本或二进制正文。为此,请创建流(文本或二进制)的实例,并将MIME部分的Body属性设置为等于该流。使用标准流接口将数据写入此流。不要为属性指定值。
  • 添加MIME部件列表。为此,请按此处所述创建MIME部件,并将属性设置为等于这些部件的列表。不要为属性指定值。
  1. 可以选择按照“设置和获取MIME部件标头”中的说明设置标头。

设置和获取MIME部件标头

可以设置和获取标头的值。

0
0 236
文章 姚 鑫 · 五月 27, 2021 5m read

第八章 处理收到的电子邮件

处理收到的电子邮件

本节介绍如何处理通过%Net.POP3检索到的电子邮件(%Net.MailMessage)。

Message Basics

检索电子邮件(%Net.MailMessage)后,通常首先确定它是哪种类型的邮件以及如何阅读它;也就是说,它是否是多部分邮件以及各部分是否是二进制的。在此步骤中,您可以使用属性。或者,可以使用IsBinary、和属性,它们间接提供与相同的信息。

如果消息是多部分消息,则每个部分都是的一个实例。

Message Headers

消息本身和消息的每个部分都有一组标头。

%Net.MailMessagePart类提供的属性使可以轻松访问最常用的标头。例如,%Net.MailMessage提供收件人、发件人、主题和日期等属性。数组属性允许访问任何自定义标题.

此外,如果已通过检索到消息,则可以使用方法。在给定标头名称和属性的情况下,此方法返回该属性的值。

Message Contents

了解常规消息结构后,请使用以下技术检索内容:

  • 对于多部分消息,请使用Parts属性,该属性是部分的数组。Parts.Count()给出部件的数量。每个部件的键都是一个整数,从1开始。使用方法检索给定的部件。消息部分是的实例。
  • 对于二进制消息(或消息部分),请使用属性。
  • 对于文本消息(或消息部分),请使用属性。
    • 如果IsHTML
0
0 215
文章 姚 鑫 · 五月 26, 2021 6m read

第七章 从POP3服务器提取电子邮件

将附件另存为文件

Content-Disposition标头可以指定附件,可以带文件名,也可以不带文件名。例如:

Content-Disposition: attachment; filename=genome.jpeg;

如果Content-Disposition标头确实指定了附件,则%Net.POP3实例可以将邮件中的所有附件保存到文件。要实现这一点,请执行以下操作:

  1. 指定%Net.POP3实例的以下属性:
  • StoreAttachToFile指定为%1
  • 将指定为。
  • AttachDir指定有效目录。根据操作系统的不同,确保使用斜杠()或反斜杠()结束目录名称。还要确保该目录已经存在,并且用户对其具有写访问权限。
  1. 调用%Net.POP3实例的Fetch()FetchMessage()

每个文件名的确定方式如下:

  1. 如果标头指定了文件名,则使用该文件名。
  2. 否则,如果标头指定了文件名,则使用该文件名。
  3. 否则,系统将创建格式为的名称。

请注意以下几点:

  • 如果该文件已存在,则不会下载附件。
  • 没有默认值。
  • 附件的大小不受IRIS的限制,但可能受文件系统的限制。
  • 这里不使用DirFileName属性。它们仅在将附件上载到邮件时才相关,如向邮件添加附件中所述。

示例:

下面的示例方法在给定实例和邮件编号的情况下检索整个邮件:

0
0 203
文章 姚 鑫 · 五月 25, 2021 7m read

第六章 从POP3服务器提取电子邮件

从POP3服务器提取电子邮件

与POP3服务器通信

如果拥有所需的权限,并且邮件服务器正在运行,则可以使用POP3协议从该服务器下载和处理电子邮件。通常,要与POP3服务器通信,请登录,执行一系列影响邮箱的操作,然后提交或回滚任何更改。要在系统间IRIS中执行此操作,请执行以下操作:

  1. 创建%Net.POP3的实例。此对象描述将使用的POP3服务器。
  2. 可以选择指定%Net.POP3实例的以下属性:
  • -指定要使用的端口;默认值为。
  • timeout 超时-指定读取超时(以秒为单位);默认值为30秒。
  • -指定在读取邮件时(当邮件包含Content-Disposition;附件标题时)是否将每个附件保存到文件。默认值为False。请注意,除非还设置了,否则此设置不起任何作用。
  • -指定在读取邮件时(当邮件包含;内联标题时)是否将每个内联附件保存到文件中。默认值为False。请注意,除非还设置了AttachDir,否则此设置不起任何作用。
  • -指定将附件保存到的目录。没有违约。根据操作系统的不同,确保使用斜杠()或反斜杠()结束目录名称。还要确保该目录已经存在,并且用户对其具有写访问权限。
  • -指定是否忽略在解码期间发现的无效字符。默认值为FALSE(无效字符会导致错误)。请注意,对于应忽略意外字符还是应在解码期间导致错误的问题含糊不清。
  1. 要使用
0
0 197
文章 姚 鑫 · 五月 24, 2021 7m read

第五章 向邮件添加附件

向邮件添加附件

可以将附件添加到电子邮件或消息部分(具体地说,是添加到%Net.MailMessagePart%Net.MailMessage的实例)。要执行此操作,请使用以下方法:

这些方法中的每一种都会将附件添加到原始邮件(或邮件部分)的Parts数组中,并自动将属性设置为1。

AttachFile()

method AttachFile(Dir As %String, 
                  File As %String, 
                  isBinary As %Boolean = 1, 
                  charset As %String = "", 
                  ByRef count As %Integer) as %Status

将给定文件附加到电子邮件。默认情况下,文件以二进制附件的形式发送,但您可以将其指定为文本。如果文件是文本,还可以指定该文件使用的字符集。

具体地说,此方法创建的实例,并根据需要将文件内容放在BinaryData或属性中,并根据需要设置属性和属性。该方法通过引用返回一个整数,该整数指示此新消息部分在部件数组中的位置。

此方法还设置消息或消息部分的和属性。

AttachStream()

method AttachStream(stream As %Stream.Object, 
                    Filename As %String, 
                    isBinary As %Boolean = 1, 
                    charset As %String = "", 
                    ByRef count As %Integer) as %Status
0
0 146
文章 姚 鑫 · 五月 23, 2021 7m read

第四章 收发电子邮件

本主题描述如何使用InterSystems IRIS发送和接收MIME电子邮件消息。

注意:本主题中的示例是经过组织的,因此管理电子邮件的方法可以用于不同的电子邮件服务器,这在测试和演示期间非常有用。这不一定是最适合生产需要的代码组织。

支持电子邮件协议

电子邮件使用标准协议通过Internet发送消息。 InterSystems IRIS支持以下三种协议:

  • InterSystems IRIS提供MIME电子邮件的对象表示形式。它支持文本和非文本附件、单部分或多部分邮件正文,以及ASCII和非ASCII字符集的标题。
  • 可以通过服务器发送电子邮件。(简单邮件传输协议)是发送电子邮件的Internet标准。
  • 还可以通过POP3从电子邮件服务器检索电子邮件,是从远程服务器检索电子邮件的最常用标准。

注意:InterSystems IRIS不提供邮件服务器。相反,它提供了连接到邮件服务器并与之交互的功能。

InterSystems IRIS如何表示电子邮件

首先,了解InterSystems IRIS如何表示电子邮件非常有用。

通常,多部分MIME邮件由以下部分组成:

  • 一组邮件标头,每个标头都包含邮件发送到的地址等信息。这还包括整个消息的标头和标头。

对于多部分消息,头必须是多部分/混合或多部分的其他子类型;MIME

0
0 165
文章 姚 鑫 · 五月 23, 2021 6m read

第三章 发送HTTP请求

发送HTTP请求

创建HTTP请求后,使用以下方法之一发送该请求:

Delete()

method Delete(location As %String = "", 
              test As %Integer = 0, 
              reset As %Boolean = 1) as %Status

发出HTTP DELETE请求。

Get()

method Get(location As %String = "", 
           test As %Integer = 0, 
           reset As %Boolean = 1) as %Status

发出HTTP GET请求。此方法使Web服务器返回请求的页面。

Head()

method Head(location As %String, 
            test As %Integer = 0, 
            reset As %Boolean = 1) as %Status

发出HTTP Head请求。此方法使Web服务器仅返回响应头,而不返回正文。

0
0 202
文章 姚 鑫 · 五月 21, 2021 6m read

第二章 设置和获取HTTP标头

设置和获取HTTP标头

可以设置和获取HTTP标头的值。

%Net.HttpRequest的以下每个属性都包含具有相应名称的HTTP标头的值。如果不设置这些属性,则会自动计算它们:

  • Authorization
  • ContentEncoding
  • ContentLength(此属性为只读。)
  • (指定标头的Internet媒体类型(MIME类型)。)
  • ContentCharset (指定标题的字符集部分。如果设置此属性,则必须首先设置ContentType属性。)
  • IfModifiedSince

类提供可用于设置和获取主HTTP标头的常规方法。这些方法忽略和其他实体标头。

ReturnHeaders()

返回包含此请求中的主HTTP标头的字符串。

OutputHeaders()

将主标头写入当前设备。

GetHeader()

返回此请求中设置的任何主HTTP标头的当前值。此方法接受一个参数,即头的名称(不区分大小写);这是一个字符串,如Host或Date

SetHeader()

设置标题的值。通常,可以使用它来设置非标准标头;大多数常用标头都是通过Date等属性设置的。此方法有两个参数:

  • 标头的名称(不区分大小写),不带冒号()分隔符;这是一个字符串,如Host或Date
  • 标头值

不能使用此方法设置实体标头或只读标头(

0
0 558