我正在尝试在IP摄像机上传递摘要身份验证 我在Flutter上做,但实际上没关系。 我从状态码为401的摄像头收到HTTP响应 和标题:
{content-type: text/html, pragma: no-cache, cache-control: no-cache, www-authenticate: Digest
realm="goAhead", domain=":13237",qop="auth", nonce="a98326cc6022c2a2b7cc7e57a5956f77",
opaque="5ccc069c403ebaf9f0171e9517f40e41",algorithm="MD5", stale="FALSE", date: Thu Dec 26 16:31:43
2019, server: GoAhead-Webs}
在此source中,我找到了所需的Response构造函数视图,如下所示:
var mResponse = "Digest username=\"$username\", realm=\"$realm\", nonce=\"$nonce\", uri=\"$uri\",
response=\"$_response\", cnonce=\"$cnonce\", nc=$nc, qop=\"$qop\"";
我创建了这个
Digest username="admin", realm="goAhead", nonce="a98326cc6022c2a2b7cc7e57a5956f77",
uri="/onvif/device_service", response="5313fe5265efcd3da37cec322d92ebd7", cnonce="1234567890",
nc=00000001, qop="auth"
并将http请求发送到相机:
Future<http.Response> new_response = http.post(snapshotUrl, headers: {"Content-Type":"text/xml; charset=utf-8", "Authorization": mResponse }, body: mGetSnapshotUriAuth);
new_response.then((resp){
print(resp.statusCode);
});
并收到此错误:
[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: Invalid header field name
当我删除标题的“授权”字段时,摄像机将显示401代码。 我正在尝试从在Onvif协议上工作的IP摄像机获取快照。我不确定Uri参数。 当我尝试通过台式机screenshot上的http客户端发送此http请求时出现相同的错误
问题2 : 当我尝试将uri参数更改为其他内容时,例如:
String uri = http://www.onvif.org/ver10/media/wsdl/GetSnapshotUri";
我的相机停止回复我。当我开始使用Http嗅探器或更改Digest响应的字段名称时,可以看到相同的行为。有时,重置相机会有所帮助(甚至是硬重置),并且相机会再次开始工作(返回401错误),有时它会自行开始工作。但顺便说一下,相机可以通过其他Camera Viewer Apps继续工作。 My screenshot from http sniffer
PS经过大量测试解决了这个问题后,我认为我的参数值是正确的,因为如果更改用户名,密码等内容(cnonce除外。当我更改nonce结果相同时),则会收到另一个错误:401。
答案 0 :(得分:0)
用手编写SOAP请求是 BAD PRACTICE 。我对dart一无所知,但我邀请您寻找gsoap之类的工具,该工具可以从here的WSDL文件中生成函数。 不要用手写下请求,解析响应时会陷入混乱。