网络自动化运维 Help

8-2 RESTconf服务与Postman客户端、requests库

介绍

RESTconf:设备侧运行http服务,请求的url符合YANG模型,与netconf协议相似。

RESTconf VS NETconf:

特性

NETCONF

RESTCONF

协议

基于 XML 的 RPC,主要通过 SSH,也支持 TLS

基于 HTTP/HTTPS,遵循 RESTful 原则

数据编码

XML

XML 和 JSON

操作

远程过程调用 (RPC)

标准 HTTP 方法 (GET, POST, PUT, DELETE, PATCH)

状态性

有状态(面向会话)

无状态

事务

支持事务和回滚机制

通常是立即生效的配置更改

锁定

支持配置锁定机制

通常没有显式的锁定机制

采纳程度

成熟,广泛实现

采用率增长中,尤其是在基于 Web 的工具中

用例

全面的设备配置和管理

基于 Web 的网络管理和自动化

服务端(CE12800设备侧)

eNSP中的S5700不支持,仍然使用CE12800,CE12800的镜像已下发至学生机。

8 2

  1. 与物理机互通。

# 跟前面章节一致 <HUAWEI>system-view immediately [HUAWEI]interface GE1/0/0 [HUAWEI-GE1/0/0]undo portswitch [HUAWEI-GE1/0/0]ip address 192.168.56.100 24 [HUAWEI-GE1/0/0]undo shutdown [HUAWEI-GE1/0/0]display ip interface brief # 确认有IP和PHY状态为UP [HUAWEI-GE1/0/0]ping 192.168.56.1 [HUAWEI-GE1/0/0]q [HUAWEI]
  1. 创建本地账户。因为http RESTconf服务采用http自带的基础鉴权,鉴权通过后才能正常请求。

# 跟前面章节一致 [HUAWEI]aaa [HUAWEI-aaa]local-user zhangsan password irreversible-cipher Huawei@123 # 记下用户名zhangsan和密码Huawei@123 [HUAWEI-aaa]local-user zhangsan service-type http # 忽略http协议不安全的警告 [HUAWEI-aaa]q [HUAWEI]
  1. 开启restconf协议

# 开启http配置中的restconf服务,restconf相当于一种web服务器,这个web服务器使用YANG模型让客户端与设备侧进行交互。 [HUAWEI]http [HUAWEI-http]service restconf [HUAWEI-http-service-restconf]server enable # 忽略http协议不安全的警告,因为只是本地学习测试,没必要配https [HUAWEI-http-service-restconf]server port 8080 [HUAWEI-http-service-restconf]q [HUAWEI-http]q
The device is running! ################################################################################ ################################################################################ ################################################################################ ##########################<HUAWEI> <HUAWEI>sy im Enter system view, return user view with return command. [HUAWEI]interface GE1 [HUAWEI]interface GE1/0/0 [HUAWEI-GE1/0/0]undo portswitch [HUAWEI-GE1/0/0]undo shutdown [HUAWEI-GE1/0/0]ip address 192.168.56.100 24 [HUAWEI-GE1/0/0]q [HUAWEI]ping 192.168.56.1 PING 192.168.56.1: 56 data bytes, press CTRL_C to break Reply from 192.168.56.1: bytes=56 Sequence=1 ttl=128 time=4 ms Reply from 192.168.56.1: bytes=56 Sequence=2 ttl=128 time=2 ms Reply from 192.168.56.1: bytes=56 Sequence=3 ttl=128 time=2 ms Reply from 192.168.56.1: bytes=56 Sequence=4 ttl=128 time=4 ms Reply from 192.168.56.1: bytes=56 Sequence=5 ttl=128 time=3 ms --- 192.168.56.1 ping statistics --- 5 packet(s) transmitted 5 packet(s) received 0.00% packet loss round-trip min/avg/max = 2/3/4 ms [HUAWEI]aaa [HUAWEI-aaa]local-user zhangsan password cipher Huawei@123 Info: A new user is added. [HUAWEI-aaa]local-user zhansan service-type http Error: The user does not exist. [HUAWEI-aaa]local-user zhangsan service-type http Info: The user zhangsan's password has been changed to be irreversible. Warning: The service type configured contains unsecured protocol(http). It is re commended to configure the secure service type only. [HUAWEI-aaa]q [HUAWEI] [HUAWEI]http [HUAWEI-http]service restconf [HUAWEI-http-service-restconf]server enable Warning: HTTP is not a secure protocol, and it is recommended to use HTTPS. [HUAWEI-http-service-restconf]server port 8080 [HUAWEI-http-service-restconf]q [HUAWEI-http]q

客户端-浏览器

浏览器访问http://192.168.56.100 ,弹窗输入凭证。返回400响应码的json信息,但服务器没有明确指出错误原因。

8 2 1

8 2 2

虽然响应信息是失败的,原因是浏览器发起的GET请求,从开发中工具中可以看到请求头中Accept:application/html ,与RESTconf华为文档中要求的参数Accept:applicaiton/yang-data+json不一样。
浏览器只适合验证最简单的GET请求,其它各种类型的HTTP请求就需要专门的工具了。
但有凭证弹窗和json返回信息说明客户端与服务器是连通的,服务器端RESTconf服务已开启。

