xpath 和 re性能_使用XPath和REST在WebSphere Service Registry and Repository中查询和创建对象

xpath 和 re性能

IBM®WebSphere®Service Registry and Repository实现了具有扩展功能的XPath 2.0的子集,以提供一种简单而有效的搜索,查询和创建机制。

XPath语法可通过REST获得,并且可以从包括SOAP和Service Registry Session Bean以及Business Space中的Collection小部件的API执行。 本文提供了XPath语法的示例,并向您展示了如何使用REST测试XPath。 您还将学习如何使用REST创建WebSphere Service Registry and Repository对象。 XPath语法和REST示例也可以与其他API(例如Java,SOAP和Business Space中的Collection小部件)一起使用。

WebSphere Service Registry and Repository上下文中的XPath概述

XPath是用于浏览XML文档的查询语言。 尽管WebSphere Service Registry and Repository中的内容并不总是内部存储为XML文件,但是内容的建模就好像它们是XML一样,对于本文中的示例而言,您可以假定存储在WebSphere Service Registry中的数据存储库是XML或类似XML的。

WebSphere Service Registry and Repository提供了治理启用概要文件(GEP),其中包括实现完整治理流程所需的建模对象和生命周期。 本文向您展示了查询和从GEP创建对象所需的XPath语法。 如果您已经使用WebSphere Service Registry and Repository Studio基于GEP创建了定制概要文件并将其添加了自己的建模对象,则该信息也很重要。 您不需要定制概要文件,也不需要安装或使用本文的WebSphere Service Registry and Repository Studio,但是如果您有使用UML中的定制概要文件的经验,它将为您提供有用的上下文和背景。理解。

本文假定您已经对Websphere Service Registry and Repository和XPath概念有所了解,并且已经熟悉GEP。 给出了WebSphere Service Registry and Repository V7.5或V8.0 GEP和文档的示例。 早期产品版本也支持XPath语法,并且这些示例可与任何GEP版本一起使用,包括V6.3和V7.0。

了解XPath上下文中的对象模型

GEP提供了一组可以直接引用的具体类型。 有关它们的完整列表,请参阅Websphere Service Registry and Repository信息中心中的具体类型 。 有关具体类型的查询的示例,请参阅XPath查询的信息中心主题。

在具体类型列表中找不到的任何对象都有一种GenericObject,既来自GEP,也来自您在自定义模型中引入的任何新对象。 主类型属性用于区分GenericObject类型的特定建模对象。

模型中的每个对象都将从GenericObject隐式继承一组属性,以及从继承层次结构中的建模对象及其父级继承属性和关系。 您不会在WebSphere Service Registry and Repository Studio的UML模型中看到这些属性的隐式继承属性:

  • bsrURI
  • 名称(必填)
  • 命名空间
  • 描述
  • 所有者
  • 最后修改
  • creationTimestamp
  • lastModifiedBy
  • primaryType

bsrURI属性是对象的内部唯一标识符,当在WebSphere Service Registry and Repository中创建对象时,将自动生成其值。

主类型属性采用的形式是namespace#objectName 。 命名空间在对象模型中定义,您可以在WebSphere Service Registry and Repository中的包的Stereotypes选项卡下,或在磁盘上生成的OWL文件中看到。 您还将在图形查询的响应中找到主要类型作为参数之一。

在WebSphere Service Registry and Repository中为REST配置根URL

WebSphere Service Registry and Repository提供了REST接口,从而使不支持EJB和Web服务的轻量级客户端能够通过HTTP请求对内容和元数据执行操作。 在XPath或XML的上下文中,WebSphere Service Registry and Repository元数据由一组名称/值对组成。 当执行图形查询时,将返回对象的所有名称和值。 使用某些API,您可以执行图查询来进一步深入并跟踪与子对象的关系。 在REST中,您只能执行单个级别的查询。 执行属性查询时,您需要按名称请求一个或多个特定属性,并返回每个属性的值。

本文中的示例以两种形式提供:XPath语法(如本文所示),以及使用默认根URL包裹在REST标题中的链接。 根URL的格式为http://hostname:port/prefixWSRR/version/ 。 WebSphere Service Registry and Repository提供了两种附加到根URL的查询:

