如何用Python Requests发送带无命名参数的Anel电源插座HTTP请求
解决Anel电源插座管理器的Requests请求问题
Anel设备的URL参数格式较为特殊,要求在URL中附带无命名的userpassword参数,常规params字典传参方式无法满足(Requests会自动为参数添加键名)。以下两种实现方式无需手动拼接完整URL,同时适配设备的三种参数格式:
方法一:利用PreparedRequest构造请求
通过Requests的PreparedRequest可灵活控制URL查询参数部分,直接构造符合要求的查询字符串:
import requests base_url = "http://192.168.0.244" # 定义基础操作参数和无命名密码参数 params_list = ["Stat", "userpassword"] # 拼接查询字符串 query_string = "&".join(params_list) # 构造并发送请求 req = requests.Request('GET', f"{base_url}?{query_string}") prepped = req.prepare() with requests.Session() as sess: response = sess.send(prepped)
方法二:封装自定义请求函数
如果需要复用这种参数格式,可以封装函数统一处理命名/无命名参数:
import requests from urllib.parse import urlencode def send_anel_request(base_url, named_params=None, unnamed_params=None): query_parts = [] # 处理带键名的参数(如param=value) if named_params: query_parts.append(urlencode(named_params)) # 处理无命名参数(如userpassword) if unnamed_params: query_parts.extend(unnamed_params) # 拼接生成完整URL query_string = "&".join(query_parts) full_url = f"{base_url}?{query_string}" if query_string else base_url return requests.get(full_url) # 示例1:获取设备状态 response = send_anel_request( "http://192.168.0.244", unnamed_params=["Stat", "userpassword"] ) # 示例2:设置参数+密码 response = send_anel_request( "http://192.168.0.244", named_params={"Set": "1"}, unnamed_params=["userpassword"] ) # 示例3:逗号分隔格式(把密码融入命名参数值) response = send_anel_request( "http://192.168.0.244", named_params={"Set": "1,userpassword"} )
以上方式既规避了硬编码URL的弊端,又完美适配设备支持的三种参数格式。
内容的提问来源于stack exchange,提问作者Wör Du Schnaffzig
相关产品推荐
相关产品推荐

