Python requests调用Ejabberd管理API返回401错误 Postman调用正常
问题根因
你返回401是两个低级错误导致的,和ejabberd权限配置无关:
- 端口和协议不匹配:你的ejabberd配置里5443端口明确开启了
tls: true,是HTTPS协议端口,你代码里用http://前缀请求这个端口,请求无法完成正常TLS握手,服务端根本收不到你传的Basic认证头。 - SSL校验配置不一致:你Postman里关了SSL证书校验,但requests请求里没加
verify=False参数,就算把URL改成HTTPS,也会因为自签名证书校验失败被拦截。 - 补充:你配置里5281端口是绑定本地回环地址的无TLS HTTP API端口,本地调试用这个端口不需要处理证书问题,更方便。
修复方法
二选一即可:
方法1:沿用5443端口
把URL改成HTTPS协议,加上verify=False参数对齐Postman的配置:
import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) import requests from requests.auth import HTTPBasicAuth url = "https://localhost:5443/api/register" data = { "user": "testuser2", "host": "localhost", "password": "password" } res = requests.post(url, json=data, auth=HTTPBasicAuth("admin", "root"), verify=False) print(res.status_code, res.text)
方法2:换用本地HTTP API端口
直接用监听127.0.0.1的5281端口,不需要HTTPS、不需要关证书警告:
import requests from requests.auth import HTTPBasicAuth url = "http://127.0.0.1:5281/api/register" data = { "user": "testuser2", "host": "localhost", "password": "password" } res = requests.post(url, json=data, auth=HTTPBasicAuth("admin", "root")) print(res.status_code, res.text)
排错提示
如果改完还是报错,先进ejabberd容器执行ejabberdctl register admin localhost 你的密码重置admin账号密码,确认凭据正确后再测试。
内容的提问来源于stack exchange,提问作者rangarajan
相关产品推荐
相关产品推荐