检索或创建内容
http://hostname:port/prefixWSRR/version/Content/
检索或创建元数据
http://hostname:port/prefixWSRR/version/Metadata/syntaxtype/querytype?query=

本文中的示例使用以下值:

主机名
localhost
港口
9080
前缀WSRR
WSRR
7.5
语法类型
XMLJSON
查询类型
GraphQueryPropertyQuery

要在浏览器中使用REST语法,必须对某些字符进行编码,并且本文中的示例已为您编码。 有关特殊字符的更多信息,请参见本文底部“ 资源”部分中的信息中心链接。

如果启用了安全性,则将使用安全端口将9080端口自动重定向到https地址(默认为9443)。 首次执行查询时,还将提示您登录。 使用用户标识和密码,并具有对WebSphere Service Registry and Repository Web UI的完全管理员权限,例如wasadmin。

(可选)设置WebSphere Service Registry and Repository,以便您可以使用本文中的链接

如果设置以下环境,则可以在浏览器中单击本文中的链接,从而使示例具有交互性:

  1. 在您正在阅读本文的机器上安装WebSphere Service Registry and Repository V7.5或V8.0服务器。 使用以下配置:
    • 默认端口(9080和9443)。
    • 如果您在ND环境中,请仅在一个单元成员上部署WebSphere Service Registry and Repository以确保使用缺省前缀(WSRR)。
  2. 加载并激活GEP。
  3. 加载WSDL并创建业务功能和服务。 有关这些任务的说明,请参阅Websphere Service Registry and Repository信息中心中的“ 管理现有服务管理新服务 ”教程。

现在,您将能够单击本文中的链接,并针对您的本地WebSphere Service Registry and Repository服务器执行XPath语法作为REST查询。

XPath示例

检索元数据

图形查询检索对象的所有元数据以及到其直接子级的链接作为关系。 您使用WebUI或业务空间在WebSphere Service Registry and Repository中创建的对象完全由元数据组成。 如果已加载数据(例如WSDL文件或文档),则将需要内容查询以检索内容。

示例1:图形查询所有服务类型类型的对象

本示例检索类型为服务版本的对象的图形。 在GEP中,您将创建一个服务版本来表示每个概念服务,然后将其之间的关系添加到一个或多个WSDL服务中。 服务版本采用通用对象的形式,其主要类型为http://www.ibm.com/xmlns/prod/serviceregistry/profile/v6r3/GovernanceEnablementModel#ServiceVersion

/WSRR/GenericObject[@primaryType='http://www.ibm.com/xmlns/prod/serviceregistry/profile/v6r3/GovernanceEnablementModel#ServiceVersion']

示例2:图形查询类型为服务的特定命名对象

当您加载WSDL文件时,服务将由WebSphere Service Registry and Repository自动创建,并且内容是从WSDL文件中<wsdl:service>标记的内容派生的。 如果您已完成GEP教程,则将加载AccountCreationDevelopmentEndpoint.wsdl ,其中包含一个名为AccountCreationService-Development的服务,此示例中使用了该服务。 给定名称,这是查询与特定服务有关的所有元数据的语法:

/WSRR/GenericObject[@primaryType='http://www.ibm.com/xmlns/prod/serviceregistry/v6r3/ServiceModel#Service' and @name='AccountCreationService-Development']

如果您已完成GEP教程并加载了AccountCreationDevelopmentEndpoint.wsdl ,则示例2对XML图查询的响应将如下所示:

图查询响应

示例3:WSDL文档的名称和bsrURI的属性查询

属性查询从对象中检索一个或多个特定属性,您将其标识为查询的一部分。 当查询具体类型(例如WSDL文档)时,无需设置主要类型。 如果您已经完成了GEP教程,那么您将已经加载了几个WSDL文档。

/WSRR/WSDLDocument&p1=name&p2=bsrURI

内容不包括WSDL文件的主体。 如果要查看文件内容,请使用内容查询,以下为示例。

示例4:使用JSON对特定WSDL文档的bsrURI进行属性查询

现在,您已经使用图查询来查找系统中WSDL文档的名称,您可以在查询中包括此信息以查找特定的文档bsrURI。 如果您已完成GEP教程,则将加载EligibilityService.wsdl 。 该查询的REST版本使用JSON而不是XML。 结果的格式不同,但内容相同:

