Dart:http.Dart包中的client.post()方法处于挂起状态,并且不是';我们不能返回未来
我目前正在dart中实现一个简单的ONVIF客户端程序,在处理http.dart包中的未来时遇到了一些问题 在我下面的代码中,Dart:http.Dart包中的client.post()方法处于挂起状态,并且不是';我们不能返回未来,http,dart,future,Http,Dart,Future,我目前正在dart中实现一个简单的ONVIF客户端程序,在处理http.dart包中的未来时遇到了一些问题 在我下面的代码中,client.post()方法返回一个Future(包含正文/标题/状态代码等…),在我的情况下,我需要在if/else语句之前收到它,因此我使用了wait。问题是程序只是挂起,无法通过client.post()行继续运行。 我知道我可能需要在某个地方做一个client.close(),但我尝试了很多不同的方法,但都没有效果。下面是我当前的代码,其中包含一些注释,以尝试对
client.post()
方法返回一个Future
(包含正文/标题/状态代码等…),在我的情况下,我需要在if/else语句之前收到它,因此我使用了wait
。问题是程序只是挂起,无法通过client.post()
行继续运行。
我知道我可能需要在某个地方做一个client.close()
,但我尝试了很多不同的方法,但都没有效果。下面是我当前的代码,其中包含一些注释,以尝试对其进行解释:
// The Variables:
// reqSysDateAndTime is a soap message we are sending to the device.
// onvifDev is just a place where the device details are stored.
// probeMatch is a class that stores important info from the ws-discovery stage.
Future<String> checkXaddrsAndGetTime(Device onvifDev, ProbeMatch probeMatch) async {
// Set up the client and uri.
Uri uri = Uri.parse(probeMatch.xaddrs);
http.Client client = http.Client();
// Send the POST request, with full SOAP envelope as the request body
print('[Setup]: Listening for Date/Time response...');
Response response = await client.post(uri, body: reqSysDateAndTime);
print("${response.body}");
// Determine if the address is usable or not.
if (response != null) {
// Set this address as 'working'
onvifDev.xAddrs = probeMatch.xaddrs;
return response.body;
}
else {
return null; // The address does not work
}
}
…相反,它将打印出我期望的响应
我知道这可能是我错过的一个小补丁,但任何帮助都将不胜感激
干杯。简单地回答我自己的问题,结果是我犯了一个愚蠢的错误,因为我使用的地址是本地链接-因此它挂在
client.post()
。InternetAddress类中有一个很好的方法,在其他一些有用的方法中,它检查地址是否为本地链接。简单回答我自己的问题,原来我使用的地址是本地链接,这是一个愚蠢的错误,因此它挂在client.post()
。InternetAddress类中有一个很好的方法,在其他一些有用的方法中,它检查地址是否为本地链接。您找到了解决方案吗?我确实找到了,不过这更像是我的一个愚蠢错误。基本上,在前面的程序中,我会执行WS-Discovery以获取您在该方法中看到的设备的XADDR。这个发现探测返回了设备的两个XADDR,所以我假设我可以用这个方法迭代这两个XADDR,然后选择第一个有效的XADDR。结果证明我错了。第一个xAddress是一个链接本地地址(从169开始),当发送到该地址时没有响应,因此它挂在该行上。我通过使用curl在终端中执行一些简单的post请求发现了这一点。dart InternetAddress类中有一个很好的方法,可以让您检查它。您找到解决方案了吗?我确实找到了,不过这更像是我的一个愚蠢错误。基本上,在前面的程序中,我会执行WS-Discovery以获取您在该方法中看到的设备的XADDR。这个发现探测返回了设备的两个XADDR,所以我假设我可以用这个方法迭代这两个XADDR,然后选择第一个有效的XADDR。结果证明我错了。第一个xAddress是一个链接本地地址(从169开始),当发送到该地址时没有响应,因此它挂在该行上。我通过使用curl在终端中执行一些简单的post请求发现了这一点。dart InternetAddress类中有一个很好的方法,允许您检查它。
client.post(uri, body: reqSysDateAndTime).then((onValue) => print(onValue.body));