Dart:http.Dart包中的client.post()方法处于挂起状态,并且不是';我们不能返回未来

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(),但我尝试了很多不同的方法,但都没有效果。下面是我当前的代码,其中包含一些注释,以尝试对

我目前正在dart中实现一个简单的ONVIF客户端程序,在处理http.dart包中的未来时遇到了一些问题

在我下面的代码中,
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));