/WSRR/WSDLDocument[@name='EligibilityService.wsdl']&p1=bsrURI

检索内容

对于具有内容的对象(例如WSDL文档),可以使用bsrURI检索内容。 您需要首先标识bsrURI,您可以使用示例4中的查询来/WSRR/7.5/Content/bsrURI_value 。内容查询的格式为/WSRR/7.5/Content/bsrURI_value

示例5:特定WSDL文档的内容查询

对象的bsrURI值是唯一的,因此此示例不是交互式的:

http://localhost:9080/WSRR/7.5/Content/074ac307-f834-4424.bb54.d0b3c8d054d2

您还可以使用参数检索内容:

http://localhost:9080/WSRR/7.5/Content?query=/WSRR/WSDLDocument[@name=%27AccountCreationProductionService.wsdl%27]

如果内容查询有多个匹配结果,则除非使用errorOnMultiple参数,否则您将收到第一个匹配errorOnMultiple

当您检索内容时,响应是一个文件。 使用REST,浏览器将提示您保存或打开它。

导航图中的关系

XPath使用对象关系使您可以导航到一个对象或一组对象的子级。 如果执行了上面的示例1或2,则会看到ServiceVersion包含与名为ale63_owningOrganization的组织的关系。

示例6:查询组织关系

这个例子说明,发现由一个或多个服务的版本,这是不一样的,因为所有在WebSphere Service Registry and Repository中配置的组织的名单中引用的所有组织的图形查询。 如果您已完成GEP教程,则将创建三个组织(JKHL Enterprises,Common services和Commercial),但是此查询将仅返回服务版本所引用的两个组织(Common services和Commercial):

/WSRR/GenericObject[@primaryType='http://www.ibm.com/xmlns/prod/serviceregistry/profile/v6r3/GovernanceEnablementModel#ServiceVersion']/ale63_owningOrganization(.)

示例7:查询组织与合格服务版本的关系

您可以使用属性来约束关系查询。 本示例查找资格服务引用的所有组织,并且应仅找到您创建的三个组织中的一个:

/WSRR/GenericObject[@primaryType='http://www.ibm.com/xmlns/prod/serviceregistry/profile/v6r3/GovernanceEnablementModel#ServiceVersion' and @name='Eligibility service']
/ale63_owningOrganization(.)

示例8:从组织中查询具有父级关系的服务版本

关系功能非常强大:除了使用关系导航之外,还可以将它们视为搜索条件。 本示例将查找商业组织中具有所有者的所有服务版本:

/WSRR/GenericObject[@primaryType='http://www.ibm.com/xmlns/prod/serviceregistry/profile/v6r3/GovernanceEnablementModel#ServiceVersion'
and ale63_owningOrganization(.)/@name='Commercial']

使用正则表达式进行搜索

示例9:使用文本匹配进行查询

您可以使用正则表达式针对特定属性或任何属性的内容创建文本匹配搜索。 您可以使用@ *将文本与任何模型化的属性进行匹配,并可以使用“ i”使用不区分大小写的搜索。 但是,通配符搜索会对性能产生影响,因此请尝试使搜索尽可能精确。 本示例查找您为帐户创建和资格而加载的所有WSDL服务,并由包含jkhle的名称空间jkhle

/WSRR/GenericObject[@primaryType='http://www.ibm.com/xmlns/prod/serviceregistry/v6r3/ServiceModel#Service' and matches(@namespace, '.*jkhle.*')]

在场和不在场搜索

示例10:查询是否存在关系

例8展示了如何使用拥有的Commercial组织搜索服务版本。 您也可以查找任何名称的关系。

查询/WSRR/GenericObject[ale63_owningOrganization(.)]将找到所有具有ale63_owningOrganization关系属性的建模对象。 但是,无论ale63_owningOrganization属性是否引用组织,它都会返回这些对象。 如果您使用未经修改的GEP,它将返回资产类型或从资产继承的所有对象。 这将是一长串,并且潜在的类型将包括业务能力,能力版本,架构规范和DOU。

