7235x
001738
2022-03-23

VBA 中的教程 Web 服务 API

网络服务是机器和程序之间的一种通信。 这种通信是通过网络进行的,因此任何可以通过 HTTP 协议发送和接收字符串的程序都可以使用。 在 RFEM 6 和 RSTAB 9 中基于这些跨平台的网络服务提供了一个接口。 本教程将介绍如何使用 VBA 编程语言。

Webservice API的基础-以VBA为例

字符串的格式设置按照 SOAP 协议的规定为 XML。 例如查询以下示例:

  1. code.vba#

http://schemas.XMLsoap.org/soap/envelope/"> <实体> #/代码# XML 格式化的典型元素是章节的开始,“<”作为章节的开始。 然后是一个标识符,如果没有其他子元素存在,该部分以“/>”关闭。 第三行是一个例子: #code.vba# #/代码# 如果有子元素,则以"<"、">"号和""号开始,到""号结束。 适当的例子是“身体”部分: #code.vba# <实体> #/代码# 这里使用空格和换行符的格式只是为了便于说明。 这对于传输不是必需的。 “主体”和“包络”是标准的传递对象,每一个命令都会使用它们。 所有可用的命令都可以通过 WSDL 接口读取。 市面上有可以创建列表的软件。 SoapUI 就是此类软件的一个示例。 RFEM 6 的 API 有两个列表; App 中所使用的命令和模型中使用的命令。 在本文最后可以下载两个列表。 命令是通过 HTTP 协议发送的,因此需要使用 URL 地址。 RSTAB/RFEM 应用程序的默认地址是“http://localost:8081/”,该地址可以在程序的设置中更改。 打开的模型的地址按升序排列,第一个打开的模型的地址为“http://localHOST:8082/”。 要获取活动模型的地址,请发送命令“get_active_model”。 RFEM 6 中的相应响应如下所示: #code.vba# <值> http://127.0.0.1:8082/ #/代码# "包络"部分的其他详细信息 以及前面的“” 表示使用的规范。 不管怎么说,您会看到再次使用了“包络”和“主体”元素。 RFEM 6 响应包含在“主体”中,其命令名称为“get_active_model”,后缀为“响应”。 响应的内容是一个“值”,即激活模型的地址。 此外,RFEM 现在已被锁定,无法进一步访问。 在以下示例中,我们将创建一个带有两个节点支座和一个荷载的杆件。 为了通过VBA与RFEM进行通信,需要以下对象: #code.vba# 请求另存为 MSXML2.XMLHTTP60 响应 As MSXML2.DOMDocument #/代码# XMLHTTP60 对象具有向 URL 发送 HTTP 请求的内置函数,因此用于 然后可以使用 DOMDocument 对响应进行评估。 下面的示例将之前显示的“get_active_model”请求与在 VBA 中使用的命令结合使用: #code.vba# ' 使用 "get_active_model" 命令获取激活的模型 URL str_envelope = "" & _ " "&_ " "&_ " "&_ "" ' 打开请求并发送 request.Open "邮寄", "http://localost:8081/", False request.Send(str_envelope) ' 得到响应并将其转换为一个XML对象 response.LoadXML(request.responseText) #/代码# 首先,将 XML 格式的施工图保存在 "str_envelope" 变量中,然后使用 "request" 变量的 "Open" 方法在 RFEM 中打开该施工图。 现在可以使用发送方法来发送变量"str_envelope"的内容。 然后可以使用 "ResponseText" 方法访问该响应。 在这种情况下,是通过方法 "LoadXML" 为 "response" 变量直接导入的。 DOMDocuments 类型的 "response" 变量有 LoadXML 方法,因此可以识别 XML 格式。 其优点是 DOMDocuments 类型还提供了 GetElementsbyTagName 方法。 这样您可以直接从规范中提取单元。 输入模型的 URL 地址如下: #code.vba# ' 得到 http-status status = 请求.状态 如果状态 <> "200" 那么 Msgbox "get_active_model: 发送失败 - " &response.Text 退出子对话框 End If URL_model = response.GetElementsByTagName("value")(0).Text #/代码# 在读取 URL 之前可以检查响应的状态。 它们是标准化的 HTTP 状态代码。 状态“200”表示传输“成功”。 完成此查询后,模型的 URL 就保存在 URL_model 字符串中。 为此,将在 XML 响应中搜索“value”元素。 如果一个答案包含多个元素,那么在“数值”一栏中会保存所有的值,这样一来使用标识符“value”的评估是不可能的,但是会涉及到“value”的子元素。 在实际的例子中会提供更多信息。 对于模型地址,唯一的返回值是 URL,因此这里的 "value" 是成功的。 == 实际例子 == 现在我们已经了解了所有的基本元素,下面将通过一个简单的示例来介绍它。 在两根柱子上创建一根梁,然后施加杆件荷载。

