手册下载
H3C交换机 Comware RESTful二次开发指南
本手册适用于如下交换机产品及版本:
H3C S6550X-HI系列 Release 1330P05及以上版本
H3C S6880系列 Release 1330P05及以上版本
H3C S9820-8M Release 1330P05及以上版本
Copyright © 2024 新华三技术有限公司 版权所有,保留一切权利。
非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。
除新华三技术有限公司的商标外,本手册中出现的其它公司的商标、产品标识及商品名称,由各自权利人拥有。
本文中的内容为通用性技术信息,某些信息可能不适用于您所购买的产品。
前 言
本文档主用来指导用户使用RESTful功能客户端配置和管理Comware设备。
前言部分包含如下内容:
· 读者对象
· 本书约定
· 资料意见反馈
本手册主要适用于如下工程师:
· 具有一定XML和RESTful技术基础的网络规划人员
· 负责网络配置和维护,且具有一定XML和RESTful技术基础的网络管理员
格 式 |
意 义 |
粗体 |
命令行关键字(命令中保持不变、必须照输的部分)采用加粗字体表示。 |
斜体 |
命令行参数(命令中必须由实际值进行替代的部分)采用斜体表示。 |
[ ] |
表示用“[ ]”括起来的部分在命令配置时是可选的。 |
{ x | y | ... } |
表示从多个选项中仅选取一个。 |
[ x | y | ... ] |
表示从多个选项中选取一个或者不选。 |
{ x | y | ... } * |
表示从多个选项中至少选取一个。 |
[ x | y | ... ] * |
表示从多个选项中选取一个、多个或者不选。 |
&<1-n> |
表示符号&前面的参数可以重复输入1~n次。 |
# |
由“#”号开始的行表示为注释行。 |
本书还采用各种醒目标志来表示在操作过程中应该特别注意的地方,这些标志的意义如下:
该标志后的注释需给予格外关注,不当的操作可能会对人身造成伤害。 |
|
提醒操作中应注意的事项,不当的操作可能会导致数据丢失或者设备损坏。 |
|
为确保设备配置成功或者正常工作而需要特别关注的操作或信息。 |
|
对操作内容的描述进行必要的补充和说明。 |
|
配置、操作、或使用设备的技巧、小窍门。 |
本书使用的图标及其含义如下:
该图标及其相关描述文字代表一般网络设备,如路由器、交换机、防火墙等。 |
|
该图标及其相关描述文字代表一般意义下的路由器,以及其他运行了路由协议的设备。 |
|
该图标及其相关描述文字代表二、三层以太网交换机,以及运行了二层协议的设备。 |
|
该图标及其相关描述文字代表无线控制器、无线控制器业务板和有线无线一体化交换机的无线控制引擎设备。 |
|
该图标及其相关描述文字代表无线接入点设备。 |
|
该图标及其相关描述文字代表无线终结单元。 |
|
该图标及其相关描述文字代表无线终结者。 |
|
该图标及其相关描述文字代表无线Mesh设备。 |
|
该图标代表发散的无线射频信号。 |
|
该图标代表点到点的无线射频信号。 |
|
该图标及其相关描述文字代表防火墙、UTM、多业务安全网关、负载均衡等安全设备。 |
|
该图标及其相关描述文字代表防火墙插卡、负载均衡插卡、NetStream插卡、SSL VPN插卡、IPS插卡、ACG插卡等安全插卡。 |
由于设备型号不同、配置不同、版本升级等原因,可能造成本手册中的内容与用户使用的设备显示信息不一致。实际使用中请以设备显示的内容为准。
本手册中出现的端口编号仅作示例,并不代表设备上实际具有此编号的端口,实际使用中请以设备上存在的端口编号为准。
如果您在使用过程中发现产品资料的任何问题,可以通过以下方式反馈:
E-mail:[email protected]
感谢您的反馈,让我们做得更好!
REST(Representational State Transfer,表象化状态转变)是一种面向资源的轻量级、跨平台、跨语言的程序架构,具有结构清晰、易于管理和扩展等特点。RESTful是遵循REST程序架构的一种应用。Comware设备提供了RESTful API接口,用户可以通过RESTful功能操作RESTful API接口,从而实现对Comware设备进行配置和维护。
本文档用来指导用户使用RESTful客户端,通过RESTful API配置和维护设备。
如图1-1所示,RESTful采用C/S模型。RESTful客户端为使用Python、Ruby或Java等编程语言开发出的RESTful客户端程序或脚本。RESTful服务器为网络设备。通过RESTful功能配置和维护设备的过程为:
(1) 客户端向服务器发送HTTP/HTTPS请求报文,通过HTTP的方法来操作指定的RESTful API接口。RESTful支持的HTTP操作方法包括GET、PUT、POST和DELETE。
(2) 服务器根据HTTP/HTTPS请求报文,完成对指定RESTful API接口的操作后,通过HTTP/HTTPS应答报文将操作结果返回给客户端。
在HTTP/HTTPS请求和应答报文中,请求和应答数据均采用JSON格式进行编码。
图1-1 RESTful功能示意图
RESTful基于HTTP/HTTPS协议,通过HTTP/HTTPS请求和应答报文在RESTful客户端和服务器之间进行报文交互。RESTful请求和应答报文(即HTTP/HTTPS请求和应答报文)使用标准的HTTP格式。
RESTful当前支持使用UTF-8进行传输。
HTTP/HTTPS请求报文包括请求行、请求头和请求正文(HTTP Body)几个部分。
· 请求行:由操作方法、URL和HTTP版本组成。
¡ 操作方法:取值为GET、PUT、POST或DELETE。
¡ URL:RESTful操作的对象为资源,URL需要标识出待操作资源的位置。以HTTP为例,URL的格式为http://ip-address:port/api/v1/resource-locator?parameter。
表1-1 URL字段说明
字段 |
说明 |
http |
请求报文协议类型,取值为http或https |
ip-address:port |
服务器的IP地址和端口号 如果采用HTTP、HTTPS的缺省端口号,则不需要携带端口号port |
api/v1 |
固定字段 |
resource-locator |
待操作资源的位置 查看RESTful API手册,可以获取资源的位置 RESTful API手册的详细介绍,请参见“2.4.1 RESTful API文档介绍” |
?parameter |
当前操作携带的参数,包括index、filter-condition、select-fields和getbulk-count URL中可以不携带参数 |
· 请求头:标准的HTTP请求头,包括请求的压缩方式、认证头、内容类型、内容长度等。
· 请求正文:请求数据采用JSON格式编码,封装在请求正文部分。
POST http://192.168.100.91/api/v1/Syslog/LogHosts HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400001b81dbfc50884818f45b686fd81ceaa
Content-Type: application/json
Content-Length: 78
Host: 192.168.100.91
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
{
"Address": "1.1.1.3",
"VRF": "b",
"Port": 518,
"Facility": 184
}
HTTP/HTTPS应答报文包括状态行、响应头和响应正文几个部分。
· 状态行:由HTTP版本、状态码和原因短语(Reason Phrase)组成。状态码用来标识操作执行是否成功。状态码200~299表示成功,状态码400及以上表示失败。常用状态码的含义如表1-2所示。
状态码 |
含义 |
200 |
成功 |
201 |
创建成功 |
204 |
成功,但无返回结果 |
401 |
认证失败 |
404 |
请求的资源不存在 |
405 |
HTTP方法不允许执行,比如,对只读资源进行POST操作 |
406 |
RESTful客户端和服务器端数据编码格式等不一致 |
500 |
设备内部处理错误 |
501 |
发送CONNECT等不支持RESTful的HTTP方法 |
· 响应头:标准的HTTP响应头,包括内容类型、响应时间等。
· 响应正文:响应数据采用JSON格式编码,封装在响应正文部分。
如下示例为表示操作成功的应答报文。
HTTP/1.1 201 Created
Content-Type: application/json charset=UTF-8
Location: http://192.168.100.91/api/v1/Syslog/LogHosts?index=Address%3D1.1.1.3%3BVRF%3Db
Server: HTTPD
Date: Fri, 12 Jun 2015 14:46:33 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
X-XSS-Protection: 1;mode-block
X-Content-Type-Options: nosniff
如下示例为表示操作失败的应答报文。
HTTP/1.1 409 Conflict
Content-Type: application/json charset=UTF-8
Server: HTTPD
Date: Sat, 16 Jul 2022 09:49:09 GMT
Connection: close
X-XSS-Protection: 1;mode-block
X-Content-Type-Options: nosniff
{"errors":[{"error":{"error-type":"rpc","error-tag":"bad-element","error-path":"Port","error-message":"The value must be less than or equal to 65535."}}]}
管理员通过RESTful功能配置和管理设备时,通常需要按照如下流程来操作:
(1) 配置RESTful访问方式
Comware设备支持HTTP和HTTPS两种RESTful访问方式。不同访问方式的配置方法有所不同。
不同访问方式需要的用户权限不同:
¡ HTTP访问方式,需要为用户设置HTTP访问权限。
¡ HTTPS访问方式,需要为用户设置HTTPS访问权限。
(3) 准备RESTful客户端
根据用户自身的情况,选择已有的RESTful客户端,或利用Python、Ruby、Java等编程语言开发出RESTful客户端软件、程序或脚本。
(4) 准备RESTful请求使用的报文
依据对应模块的API文档,构造出可以下发的RESTful请求。
RESTful客户端发送请求,与设备建立HTTP/HTTPS连接。
把前面测试好的脚本集成进客户端程序中。例如,把其中需要替换的部分换成自己的程序变量等。
(1) 进入系统视图。
system-view
(2) (可选)配置基于HTTP的RESTful功能的端口号。
restful http port port-number
缺省情况下,基于HTTP的RESTful功能的端口号为80。
(3) 开启基于HTTP的RESTful功能。
restful http enable
缺省情况下,基于HTTP的RESTful功能处于关闭状态。
(4) (可选)使用ACL限制HTTP客户端和设备建立TCP连接。
(IPv4网络)
http acl { advanced-acl-number | basic-acl-number }
(IPv6网络)
http ipv6 acl { advanced-acl-number | basic-acl-number }
缺省情况下,允许所有HTTP客户端和设备建立TCP连接。
(1) 进入系统视图。
system-view
(2) (可选)配置基于HTTPS的RESTful功能的端口号。
restful https port port-number
缺省情况下,基于HTTPS的RESTful功能的端口号为443。
(3) 开启基于HTTPS的RESTful功能。
restful https enable
缺省情况下, 基于HTTPS的RESTful功能处于关闭状态。
(4) (可选)使用ACL限制HTTPS客户端和设备建立TCP连接。
(IPv4网络)
https acl { advanced-acl-number | basic-acl-number }
(IPv6网络)
https ipv6 acl { advanced-acl-number | basic-acl-number }
缺省情况下,允许所有HTTPS客户端和设备建立TCP连接。
使用RESTful功能配置和维护设备前,需要确保RESTful用户具有对应的操作权限。
Comware设备通过RBAC(Role Based Access Control,基于角色的访问控制)实现基于角色的用户访问权限控制。
RESTful的底层使用的是NETCONF。因此,需要按照NETCONF的要求,通过RBAC为RESTful用户赋予相应的访问权限。NETCONF权限分为3个部分:
· 协议级权限:执行rpc-operation需要的权限。RESTful操作和NETCONF RPC操作的映射关系,及需要的权限,如表2-1所示。
表2-1 RESTful操作和NETCONF RPC映射关系
RESTful操作 |
NETCONF RPC操作 |
需要配置的权限 |
GET |
rpc/get |
read |
POST |
rpc/edit-config: create |
write |
POST |
rpc/action |
execute |
PUT |
rpc/edit-config: merge |
write |
DELETE |
rpc/edit-config: delete |
write |
· 模块级权限:用户对模块、表、行、组、列的访问权限。例如,配置用户具有操作接口模块资源的权限时,需要执行rule number permit read write execute xml-element ifmgr/命令。
· 实例级权限:用户对系统资源(如VPN实例、接口、VLAN)的操作权限。缺省情况下,用户具有操作所有系统资源的权限。
一个请求只有同时具有上述三部分的权限,才能通过RBAC的检查,执行相应的操作。
例如,下例中为RESTful用户赋予了如下权限:
· 协议级权限:具有rpc/edit-config/config/top的写权限。
· 模块级权限:具有Ifmgr/Interfaces/Interface表的写权限。
· 实例级权限:具有接口索引为3的接口的写权限。
#
role name restful
rule 1 permit write xml-element rpc/edit-config/config/top
rule 2 permit write xml-element ifmgr/interfaces/interface
interface policy deny
permit interface GigabitEthernet2/0/1
#
不同用户角色的操作权限有所不同:
· 缺省用户角色network-admin、mdc-admin、context-admin具有操作对应设备/MDC/Context的所有功能和资源(除安全日志文件管理相关命令display security-logfile summary、info-center security-logfile directory、security-logfile save之外)的权限。
· 缺省用户角色network-operator、context-operator和mdc-operator默认只有读权限和部分可执行权限。可以通过配置,为这些用户角色添加操作权限。
· 其他用户角色必须配置后才有对应的操作权限。
请根据需要配置用户角色的权限,并为用户授权相应的用户角色。
(1) 进入系统视图。
system-view
(2) 创建用户角色,并进入用户角色视图。
role name role-name
(3) 配置用户具有执行rpc-operation操作的权限。
rule number permit { execute | read | write } * xml-element rpc/
通过rule number permit { execute | read | write } * xml-element rpc/?可以查看具体操作的列表。不指定具体操作时,表示所有操作。
(4) 配置用户执行XML元素具体模块的权限。
rule number { deny | permit } { execute | read | write } * xml-element [ module-xpath ]
通过rule number { deny | permit } { execute | read | write } * xml-element ?可以查看具体模块列表,通过rule number { deny | permit } { execute | read | write } * xml-element module-name/?可以查看模块中具体表的列表。不指定具体模块和表时表示所有模块/所有表。
(5) 请根据需要配置相应的系统资源访问权限。
interface policy deny
permit interface interface-list
缺省情况下,未定义允许操作的接口列表,用户角色没有操作任何接口的权限。
可以多次执行此命令向接口列表中添加允许操作的接口。
¡ 依次执行以下命令,配置VLAN资源控制策略。
vlan policy deny
permit vlan vlan-id-list
缺省情况下,未定义允许操作的VLAN列表,用户没有操作任何VLAN的权限。
可以多次执行此命令向VLAN列表中添加允许操作的VLAN。
¡ 依次执行以下命令,配置VPN资源控制策略。
vpn-instance policy deny
permit vpn-instance vpn-instance-name&<1-10>
缺省情况下,未定义允许操作的VPN实例列表,用户没有操作任何VPN实例的权限。
可以多次执行此命令向VPN实例列表中添加允许操作的VPN实例。
¡ 依次执行以下命令,配置安全域资源控制策略。
security-zone policy deny
permit security-zone security-zone-name&<1-10>
缺省情况下,未定义允许操作的安全域列表,用户没有操作任何安全域的权限。
可以多次执行此命令向安全域列表中添加允许操作的安全域。
本配置用来为RESTful用户指定如下属性:
· 根据RESTful访问方式,指定正确的服务类型:使用HTTP访问方式时,用户的服务类型为HTTP;使用HTTPS访问方式时,用户的服务类型为HTTPS。
· 为用户授权用户角色,使其具有所需权限。
本文以本地认证为例,介绍配置过程。使用远程认证的配置方式请参见产品对应版本的《AAA配置指导》。
(1) 进入系统视图。
system-view
(2) 添加设备管理类本地用户,并进入设备管理类本地用户视图。
local-user user-name class manage
(3) 设置本地用户的密码。
(非FIPS模式)
password [ { hash | simple } string ]
(FIPS模式)
password
在非FIPS模式下,可以不为本地用户设置密码;在FIPS模式下,必须且只能通过交互式方式设置明文密码,否则用户的本地认证不能成功。
(4) 设置本地用户可以使用的服务类型。请根据访问方式选择其中一项进行配置
(非FIPS模式)
service-type { http | https } *
(FIPS模式)
service-type https
缺省情况下,本地用户不能使用任何服务类型。
(5) 设置本地用户的角色。
authorization-attribute user-role role-name
每一个支持RESTful的模块都对应一个RESTful API文档,文档命名遵循如下格式,其中XXX代表模块名:
Comware XXX REST API Reference.docx
RESTful API文档包括下面几个部分:
· 模块资源整体描述:如图2-1所示,模块资源整体描述用一个列表描述本模块的资源的整体情况,包括资源名称、资源所属基础URL、支持哪些操作。
· 资源详细信息:包括资源描述和属性详细信息表。
¡ 资源描述:提供资源本身的信息和全局约束方面信息,如图2-2所示。
¡ 属性详细信息表:提供列名称、列描述、列数据类型和约束等资源详细信息,如图2-3所示。
· 除非特殊说明,所有模块的GET操作返回结果中的列名称和属性详细信息表中的列名称一致。
· Coware RESTful API文档描述的是所有模块、所有资源的全集。模块和资源的实际支持情况与设备型号有关,请以设备实际情况为准。
RESTful请求报文(即HTTP/HTTPS请求报文)包括请求行、请求头和请求正文(HTTP Body)几个部分。请求报文中的如下部分需要根据RESTful API手册中的内容进行构造,其余部分遵循HTTP标准。
· URL中的api/v1/resource-locator取值为待操作资源所属的基础URL(Basic URL)。
· 请求正文中的请求数据,需要根据RESTful API手册中的属性详细信息表来构造。
构造RESTful请求报文的步骤为:
(1) 确认待操作资源所属的模块,找到对应模块的RESTful API文档。
(2) 在RESTful API文档的模块资源整体描述表中,查找待操作资源所属的基础URL。根据基础URL构造RESTful请求的URL。例如,采用HTTP方式对地址为10.1.1.1的设备上的VLAN资源执行创建操作时,请求报文的URL地址为:http://10.1.1.1/api/v1/VLAN/VLANs。
(3) 在RESTful API文档中,查找待操作资源的属性详细信息表,根据该表中包含的列构造请求数据,采用JSON格式对数据进行编码后,将其封装到请求正文部分。例如,在设备上创建VLAN 10、该VLAN的描述信息为VLAN10、包含的Access接口的索引值为1000时,请求正文的内容为:
{
"ID": "10",
"Description": "VLAN 10"
"AccessPortList": "1000"
}
(4) 根据URL地址、请求正文及HTTP标准的请求头等信息,构造RESTful请求报文。
配置完设备后,客户端通过HTTP/HTTPS协议,向设备指定端口的URL地址/api/v1/发送携带JSON内容体的HTTP请求来进行配置。例如,设备地址为192.168.1.1,则请求地址为:
· HTTP方式:http://192.168.1.1/api/v1/
· HTTPS方式:https://192.168.1.1:443/api/v1/
· HTTP/HTTP URL地址中最后的反斜杠(/)不可省略。
· HTTP方式的缺省端口号为80,HTTPS方式的缺省端口号为443。可以通过命令行修改端口号。配置方法请参见“2.2 配置RESTful访问方式”。
RESTful客户端发送登录报文请求与设备建立连接时,登录请求报文的格式为:
POST http://192.168.100.91/api/v1/tokens HTTP/1.1
Accept-Encoding: gzip,deflate
Authorization: Basic dGVzdDp0ZXN0
Content-Type: application/json
Content-Length: 0
Host: 192.168.100.91
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
设备回复的应答报文为:
HTTP/1.1 201 Created
Content-Type: application/json charset=UTF-8
Server: HTTPD
Date: Fri, 12 Jun 2015 11:43:38 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
{
"token-id": "40000142841c72b5d700bc67a55ae1f2567e",
"link": "http://192.168.100.91/api/v1/tokens/40000142841c72b5d700bc67a55ae1f2567e",
"expiry-time": "11:43:44"
}
在上面的请求报文中,Authorization的值用标准的HTTP认证basic方式计算得到。计算方法为:用户名和密码之间增加一个冒号,再将得出的结果字符串用Base64算法编码。例如,提供的用户名为Aladdin、密码为open sesame,则拼接后的结果就是Aladdin:open sesame,然后再将其用Base64编码,得到QWxhZGRpbjpvcGVuIHNlc2FtZQ==
后续的请求中需要携带应答报文返回的token-id,并将其放在X-Auth-Token中。例如,获取LogHosts配置的请求报文如下:
GET http://192.168.100.91/api/v1/Syslog/LogHosts?index=Address%3D1.1.1.1%3BVRF%3Da HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400001b81dbfc50884818f45b686fd81ceaa
Host: 192.168.100.91
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
上述请求报文的应答报文格式如下:
HTTP/1.1 200 OK
Content-Type: application/json charset=UTF-8
Server: HTTPD
Date: Fri, 12 Jun 2015 13:28:24 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
{"LogHosts":[{"Address":"192.168.1.1","VRF":"","Port":514,"Facility":184}]}
客户端应答需要考虑在某些情况下的异常恢复,如连接断开的情况、长时间不能得到结果的情况。
当准备好的RESTful请求报文经过验证是正确的后,可以把验证好的RESTful请求报文集成到自己的客户端脚本或程序中。如果是无人值守的程序,需要考虑超时、断线等异常情况,以保证长时间情况下也能正确运行。
完成对设备的管理后,如果不再使用该RESTful连接,则建议断开RESTful客户端与设备的连接,以释放资源。
RESTful客户端通过向当前token的URL(api/v1/tokens/token-id)发送DELETE来断开RESTful客户端与设备的连接。
断开连接时,RESTful客户端发送的请求报文格式为:
DELETE http://192.168.100.91/api/v1/tokens/400001b81dbfc50884818f45b686fd81ceaa HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400001b81dbfc50884818f45b686fd81ceaa
Host: 192.168.100.91
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
上述请求报文的应答报文格式为:
HTTP/1.1 204 No Content
Content-Type: application/json charset=UTF-8
Server: HTTPD
Date: Fri, 12 Jun 2015 15:00:33 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
对于RESTful会话,从发送登录报文建立连接开始,直到对token资源发送DELETE断开连接、或者闲置时间超期,在这期间会话一直有效。会话期间属于此会话的每一个请求都是一个新的TCP连接。应答完成后TCP连接关闭。后续请求依赖登录报文返回的token-id来标识其身份。如果最后一个请求之后闲置时间超过10分钟,则此会话自动被关闭。如果希望保持会话,可以每隔一段时间,发送一个使用token-id来标识的获取token的报文给服务器,服务器返回和登录相同的应答报文。
RESTful会话可以使用多个线程,使用相同的token-id来发送请求而互不干扰,但并发数量存在限制。不建议使用这个方式来进行并发。
RESTful支持的最大会话个数依赖于AAA会话最大个数的配置。
Comware RESTful支持的操作如表4-1所示。
表4-1 Comware RESTful支持的操作速览表
操作系列 |
操作名称 |
说明 |
获取数据 |
GET |
获取设备的数据 |
创建数据 |
POST |
创建系统配置,必须不存在才可以 |
更新数据 |
PUT |
修改系统配置,如果数据不存在,会创建 |
删除数据 |
DELETE |
删除系统配置,只允许删除创建的资源 |
执行RESTful操作时,通过在URL中指定参数,可以对操作的数据进行过滤。RESTful操作支持的参数包括index、filter-condition、select-fields和getbulk-count。
· 参数index格式是index=Indexname=Value,而且必须输入全部的索引列。
· 参数filter-condition格式是filter-condition=condition:Name=Value,该参数可以输入索引列或者普通列,但是索引列不能与参数index中的列重复。
· 参数select-fields格式是select-fields=Name。
· 参数getbulk-count格式是getbulk-count=Value,Value值就是get-bulk操作count属性的值,表示要获取数据条目的个数。
多个索引或者过滤条件之间用分号分隔,多个参数之间用‘&’号分隔,如果索引或者过滤条件为空值也必须给出等号。例如:
index=Indexname1=value1;indexname2=&filter-condition=Name3=Value3。
GET操作用来获取系统中的运行和状态数据。
GET操作不支持在HTTP BODY中给出索引或者过滤内容。对于索引或者过滤条件,必须用HTTP参数的方式放在URL的参数中。
GET支持过滤和列选择,请求会返回当前资源满足请求的全部属性数据:
· 过滤功能通过URL参数filter-condition实现,由condition来确定匹配方式,比如more、notMore、less、notLess等,默认值为equal。
· 列选择功能通过URL参数select-fields实现,用以添加希望获取到的列。
参数的内容需要用类似encodeURI的方法进行编码。比如,index=Address=1.1.1.1;VRF=a编码后变为index=Address%3D1.1.1.1%3BVRF%3Da。其中,%3D代表字符“=”、%3B代表字符“;”。
通过在URL中指定index参数,可以对GET操作的返回数据进行过滤,使得GET操作仅返回与index参数匹配的数据。如果同一个对象有多个索引,则在URL中指定index参数时,不同索引之间需要通过分号“;”分隔,如“index=索引列1=值1;索引列2=值2”。
以获取接口索引为1281的接口的全部列信息(IfIndex=1281)为例,客户端发送的报文格式如下。
GET http://192.168.56.120/api/v1/Ifmgr/Interfaces?index=IfIndex%3D1281 HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400001d534ee6ba9b7d4e26e65e0bfa1df9f
Host: 192.168.56.120
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
设备收到获取接口信息的请求报文后,将接口索引为1281的接口的信息通过如下报文反馈给客户端。
HTTP/1.1 200 OK
Content-Type: application/json charset=UTF-8
Server: HTTPD
Date: Mon, 31 May 2021 15:48:36 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
X-XSS-Protection: 1;mode-block
X-Content-Type-Options: nosniff
{"IfIndex":1281,"Name":"M-GigabitEthernet0\/0\/0","AbbreviatedName":"MGE0\/0\/0","PortIndex":1281,"ifTypeExt":"28","ifType":"6","Description":"manage","AdminStatus":1,"OperStatus":1,"ConfigSpeed":1,"ActualSpeed":1000000,"ConfigDuplex":3,"ActualDuplex":1,"PortLayer":2,"InetAddressIPV4":"192.168.56.120","InetAddressIPV4Mask":"255.255.0.0","MAC":"78-81-C4-32-01-01","ForwardingAttributes":17,"ConfigMTU":1500,"ActualMTU":1500,"ActualBandwidth":1000000,"SubPort":false,"Interval":300,"LastChange":"0Day4Hour36Minute23Second","Actual64Bandwidth":1000000,"IPv4ProtocolStatus":1,"IPv6ProtocolStatus":0}
通过在URL中指定select-fields参数,可以使得设备仅返回指定的列。如果需要设备返回多个列,需在URL中,不同列之间需要通过分号“;”分隔,如“select-fields=列1;列2;列3”。
不论是否通过select-fields参数指定索引列,GET操作返回的数据中始终包括索引列。
select-fields的操作示例如下:
以获取所有接口的接口名、接口简名和接口索引信息为例,客户端发送的报文格式如下。
GET http://192.168.56.120/api/v1/Ifmgr/Interfaces?select-fields=Name%3BAbbreviatedName%3BPortIndex HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400001d534ee6ba9b7d4e26e65e0bfa1df9f
Host: 192.168.56.120
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
设备收到获取接口信息的请求报文后,将接口索引、接口名、接口简名信息通过如下报文反馈给客户端。
HTTP/1.1 200 OK
Content-Type: application/json charset=UTF-8
Server: HTTPD
Date: Mon, 31 May 2021 15:45:15 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
X-XSS-Protection: 1;mode-block
X-Content-Type-Options: nosniff
{"Interfaces":[{"IfIndex":1281,"Name":"M-GigabitEthernet0\/0\/0","AbbreviatedName":"MGE0\/0\/0","PortIndex":1281},{"IfIndex":1409,"Name":"NULL0","AbbreviatedName":"NULL0"},{"IfIndex":1410,"Name":"InLoopBack0","AbbreviatedName":"InLoop0"},{"IfIndex":1536,"Name":"LoopBack2","AbbreviatedName":"Loop2"},{"IfIndex":1537,"Name":"LoopBack0","AbbreviatedName":"Loop0"},{"IfIndex":1601,"Name":"LoopBack1","AbbreviatedName":"Loop1"}]}
基于列的过滤包括严格匹配过滤、正则表达式匹配过滤和条件匹配过滤。
同时使用多种过滤方式时,只有一个过滤方式生效。过滤方式的优先级从高到低依次为:严格匹配过滤、正则表达式匹配过滤和条件匹配过滤。
基于列的过滤操作通过在URL中指定filter-condition参数实现。
· 列的严格匹配过滤
列的严格匹配过滤通过在URL中指定“filter-condition=列名=值”来实现。如需同时使用多个列进行过滤,则在URL中指定filter-condition参数时,不同列之间需要通过分号“;”分隔,例如“filter-condition=列名1=值1; 列名2=值2”。
以获取接口名为M-GigabitEthernet0/0/0的接口的信息为例(filter-condition=Name= M-GigabitEthernet0/0/0),客户端发送的报文格式如下。
GET http://192.168.56.120/api/v1/Ifmgr/Interfaces?filter-condition=Name%3DM-GigabitEthernet0%2F0%2F0 HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400001d534ee6ba9b7d4e26e65e0bfa1df9f
Host: 192.168.56.120
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
设备收到获取接口信息的请求报文后,将接口名为M-GigabitEthernet0/0/0的接口的信息通过如下报文反馈给客户端。
HTTP/1.1 200 OK
Content-Type: application/json charset=UTF-8
Server: HTTPD
Date: Mon, 31 May 2021 15:47:47 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
X-XSS-Protection: 1;mode-block
X-Content-Type-Options: nosniff
{"Interfaces":[{"IfIndex":1281,"Name":"M-GigabitEthernet0\/0\/0"}]}
由于URL中没有指定select-fields参数,因此,返回的接口信息中只包括索引列和filter-condition指定的列(即接口名Name)。
· 列的正则表达式匹配过滤
列的正则表达式匹配过滤通过在URL中指定“filter-condition=regExp:列名=正则表达式”来实现。如果需要同时指定多个列的正则表达式,则不同正则表达式之间需要通过分号“;”分隔,如“filter-condition=regExp:列名1=正则表达式1; regExp:列名2=正则表达式2;”。
列的正则表达式过滤匹配如下例所示:
以获取接口描述(Description)中仅包括数字和字母的接口的信息为例,客户端发送的报文格式如下。
GET http://192.168.56.120/api/v1/Ifmgr/Interfaces?filter-condition=regExp%3ADescription%3D%5E%5Ba-zA-Z0-9%5D*%24 HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400001d534ee6ba9b7d4e26e65e0bfa1df9f
Host: 192.168.56.120
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
设备收到获取接口信息的请求报文后,将匹配正则表达式的接口信息通过如下报文返回给客户端。
HTTP/1.1 200 OK
Content-Type: application/json charset=UTF-8
Server: HTTPD
Date: Mon, 31 May 2021 15:51:43 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
X-XSS-Protection: 1;mode-block
X-Content-Type-Options: nosniff
{"Interfaces":[{"IfIndex":1281,"Description":"manage"},{"IfIndex":1409,"Description":"N0U0L0L"}]}
· 列的条件匹配过滤
由于正则表达仅能够完成字符匹配,对于数值逻辑的判断和过滤实现起来比较麻烦。此时,可使用条件匹配过滤功能来根据数值对返回数据进行过滤。
列的条件匹配过滤通过在URL中指定“filter-condition=条件命令:列名=条件值”来实现。如果需要同时指定多个列的条件匹配规则,则不同条件匹配规则之间需要通过分号“;”分隔,如“filter-condition=条件命令1:列名1=条件值1;条件命令2:列名2=条件值2;”。
RESTful操作支持的条件命令如表4-2所示。
表4-2 RESTful操作支持的条件命令
大于 |
filter -condition=more:column=value |
列的取值大于value,支持的数据类型为:日期、数字、字符串 |
小于 |
filter -condition=less:column=value |
列的取值小于value,支持的数据类型为:日期、数字、字符串 |
不小于 |
filter -condition=notLess:column=value |
列的取值不小于value,支持的数据类型为:日期、数字、字符串 |
不大于 |
filter -condition=notMore:column=value |
列的取值不大于value,支持的数据类型为:日期、数字、字符串 |
等于 |
filter -condition=equal:column=value |
列的取值等于value,支持的数据类型为:日期、数字、字符串、OID、BOOL |
不等于 |
filter -condition=notEqual:column=value |
列的取值不等于value,支持的数据类型为:日期、数字、字符串、OID、BOOL |
包含 |
filter -condition=include:column=value |
列的取值中包含字符串string,支持的数据类型为:字符串 |
不包含 |
filter -condition=exclude:column=value |
列的取值中不能包含字符串string,支持的数据类型为:字符串 |
开始于 |
filter -condition=startWith:column=value |
列的取值以字符串string开头,支持的数据类型为:字符串、OID |
结束于 |
filter -condition=endWith:column=value |
列的取值以字符串string结束,支持的数据类型为:字符串 |
以获取接口索引值大于1281的所有接口的接口名信息为例(filter-condition=more:IfIndex=1281、select-fields=Name),客户端发送的报文格式如下。
GET http://192.168.56.120/api/v1/Ifmgr/Interfaces?select-fields=Name&filter-condition=more%3AIfIndex%3D1281%3B HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400001d534ee6ba9b7d4e26e65e0bfa1df9f
Host: 192.168.56.120
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
设备收到获取接口信息的请求报文后,将接口索引值大于1281的所有接口的接口名信息通过如下报文反馈给客户端。
HTTP/1.1 200 OK
Content-Type: application/json charset=UTF-8
Server: HTTPD
Date: Mon, 31 May 2021 15:39:57 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
X-XSS-Protection: 1;mode-block
X-Content-Type-Options: nosniff
{"Interfaces":[{"IfIndex":1409,"Name":"NULL0"},{"IfIndex":1410,"Name":"InLoopBack0"},{"IfIndex":1536,"Name":"LoopBack2"},{"IfIndex":1537,"Name":"LoopBack0"},{"IfIndex":1601,"Name":"LoopBack1"}]}
RESTful GET操作中可以同时指定index、select-fields和filter-condition参数,以实现进行多重条件过滤。
通过客户端发送如下报文,可以获取符合如下条件的接口信息:
· 接口索引值为1281。
· 接口描述信息中仅包括数字和字母。
· 返回接口的名称列。
GET http://192.168.56.120/api/v1/Ifmgr/Interfaces?index=IfIndex%3D%201281&select-fields=Name%3B&filter-condition=regExp%3ADescription%3D%5E%5Ba-zA-Z0-9%5D*%24 HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400001f430ff4fda0c5485a17934edf035e8
Host: 192.168.56.120
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
设备收到获取接口信息的请求报文后,将满足条件的接口信息通过如下报文反馈给客户端。
HTTP/1.1 200 OK
Content-Type: application/json charset=UTF-8
Server: HTTPD
Date: Mon, 31 May 2021 15:27:05 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
X-XSS-Protection: 1;mode-block
X-Content-Type-Options: nosniff
{"IfIndex":1281,"Name":"M-GigabitEthernet0\/0\/0","Description":"manage"}
RESTful GET操作中可以指定getbulk-count参数来获取N行数据。
例如,通过客户端发送如下请求报文,可以获取3个VLAN的信息。
GET http://192.168.56.120/api/v1/VLAN/VLANs?getbulk-count=3 HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400001d534ee6ba9b7d4e26e65e0bfa1df9f
Host: 192.168.56.120
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
设备收到获取VLAN信息的请求报文后,将VLAN 1、VLAN 2和VLAN 3这三个VLAN的信息通过如下报文反馈给客户端。
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Server: HTTPD
Date: Wed, 11 May 2022 06:56:22 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1;mode-block
X-Content-Type-Options: nosniff
{"VLANs":[{"ID":1,"Description":"VLAN 0001","Name":"VLAN 0001","Shared":false},{"ID":2,"Description":"VLAN 0002","Name":"VLAN 0002","AccessPortList":"","Shared":false},{"ID":3,"Description":"VLAN 0003","Name":"VLAN 0003","AccessPortList":"","Shared":false}]}
RESTful GET操作中可以同时指定index和getbulk-count参数来获取指定位置的N行数据。
例如,通过客户端发送如下请求报文,可以获取index从5开始的3个Log的信息。
(设置index = 4,获取 index 5,index 6,index 7。)
GET
http://192.168.56.103/api/v1/Syslog/Logs?Index=Index%3D4&getbulk-count=3 HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400003b224f76b65c773380523b9ae1d6d4e
Host: 192.168.56.103
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
设备收到获取Log信息的请求报文后,将Index 5、Index 5和Index 6这三个Log的信息通过如下报文反馈给客户端。
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Server: HTTPD
Date: Thu, 27 Jul 2023 17:34:55 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1;mode-block
X-Content-Type-Options: nosniff
{"Logs":[{"Index":5,"Time":"2023-07-27T17:33:47","Group":"SHELL","Digest":"SHELL_CMD","Severity":6,"Content":" -Line=con0-IPAddr=**-User=**; Command is authorization-attribute user-role network-admin"},{"Index":6,"Time":"2023-07-27T17:33:47","Group":"SHELL","Digest":"SHELL_CMD","Severity":6,"Content":" -Line=con0-IPAddr=**-User=**; Command is service-type http"},{"Index":7,"Time":"2023-07-27T17:33:47","Group":"SHELL","Digest":"SHELL_CMD","Severity":6,"Content":" -Line=con0-IPAddr=**-User=**; Command is password simple ******"}]}
POST操作用来创建指定的资源,相当于NETCONF edit-config操作中的create。POST请求的内容需要放在HTTP Body中,而且URL中不能携带index参数。如果执行成功,会返回201。
POST操作也可用来下发action请求,相当于NETCONF中的action操作。RESTful通过以“/api/v1/action/”开头的URL下发Action请求。
POST操作支持批量下发多行数据。
全局资源不支持通过POST操作来创建。
客户端发送如下报文,可以实现在设备上添加信息中心的日志主机。添加的日志主机IP地址为1.1.1.3、所属VPN实例为b、接收日志信息的端口号为518、记录工具为local7。
POST http://192.168.100.91/api/v1/Syslog/LogHosts HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400001b81dbfc50884818f45b686fd81ceaa
Content-Type: application/json
Content-Length: 78
Host: 192.168.100.91
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
{
"Address": "1.1.1.3",
"VRF": "b",
"Port": 518,
"Facility": 184
}
设备收到请求报文后,会通过如下报文通知客户端日志主机创建成功。
HTTP/1.1 201 Created
Content-Type: application/json charset=UTF-8
Location: http://192.168.100.91/api/v1/Syslog/LogHosts?index=Address%3D1.1.1.3%3BVRF%3Db
Server: HTTPD
Date: Fri, 12 Jun 2015 14:46:33 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
客户端发送如下报文,可以实现在设备上创建VLAN 2。
POST http://192.168.100.91/api/v1/VLAN/VLANs HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400001b81dbfc50884818f45b686fd81ceaa
Content-Type: application/json
Content-Length: 44
Host: 192.168.100.91
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
{
"ID": "2",
"Description": "VLAN 2"
}
设备收到请求报文后,会通过如下报文通知客户端VLAN创建成功。
HTTP/1.1 201 Created
Content-Type: application/json charset=UTF-8
Location: http://192.168.100.91/api/v1/VLAN/VLANs?index=ID%3D2
Server: HTTPD
Date: Fri, 12 Jun 2015 14:49:21 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
客户端发送如下报文,可以实现清除接口索引值为1281的接口的数据。
POST http://192.168.79.167/api/v1/action/Ifmgr/Interfaces HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400001fb4b7abc838fe880ad66f6b06c8bf3
Content-Type: application/json
Content-Length: 36
Host: 192.168.79.167
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
{
"IfIndex":"1281",
"Clear": ""
}
在下发的HTTP Body中如果存在不需要携带取值的列,则该列可以通过"ColumnName": "" 形式下发,如上述举例中的"Clear": ""。
设备收到请求报文后,会通过如下报文通知客户端接口数据清除成功。
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Location: http://192.168.79.167/api/v1/Ifmgr/Interfaces?index=IfIndex%3D1281
Server: HTTPD
Date: Fri, 17 May 2019 06:29:31 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
X-Frame-Options: SAMEORIGIN
客户端发送如下报文,可以实现在设备上创建VLAN列表34。
POST http://192.168.79.167/api/v1/action/VLAN/BatchVlans HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400001ffb29850dbb0763f29851bb4efa97a
Content-Type: application/json
Content-Length: 54
Host: 192.168.79.167
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
{
"CreateVlanList": "34"
}
设备收到请求报文后,会通过如下报文通知客户端创建VLAN列表成功。
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Server: HTTPD
Date: Fri, 17 May 2019 06:51:20 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
X-Frame-Options: SAMEORIGIN
{ "CreateVlanList":"34" }
S6550X-HI、S6880系列交换机不支持本功能。
S9820-8M交换机不支持本功能。
客户端发送如下报文,可以实现在设备上添加两个日志主机:
日志主机1:IP地址为1.1.1.5、所属VPN实例为aaa、接收日志信息的端口号为515、记录工具为local7。
· 日志主机2:IP地址为1.1.1.6、所属VPN实例为aaa、接收日志信息的端口号为515、记录工具为local7。
POST http://192.168.56.101/api/v1/Syslog/LogHosts HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 4000019cb383a71c5781ce33cc2feaf8e4d1
Content-Type: application/json;charset=UTF-8
Content-Length: 223
Host: 192.168.56.101
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
{"LogHosts": [
{
"Address": "1.1.1.5",
"VRF": "aaa",
"Port": 515,
"Facility": 184
},
{
"Address": "1.1.1.6",
"VRF": "aaa",
"Port": 515,
"Facility": 184
}
]}
设备收到请求报文后,会通过如下报文通知客户端两个日志主机均创建成功。
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Server: HTTPD
Date: Thu, 09 Dec 2021 05:26:18 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
X-Frame-Options: SAMEORIGIN
{"LogHosts":[{"Address":"1.1.1.5","VRF":"aaa","Port":515,"Facility":184,"Format":0},{"Address":"1.1.1.6","VRF":"aaa","Port":515,"Facility":184,"Format":0}]}
PUT操作用来修改现有资源,相当于NETCONF edit-config操作中的merge。如果指定的资源已经存在,则会修改该资源;如果指定的资源不存在,则会创建该资源。PUT操作执行成功后,设备会返回204。
对于PUT操作,需要注意的是:
· 索引列必须在URL的index参数中给出,而且必须和HTTP Body中给出的索引列的值一致。
· 参数index的格式与GET操作相同,为index=Indexname1=value1;indexname2=value2。参数的内容需要用类似encodeURI的方法进行编码。
客户端发送如下报文,可以实现在设备上创建日志主机,或修改已有日志主机的信息。
PUT http://192.168.1.1:80/api/v1/Syslog/LogHosts
X-Auth-Token: 1000028562945fa49b19199a71a01f33d609
{
“Loghosts”:[
{“Address”:”1.1.1.1”, “VFR”:””, “Port “:514, “Facility”: 192 },
]}
设备收到请求报文后,会通过如下报文通知客户端日志主机或修改成功。本例中,设备上不存在请求对应的日志主机,在设备上创建了该日志主机。
204 No Content
客户端发送如下报文,可以修改设备上接口索引值为3的接口的描述信息。
PUT http://192.168.100.91/api/v1/Ifmgr/Interfaces?index=IfIndex%3D3 HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400001b81dbfc50884818f45b686fd81ceaa
Content-Type: application/json
Content-Length: 51
Host: 192.168.100.91
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
{
"IfIndex":3,
"Description": "Interface 3"
}
URL中的index参数与HTTP Body中索引列的取值必须相同,本例中取值均为3。
设备收到请求报文后,会通过如下报文通知客户端接口描述信息修改成功。
HTTP/1.1 204 No Content
Content-Type: application/json charset=UTF-8
Server: HTTPD
Date: Fri, 12 Jun 2015 14:26:10 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
DELETE操作用来删除指定的资源,相当于NETCONF edit-config操作中的delete。此操作不能携带HTTP Body。
不允许对不可创建资源执行DELETE操作。对不可创建资源执行DELETE操作时,会返回405 Method Not Allowed。
对可创建资源执行DELETE操作时,必须在URL的index参数中给出待删除资源的索引。收到DELETE操作请求后,设备会删除指定索引对应资源的全部属性。当资源不存在,或者资源不允许删除时,会返回409 Conflict。
在DELETE操作中,参数index的格式与GET操作中参数index的格式相同,均为index=Indexname1=value1;indexname2=value2。参数的内容需要用类似encodeURI的方法进行编码。
以资源Syslog/LogHosts为例,如果要删除VPN实例内IP地址为1.1.1.1的日志主机,客户端需要发送如下请求报文。
DELETE http://192.168.100.91/api/v1/Syslog/LogHosts?index=Address%3D1.1.1.1%3BVRF%3Da HTTP/1.1
Accept-Encoding: gzip,deflate
X-Auth-Token: 400001b81dbfc50884818f45b686fd81ceaa
Host: 192.168.100.91
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
设备收到请求报文后,会通过如下报文通知客户端,日志主机删除成功。
HTTP/1.1 204 No Content
Content-Type: application/json charset=UTF-8
Server: HTTPD
Date: Fri, 12 Jun 2015 14:07:50 GMT
Connection: Keep-Alive
Transfer-Encoding: chunked
Postman是一款常用的接口测试工具。用户可以使用Postman作为RESTful客户端,对Comware设备进行配置和维护。本节以一个实际例子,来介绍Postman作为RESTful客户端的操作方法。
使用Postman作为RESTful客户端登录Comware设备(IP地址为192.168.32.100)的过程为:
(1) 依次点击<File-New-HTTP Request>按钮,新建RESTful请求。
图5-1 新建Restful请求
(2) 设置请求的操作类型为POST,并输入URL地址http://192.168.32.100/api/v1/tokens。
图5-2 设置RESTful请求的操作类型和URL地址
(3) 点击<Authorization>页签,选择Type为Basic Auth,并在Username和Password处填写RESTful用户的用户名和密码。
图5-3 设置RESTful请求的认证功能
(4) 点击<Send>按钮,发送RESTful请求。返回如图5-4所示的数据后,说明Restful客户端成功登录设备。
图5-4 发送Restful请求登录设备
通过Postman工具执行GET操作的过程为:
(1) 设置RESTful请求的操作类型为GET,并输入URL。本例为获取接口数据,URL地址为http://192.168.32.100/api/v1/Ifmgr/Interfaces。
图5-5 构造GET操作的RESTful请求
(2) 在Headers中增加X-Auth-Token和对应的value,该value为登录设备后,返回的token-id值。
图5-6 设置X-Auth-Token
(3) 点击<Send>按钮,发送RESTful请求,获取接口相关数据。
图5-7 获取接口数据
通过Postman工具执行POST操作的过程为:
(1) 设置RESTful请求的操作类型为POST,并输入URL。本例为在设备上添加信息中心的日志主机,URL地址为http://192.168.32.100/api/v1/Syslog/LogHosts。
图5-8 构造POST操作的RESTful请求
(2) 在Headers中增加X-Auth-Token和对应的value,该value为登录设备后,返回的token-id值;增加Content-Type,并选择格式为application/json。
图5-9 设置RESTful请求的Headers
(3) 在Body中,设置需要创建日志主机的参数。
图5-10 在RESTful请求的Body中设置日志主机参数
(4) 点击<Send>,发送RESTful请求,创建日志主机。
图5-11 创建日志主机
通过Postman工具执行PUT操作的过程为:
(1) 设置RESTful请求的操作类型为PUT,并输入URL。本例为修改接口描述数据,URL地址为http://192.168.32.100/api/v1/Ifmgr/Interfaces?index=IfIndex%3DM-GigabitEthernet0%2F0%2F0。
图5-12 构造PUT操作的RESTful请求
(2) 在Headers中增加X-Auth-Token和对应的value,该value为登录设备后,返回的token-id值;增加Content-Type,并选择格式为application/json。
(3) 在Body中,设置修改接口描述的参数。
图5-13 在RESTful请求的Body中设置修改接口描述的参数
(4) 点击<Send>,发送RESTful请求,修改接口描述。
图5-14 修改接口描述
通过Postman工具执行DELETE操作的过程为:
(1) 设置RESTful请求的操作类型为DELETE方式,并输入URL。本例为删除之前创建的日志主机,URL地址为http://192.168.32.100/api/v1/Syslog/LogHosts?index=Address%3D1.1.1.3%3BVRF%3Db。
图5-15 构造DELETE操作的RESTful请求
(2) 在Headers中增加X-Auth-Token和对应的value,该value为登录设备后,返回的token-id值。
(3) 点击<Send>,发送RESTful请求,删除日志主机。
图5-16 删除日志主机
Python是目前比较流行的脚本语言。本节将介绍以该语言为基础的RESTful客户端程序的开发方法。本节展示的代码,都是较为简单的示例,可以完成RESTful相关的基本操作。
使用Python语言开发RESTful客户端程序前,要求用户熟悉如下知识:
· RESTful相关知识。
· HTTP相关知识。
· Python开发语言。
采用Python提供的requests模块可以实现RESTful客户端登录Comware设备。如下为登录设备的Python代码示例:
def restful_login():
"""
登录设备的URL,用于获取tokenid
"""
url = 'http://192.168.32.100/api/v1/tokens'
"""
HTTP的headers填充,Authorization为标准的HTTP认证basic方式认证
"""
headers = {"Authorization":"Basic YWRtaW46YWRtaW4=","Content-type":"application/json","Accept": "application/json"}
"""
登录设备
"""
req = requests.post(url, headers=headers)
"""
返回结果以json格式输出
"""
return req.json()
通过上述代码向Comware设备发送RESTful请求后,RESTful客户端会接收到设备返回的token-id值。后续,RESTful客户端发送的请求中需要携带该token-id值,并将其放在X-Auth-Token中。
通过GET操作获取接口数据的Python代码示例如下:
def restful_get():
"""
URL用于获取接口数据
"""
url = 'http://192.168.32.100:/api/v1/Ifmgr/Interfaces'
tokenJson = restful_login()
"""
获取登录时返回数据中的token-id值
"""
for key,value in tokenJson.items():
if key == 'token-id':
token = value
"""
HTTP的headers填充,X-Auth-Token取值为登录时返回数据中的token-id值
"""
headers = {"X-Auth-Token":token,"Content-type":"application/json","Accept": "application/json"}
"""
获取接口数据
"""
req = requests.get(url, headers=headers)
print(req.json())
通过POST操作创建日志主机的Python代码示例如下:
def restful_post():
"""
URL用于创建日志主机
"""
url = 'http://192.168.32.100:/api/v1/Syslog/LogHosts '
"""
Body中填充的JSON数据为创建的日志主机的参数
"""
values = {"Address": "1.1.1.3","VRF": "b","Port": 518,"Facility": 184}
"""
使用JSON模块转换成标准JSON字符串,并获取登录时返回数据中的token-id值
"""
param = json.dumps(values)
tokenJson = restful_login()
for key,value in tokenJson.items():
if key == 'token-id':
token = value
"""
HTTP的headers填充,X-Auth-Token取值为登录时返回数据中的token-id值
"""
headers = {"X-Auth-Token":token,"Content-type":"application/json","Accept": "application/json"}
"""
创建日志主机
"""
req = requests.post(url, data=param, headers=headers)
print(req.status_code)
通过PUT操作修改接口描述信息的Python代码示例如下:
def restful_put():
"""
URL用于修改接口的描述信息,注意PUT操作的URL中需要添加index信息
"""
url = 'http://192.168.32.100:/api/v1/Ifmgr/Interfaces?index=IfIndex%3DM-GigabitEthernet0%2F0%2F0'
"""
Body中填充的JSON数据为修改的接口描述信息
"""
values = {"IfIndex": "M-GigabitEthernet0/0/0", "Description": "ll"}
"""
使用JSON模块转换成标准JSON字符串,并获取登录时返回数据中的token-id值
"""
param = json.dumps(values)
tokenJson = restful_login()
for key,value in tokenJson.items():
if key == 'token-id':
token = value
"""
HTTP的headers填充,X-Auth-Token取值为登录时返回数据中的token-id值
"""
headers = {"X-Auth-Token":token,"Content-type":"application/json","Accept": "application/json"}
"""
修改接口描述信息
"""
req = requests.put(url, data=param, headers=headers)
print(req.status_code)
通过PUT操作删除日志主机的Python代码示例如下:
def restful_delete():
"""
URL用于删除日志主机
"""
url = 'http://192.168.32.100:/api/v1/Syslog/LogHosts?index=Address%3D1.1.1.1%3BVRF%3Da '
tokenJson = restful_login()
"""
获取登录时返回数据中的token-id值
"""
for key,value in tokenJson.items():
if key == 'token-id':
token = value
"""
HTTP的headers填充,X-Auth-Token取值为登录时返回数据中的token-id值
"""
headers = {"X-Auth-Token":token,"Content-type":"application/json","Accept": "application/json"}
"""
删除日志主机
"""
req = requests.delete(url, headers=headers)
print(req.status_code)