如果附加了name属性,则可以使查询更具体,以确保仅检索设置了ale63_owningOrganization值的实体。 与往常一样,您也可以按主要类型或名称进行过滤,如果知道要查找的特定建模对象或类型,则应该这样做。 此示例显示拥有组织的所有服务版本:

/WSRR/GenericObject[@primaryType='http://www.ibm.com/xmlns/prod/serviceregistry/profile/v6r3/GovernanceEnablementModel%23ServiceVersion' and
ale63_owningOrganization(.)/@name]

示例11:查询缺少属性

您可以使用null来测试尚未设置的文本属性,尽管日期或日历属性不支持null。 本示例显示了未设置使用者标识符的所有服务版本。 在GEP教程数据中,它将找到资格服务版本,但找不到帐户创建服务版本:

/WSRR/GenericObject[@primaryType=%27http://www.ibm.com/xmlns/prod/serviceregistry/profile/v6r3/GovernanceEnablementModel%23ServiceVersion' and
@gep63_consumerIdentifier=null]

海报Firefox扩展

在浏览器中使用REST时,您只能检索或查询内容和元数据。 您可以使用Java,REST,SOAP或Atom API在WebSphere Service Registry and Repository中创建,更新或删除对象,但是您需要开发应用程序客户端或使用具有发布功能的工具,例如cURL或Poster Firefox Extension。 本节向您展示如何使用Poster Firefox Extension通过REST创建对象。 海报Firefox扩展已获得BSD许可。

使用从V10开始的多个版本的Firefox和Windows 7(64位)上的Poster V3.1.0对示例进行了测试。 在安装海报Firefox扩展之前,必须先安装Firefox。 如果有任何问题,请访问Poster Firefox Extension网站 ,然后单击“ 问题”选项卡。

安装和配置海报

  1. 转到海报Firefox扩展安装页面
  2. 出现提示时,重新启动Firefox。
  3. 海报扩展提示将在右下角显示为“ P”图标。 单击它以启动海报:
    海报图标

验证海报WebSphere Service Registry and Repository配置

  1. 输入格式为http(s)://[host]:[port]/WSRR/的目标URL,例如http://localhost:80/WSRR/
  2. 如果出现提示,请输入您的WebSphere Service Registry and Repository用户名和密码,然后单击GET:
    海报
  3. 如果您的配置正确,则会打开一个新窗口,显示有关您的WebSphere Service Registry and Repository服务器的信息。 在此示例中,WebSphere Service Registry and Repository服务器是V7.5,并应用了修订包2:
    WebSphere Service Registry and Repository版本结果

在WebSphere Service Registry and Repository中创建对象

使用Poster在WebSphere Service Registry and Repository中创建通用对象

  1. 在WebSphere Service Registry and Repository中创建通用对象所需的最小语法是目标URL,对象类型和对象名称: http://localhost:9080/WSRR/7.5/Content/GenericObject?name=Posted
  2. 点击POST:
    在WebSphere Service Registry and Repository中创建通用对象
    在WebSphere Service Registry and Repository中创建通用对象后的响应

使用带参数的Poster在WebSphere Service Registry and Repository中创建对象

示例12:创建空关系

  1. 输入目标URL和对象类型: http://localhost:9080/WSRR/7.5/Content/GenericObject
  2. 在内容窗格中输入参数:
    <resources>
      <resource>
        <properties>
           <property name="name" value="Finance"/>
             <property name="primaryType" 
    value="http://www.ibm.com/xmlns/prod/serviceregistry/v6r3/ALEModel#Organization"/>
             <property name="ale63_contactEmail" value=""/>
             <property name="ale63_contact" value=""/>
           </properties>
           <relationships>
             <relationship name="ale63_childOrganizations"/>
           </relationships>
        </resource>
    </resources>
  3. 点击POST:
    在WebSphere Service Registry and Repository中创建组织
  4. 成功的响应包括新对象的bsrURI。 例如:
    <properties>
        <property name="bsrURI" value="4ca23f4c-e3fc-4c96.b6ac.ec4676ecac0d"/>
    </properties>

示例13:使用关系目标创建