客户端-Postman

PostMan是最为流行的图形化界面的HTTP客户端工具,强大、成熟、体验好。但是现在功能过多,也会增加学习成本,我们只需要其中的基础部分。

  1. 下载Postman。这里准备的是破解离线版,否则需要用国外邮箱注册账号和登录才能使用。

⏬🫱安装包Postman-win64-v2025.4.11-破解版.exe

下载安装完成后,软件第一次打开会弹浏览器要求登录,这时注意点击底部小字Skip signing and take me straight to the app.

8 2postman1

  1. 创建一个请求。放入一个新创建的Collection(即存放多个请求的文件夹)中。

    8 2postman2

    8 2postman3

  2. 查阅官方文档的请求要求
    官方文档CE12800 restconf配置指南

    8 2 restconf

  3. (重要步骤)根据华为CE12800关于RESTconf的文档,填写url地址、请求类型、请求头Auth鉴权、请求头Accept接收数据的类型。

    1. 请求类型: GET 。url地址如下:

    http://192.168.56.100:8080/restconf/data/ietf-system:system
    1. 请求头中的用户鉴权Authorization。点击子tab设置页Authorization,认证方式下拉框选择Basic基础鉴权即根据用户名密码鉴权,填写zhangsanHuawei@123 (这一步没有截图,根据描述操作)。
      因为权限认证这一块内容比较多,postman把这个功能单列出来,其实鉴权在Headers中。用户名密码最终会经过Base64转码后拼接成Authorization: Basic zhangsan:SHVhd2VpQDEyMw== 作为请求头。

    2. 填写请求头中的Accept,华为文档要求为Accept:application/yang-data+json

    # 在Postman-请求-Headers中添加一行,覆盖掉软件自带的一行,下面列出供方便复制。。p p p p Accept # 键 application/yang-data+json # 值

    (截图参考下一步)

  4. 点击Send发送请求。检查结果 200OK和json返回信息正确,返回信息为正确。如果json返回信息提示报错则为错误。

    8 2postman

可能的错误:
错误1:这个接口根据测试,如果出错将会返回400状态码,json内容提示结构错误。原因为参数设置有误,再检查一下上面的操作。
错误2:如果超时无法到达服务器,则检查物理机与服务器的是否ping通。

客户端-命令行http工具

知名的命令行http客户端工具有curl、http。下面Invoke-RestMethod是WindowsPowerShell自带的http工具,没有linux生态的工具知名,代码由postman自动生成。

$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.Add("Accept", "application/yang-data+json") $headers.Add("Authorization", "Basic emhhbmdzYW46SHVhd2VpQDEyMw==") $response = Invoke-RestMethod 'http://192.168.56.100:8080/restconf/data/ietf-system:system' -Method 'GET' -Headers $headers $response | ConvertTo-Json

整个粘贴进PowerShell终端然后回车得到结果。

8 2windows powser shell

客户端 python requests库

Python生态负责发http请求的库:

  • Python 2.x时代,内置库urllib,后来增加了一些功能urllib2库(由于历史问题和兼容性问题,分成了两个库)

  • Python 3.x时代,内置库urllib,即2.x时代的urllib+urllib2库。

  • urllib3库,第三方库,比内置库封装程度更高,代码更简洁。

  • requests库,第三方库,在urllib3的基础上进一步封装,代码非常简洁,官方口号是HTTP client for humans ,是目前最流行的Python生态的http请求库,大量应用于爬虫和Web开发。

  1. 安装:

pip install requests
  1. 基本用法

import base64 import requests from requests.auth import HTTPBasicAuth url = "http://192.168.56.100:8080/restconf/data/ietf-system:system" username = 'zhangsan' password = 'Huawei@123' # 也可以用自带的HTTPBasicAuth,将会代替下面的两行代码 authstr = base64.b64encode(f'{username}:{password}'.encode('utf-8')).decode() # emhhbmdzYW46SHVhd2VpQDEyMw== headers = { # 大部分的请求头requests库会自动补默认值。 'Accept': 'application/yang-data+json', 'Authorization': 'Basic emhhbmdzYW46SHVhd2VpQDEyMw==', # 'Content-Type': 'application/yang-data+json', # 'User-Agent': 'PostmanRuntime/7.26.8', # 'Host': '192.168.56.100:8080', # 'Accept-Encoding':'gzip, deflate, br', # 'Connection': 'Close', } # GET请求,传入url、请求头等参数 response = requests.request('GET', url, headers=headers, verify=False) # 打印响应码,响应内容 print(response.status_code, response.text)
  1. 结果 上面的python代码执行结果为响应码400,响应内容提示失败但没有更详细的解释。

    8 2 1

    8 2 2

    (这很少见,因为Postman中已经成功。开始以为代码有问题,后来经过长达5个小时的排查仍未解决,查询文章,Wireshark抓包比对(抓包看上去也是一样的),用urllib库书写都未解决。 但定位了问题,url中的ietf-system:system中冒号 : 会经过Base64转码,而CE12800的RESTConf服务不够成熟无法识别到。这里没有再花精力修改requests源代码。 课本采用的方式是以思科csr1000v作为服务器)。
    8 2wireshark

参考

28 四月 2025