首先,定义上述变量并对其进行初始化: #code.vba# ' 定义变量 尺寸标注请求 As MSXML2.XMLHTTP60 调幅响应 As MSXML2.DOMDocument60 将str_envelope调暗为字符串 将 html_app 设置为字符串形式 将 html_model 设置为字符串 ' 初始化变量 设置请求 = 新建 MSXML2.XMLHTTP60 设置响应 = 新建 MSXML2.DOMDocument60 有响应 .async = False .preserveWhitespace = False .validateOnParse = False .resolveExternals = False ' 使用完整的 XPath 功能 .SetProperty "SelectionLanguage", "XPath" ' 添加特定的命名空间来使用路径 .SetProperty "SelectionNamespaces", "XMLNS:soap=""http://www.w3.org/2003/05/soap-envelope"" " & _ "XMLNS:xsd=""http://www.dlubal.com/rfem.xsd"" &_ "XMLNS:N1=""urn:schemas-Microsoft-com:rowset"" &_ "XMLNS=""http://www.dlubal.com/rfem.xsd"" " 结束于 URL_APP = "http://localHost:8081/" #/代码# 除了变量“request”和“response”外,还会为请求创建字符串“str_envelope”,为应用程序和模型的地址创建字符串“URL_app”和“URL_model”。 在初始化期间,可以调用 SOAP 协议的已知规范来评估响应的 XML 格式。 模型的地址会在以后被获取,但是应用程序的地址必须是指定的。 如前所述,必须输入默认地址“http://localost:8081/”。 下一步是测试与应用程序的连接。 默认情况下,程序会通过命令 get_information 来查询 RFEM 的测试信息: #code.vba# ' 使用命令 "get_information" 检查应用程序 URL str_envelope = "<信封 XMLNS=""http://schemas.XMLsoap.org/soap/envelope/"">" & _ “ ”&_ "" ' 打开请求并发送 request.Open "发布", URL_app, False request.Send(str_envelope) ' 得到响应并将其转换为一个XML对象 response.LoadXML(request.responseText) ' 得到 http-status status = request.Status 如果状态 <> "200" 那么 Msgbox "获取信息: 发送失败 - " &response.Text 退出子对话框 End If ' 读取应用程序信息 Dim str1 As String mstr1 = "" str1 = str1 & response.GetElementsbyTagName("name")(0).Text & vbLf str1 = str1 & response.GetElementsbyTagName("type")(0).Text & vbLf str1 = str1 & response.GetElementsbyTagName("version")(0).Text & vbLf str1 = str1 & response.GetElementsbyTagName("language_name")(0).Text & vbLf str1 = str1 & response.GetElementsbyTagName("language_id")(0).Text Msgbox str1, vbInformation, "对 ""get_information"" 请求的响应" #/代码# 如在第一部分中已经介绍的,在“str_envelope”对话框中准备并保存 XML 格式的请求。 "request.Open" 打开与应用程序的连接。 关键字“邮寄”表示发送邮件。 第三个参数设置为 "true",因此进行同步传输。 最后,“request.Send”发送准备好的字符串。 传输完成后,响应将保存在“response”中,并通过“request.Status”进行检查,以确定是否请求成功。 该状态由 RFEM 分配,如果请求不正确,它将返回错误;例如,未知的命令。 如果状态不是“200”,程序将中止,并在Msgbox窗口中显示错误信息。 如果没有出现错误,那么现在可以使用“GetElements通过TagName”读取各种传输的信息。 在具体示例中,该信息然后显示在窗口中。 下面的单元是非常相似的,所以这里只介绍一下它们的特殊之处 (完整的源代码可以下载). 要在杆件荷载作用下设置梁,需要以下功能: # 节点 – set_node # 线 – set_line # 材料 – 设置材料 # 截面 – set_section # 杆件 – 集杆件 # 节点支座 – set_nodal_support # 计算参数 – set_static_analysis_settings # 荷载工况 – set_load_case # 杆件荷载 – set_member_load 和大多数其他函数一样,"set_node" 函数也有很多参数,但通常不是必需的。 在上面提到的 RFEM 模型的命令列表中,您可以看到各种参数。 首先是没有被标记为“可选”的参数是很重要的,因为在每种情况下都必须完成填写。 在本示例中将传递以下参数: #code.vba# begin_modification (URL_model) ' 使用“set_node”命令设置 [0,0,0] 上的节点 1 str_envelope = "" & _ " "&_ " "&_ "" & _ "1" & _ "TYPE_STANDARD" & _ " 0 "&_ "0" & _ "0" & _ ""&_ " "&_ " >"&_ "" #/代码# 只有节点编号不是可选的;其余的点可以被分配,但不是必须的。 在命令列表中除了可以显示可能的参数外,还显示了类型列表。 当前有五种不同的杆件类型。 选择默认的类型“TYPE_STANDARD”。 此处显示的第一个节点在位置 (0; 0; 0),第二个节点在 (5.5; 0; 0)。 十进制数值的数值如下: #code.vba# ... "" & _ "2" & _ "TYPE_STANDARD" & _ "5.5" & _ "0" & _ "0" & _ ""&_ ... #/代码# 列表是另一个特殊的功能。 线需要两个节点,其编号可以通过列表传递。 列表的元素,例如 "definition_nodes",用空格分隔: #code.vba# ... "" & _ "" & _ "1" & _ "TYPE_POLYLINE" & _ "1 2" & _ ""&_ "" & _ ... #/代码# 为了能够创建杆件,必须先创建截面,而截面又需要材料 用户可以使用内部数据库中的截面和材料。 因此输入一个已知的标识符就足够了。 对于这种材料,标识符为"S235",截面的名称为"IPE 300": #code.vba# ... "" & _ "" & _ "1" & _ "1" & _ "TYPE_STANDARDIZED_STEEL" &_ "IPE 300" & _ ""&_ ""&_ ... #/代码# 要检查名称是否有效,例如 "IPE 300 "可以使用图形用户界面中的相应功能。 对于杆件不需要输入其他信息。 用于传递的关键字 "INF": #code.vba# ... "" & _ "" & _ "1" & _ "1" & _ "INF" & _ "INF" & _ "INF" & _ "INF" & _ "0" & _ "INF" & _ ""&_ "" & _ ... #/代码# 您不需要掌握任何其他知识就可以创建荷载工况和计算参数。 最后一个特性是在创建荷载时的一个附加值,因为它必须在“<值>”区域之外指定。 如果是杆件荷载,则必须移动相应的荷载工况: #code.vba# ... "" & _ "1" & _ "" & _ "1" & _ "LOAD_TYPE_FORCE" & _ "<杆件>1" & _ "LOAD_DISTRIBUTION_UNIFORM" & _ "LOAD_DIRECTION_GLOBAL_Z_OR_USER_DEFINED_W_TRUE" & _ "1000"&_ ""&_ "" & _ ... #/代码# 此外需要说明的是,在“数值”区域内,元素的顺序是无关紧要的,“数值”区域内的元素排列顺序无关紧要。 因此,指定的荷载工况必须在“数值”区域之前。 除了上述用于创建和导出数据的功能外,这里还有两个特殊功能。 将单元导入到软件中后,软件会自动进入“修改”模式, 程序检查并集成新单元。 如果要创建多个新的单元,建议让程序保持在该编辑模式,这样处理速度会更快。 为此需要使用 "begin_modification" 和 "finish_modification" 函数。 该示例中在创建第一个节点之前调用了“begin_modification”,在创建荷载工况结束时调用了“finish_modification”。 这两个函数也是作为 VBA 函数在程序中创建的。 这两个函数是相互独立的,因此在函数内再次创建了变量 "request" 和 "response"。 因为这不是新的构件,所以这里就不再进行说明。 一个有趣的比较是使用和不使用这些功能,这总是会导致速度差异。 == 概述总结 == 网络服务 API 是 RFEM 和 RSTAB 功能强大的工具。 通过基于 HTTP 的简单传输功能,不仅可以像这里展示的那样使用 VBA,还可以使用多种编程语言来实现该接口,并且可以跨平台编程。


作者

Günthel 先生为Dlubal 软件客户提供技术支持。

链接
下载


;