本示例使用财务组织的bsrURI设置新IBM组织的子级。 它假定您已经创建了IBM组织,并且知道其bsrURI:

  1. 输入目标URL和对象类型: http://localhost:9080/WSRR/7.5/Content/GenericObject
  2. 在内容窗格中输入参数:
    <resources>
        <resource>
            <properties>
                <property name="name" value="IBM"/>
                <property name="primaryType" 
    value="http://www.ibm.com/xmlns/prod/serviceregistry/v6r3/ALEModel#Organization"/>
                <property name="ale63_contactEmail" value=""/>
                <property name="ale63_contact" value=""/>
            </properties>
            <relationships>
                <relationship name="ale63_childOrganizations" 
    targetBsrURI="73e70273-ebb6-46fe.a7d4.6a6f796ad408"/>
            </relationships>
        </resource>
    </resources>
  3. 点击POST。

示例14:使用图查询进行验证

  • 要验证是否正确创建了组织,请在Poster或浏览器中执行以下图形查询:
    http://localhost:9080/WSRR/7.5/Metadata/XML/GraphQuery?query=/WSRR/GenericObject[@primaryType="http://www.ibm.com/xmlns/prod/serviceregistry/v6r3/ALEModel%23Organization"]
    组织查询结果

提示和技巧

  • API向后兼容,但不向前兼容。 例如,WebSphere Service Registry and Repository V8支持V7.5和更早的API版本。
  • 在XPath中,对属性使用@前缀,对关系使用(。)后缀。
  • 通过某些API执行图形查询时,可以进行深度查询。 例如,WebSphere DataPower使用此功能来检索WSDL及其相关的中介策略。 但是,REST不允许深度响应,因此与某些API相比,您在浏览器中看到的内容更少。
  • 在海报中。 您可以在内容字段中使用%23或#符号,但必须在URL字段中使用%23。
  • 您可以使用cURL工具执行这些示例中的命令,而不使用浏览器或Poster Firefox Extension。
  • 如果创建启用了安全性的对象,则可以使用安全URL和端口(默认为9443)。 当您执行查询或检索内容时,除非您在WebSphere Application Server中禁用了非安全端口,否则非安全端口(缺省值为9080)会自动重定向到安全端口(9443)。
  • 如果执行两次相同的POST,那么缺省情况下,您将在WebSphere Service Registry and Repository中得到两个相同的对象,只是它们具有不同的bsrURI。 您可以开发一个自定义插件来防止重复。
  • REST API提供对可能具有破坏性的命令的访问,因此请确保只有具有适当访问权限的用户才能在WebSphere Service Registry and Repository中创建,更新和删除权限,
  • WebSphere Service Registry and Repository XPath语法区分大小写。

错误处理和诊断

创建内容时参数不正确

以下是一些错误示例,您在尝试创建对象时会看到这些错误,但未包括所有必需的属性和关系。

错误的示例1:创建属性不完整的组织

创建新对象时,必须提供必需的属性。 例如,如果使用POST创建对象,然后在Poster Firefox Extension中提供以下URL:

https://localhost:9443/WSRR/7.5/Content/GenericObject?primaryType=
http://www.ibm.com/xmlns/prod/serviceregistry/v6r3/ALEModel#Organization

响应将包含以下错误:

GSR1354E:  The property "name" has not been specified in the URL

错误的示例2:创建具有不完整关系的组织

即使内容是可选的,在创建新对象时也必须提供关系名称。 例如,如果使用POST创建对象,然后在Poster Firefox Extension中提供以下URL:

https://localhost:9443/WSRR/7.5/Content/GenericObject?name=posted&primaryType=
http://www.ibm.com/xmlns/prod/serviceregistry/v6r3/ALEModel#Organization

响应将包含以下错误:

GSR0018E: Object "posted" is missing the required business model property 
"ale63_childOrganizations" of type 
"http://www.ibm.com/xmlns/prod/serviceregistry/v6r3/ALEModel#Organization"

ale63_childOrganizations关系是可选的,这意味着内容是可选的,但是在创建组织时仍必须指定关系名称。

检索时找不到结果

对于元数据查询,如果未找到与查询匹配的对象,则结果将为空的<resources>标记。

对于带有参数的内容查询,如果找不到匹配项,则会看到服务器404(找不到页面)错误。

对于内容查询,如果找不到匹配的bsrURI,您将看到此错误:

<error>
  <code>GSR0038E</code>
  <message>GSR0084E: An error occurred while attempting to lookup item 
  "8b22b18b-4fd0-4007.88a5.3a5d743aa511" in the registry.</message>
  <causemessage>GSR0597E: An error occurred when accessing the metadata 
  store.</causemessage>
  <stacktrace>com.ibm.serviceregistry.ServiceRegistryItemLookupException: 
  GSR0084E: An error occurred while attempting to lookup item 
  "8b22b18b-4fd0-4007.88a5.3a5d743aa511" in the registry.
    com.ibm.sr.athene.access.impl.AtheneAccessImpl.loadObjectByPattern
      (AtheneAccessImpl.java:1540)
    com.ibm.sr.athene.access.impl.AtheneAccessImpl.getItemByID
      (AtheneAccessImpl.java:399)
    com.ibm.sr.athene.persistence.impl.DocumentAccessor.retrieve
      (DocumentAccessor.java:109)
    ...

未编码的字符

您必须在查询中正确编码字符。 例如,如果在浏览器或Poster Firefox扩展程序中使用带有未编码#字符的URL,则:/ /WSRR/GenericObject[@primaryType=%27http://www.ibm.com/xmlns/prod/serviceregistry/profile/v6r3/GovernanceEnablementModel#ServiceVersion%27] : /WSRR/GenericObject[@primaryType=%27http://www.ibm.com/xmlns/prod/serviceregistry/profile/v6r3/GovernanceEnablementModel#ServiceVersion%27] ,那么响应将包含以下所示的错误。 请注意,查询在GovernanceEnablementModel之后被截断,这表明下一个字符(#)是不正确的字符:

<error>
<code>GSR1350E</code>
<message>GSR0089E: An error occurred while dealing with the following query: 
"/WSRR/GenericObject[@primaryType='http://www.ibm.com/xmlns/prod/
serviceregistry/profile/v6r3/GovernanceEnablementModel"
</message>
<causemessage>GSR4500E: Error parsing query: /WSRR/GenericObject
[@primaryType='http://www.ibm.com/xmlns/prod/serviceregistry/profile
/v6r3/GovernanceEnablementModel
</causemessage>
<stacktrace>com.ibm.serviceregistry.ServiceRegistryQueryException: 
GSR0089E: An error occurred while dealing with the following query: 
"/WSRR/GenericObject[@primaryType='http://www.ibm.com/xmlns/prod/
serviceregistry/profile/v6r3/GovernanceEnablementModel"
com.ibm.sr.xpath.athene_triplequery.Renderer.parse
  (Renderer.java:180)
com.ibm.sr.xpath.athene_triplequery.Renderer.transformGraphQuery
  (Renderer.java:120)
com.ibm.sr.athene.persistence.impl.QueryManagerImpl.query
  (QueryManagerImpl.java:145)
...

端口和安全

您必须为端口使用正确的HTTP类型。 例如,如果您使用REST查询https://localhost:9080/WSRR/7.5/Metadata/XML/GraphQuery?query=/WSRR/WSDLOperation ,则响应将包含以下错误:

An error occurred during a connection to localhost:9080.
SSL received a record that exceeded the maximum permissible length.
Error code: ssl_error_rx_record_too_long)

反向错误也将失败。 例如,如果使用REST查询http://localhost:9443/WSRR/7.5/Metadata/XML/GraphQuery?query=/WSRR/WSDLOperation ,则响应将包含服务器连接错误,具体消息取决于您在哪个浏览器上使用。

结论

本文向您展示了如何为WSRR编写XPath查询并使用REST测试它们。 如果您使用默认配置安装了本地WSRR,则可以直接使用浏览器测试示例查询。 您还学习了如何使用Firefox海报扩展在WSRR中创建元数据,并看到了有关如何错误配置查询以及导致错误的示例。

致谢

作者要感谢Anna Maciejkowicz(WSRR 3级服务团队的服务专家)和Phil Rowley(WSRR开发团队的软件开发人员)在审阅本文方面的帮助。


翻译自: https://www.ibm.com/developerworks/websphere/library/techarticles/1212_eggleston/1212_eggleston.html

xpath 和 re性能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值