Flutter web - 调用 http.get 抛出异常

Posted

技术标签:

【中文标题】Flutter web - 调用 http.get 抛出异常【英文标题】:Flutter web - call http.get throws exception 【发布时间】:2020-03-10 04:06:28 【问题描述】:

这在 android/桌面上运行良好:

Future<List<City>> fetchCities() async 


  final response =
  await http.get(globals.url + '/city',
      headers: HttpHeaders.acceptHeader: globals.apiVersion);

  if (response.statusCode == 200) 
    // If the call to the server was successful, parse the JSON
    return compute(parseCities, response.body);
   else 
    // If that call was not successful, throw an error.
    print('Failed to load cities');
    throw TextException(Strings.msg_session_expired);
  

但是当作为 Web 应用程序启动时,我遇到了一个异常:

errors.dart:145 Uncaught (in promise) Error: Unsupported operation: Platform._version
    at Object.throw_ [as throw] (errors.dart:194)
    at Function._version (io_patch.dart:284)
    at Function.get version [as version] (platform_impl.dart:121)
    at get _version (platform.dart:74)
    at Function.desc.get [as _version] (utils.dart:75)
    at Function.get version [as version] (platform.dart:231)
    at Object._getHttpVersion (http_impl.dart:3234)
    at new _http._HttpClient.new (http_impl.dart:2071)
    at Function.new (http.dart:1473)
    at new io_client.IOClient.new (io_client.dart:23)
    at Function.new (client.dart:30)
    at _withClient (http.dart:165)
    at _withClient.next (<anonymous>)
    at runBody (async_patch.dart:84)
    at Object._async [as async] (async_patch.dart:123)
    at Object._withClient (http.dart:164)
    at Object.get (http.dart:47)
    at fetchCities (mcity.dart:113)
    at fetchCities.next (<anonymous>)
    at runBody (async_patch.dart:84)
    at Object._async [as async] (async_patch.dart:123)

是否有任何方法可以使 http.get 请求在 flutter_web 上运行?

【问题讨论】:

【参考方案1】:

HttpHeaders.acceptHeader 的使用可能是问题所在。它是 dart:io 库的一部分,未为 Flutter Web 启用。您应该尝试以不同的方式设置标题。例如基于这个常数值here,下面的东西应该可以工作。

final response =
  await http.get(globals.url + '/city',
      headers: "accept": globals.apiVersion);

在另一个post我使用了http包,表明这个包可以用于flutter web。

【讨论】:

这没有帮助。正如我所看到的,http 在内部使用 dart.io,它仍然会引发错误。看来,我不能使用任何自定义标头,否则会抛出错误。 我从我的通话中删除了所有标题,但我仍然收到同样的错误。我不明白你是怎么让它工作的。 您能否包含您的导入语句。你是对的 http 包使用 dart:io 但它是通过有条件地导入它们来实现的。这意味着它将在 dart:html 和 dart:io` 之间交替,这取决于它运行的上下文。在您的异常快照中,我看到 at new io_client.IOClient.new (io_client.dart:23) 来自 http 包。它以某种方式选择io_client 而不是browser_client。你能简单地写下你如何部署或运行​​你的代码吗.. 我什至从导入中删除了 dart.io。我仍然遇到错误。来自主频道的颤振版本。你测试过哪个版本? 我想这是最新的,因为我刚升级到白天。 :) Doctor 摘要(要查看所有详细信息,请运行 flutter doctor -v):[√] Flutter(Channel master,v1.12.3-pre.49,在 Microsoft Windows [版本 10.0.17134.1069],语言环境 de-DE)[√ ] Android 工具链 - 为 Android 设备开发(Android SDK 版本 28.0.3) [√] Chrome - 为网络开发 [√] Android Studio(版本 3.5) [√] VS Code(版本 1.40.1) [√] 已连接设备(2 个可用) • 未发现问题!

以上是关于Flutter web - 调用 http.get 抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - http.get 在 macos 构建目标上失败:连接失败

在 Flutter 中每 1 分钟发出一次定时 http.get 请求的最简单方法是啥?

flutter http get请求

如何通过js跨域调用ASP.NET Web API (请问如何实现在javascript中通过http get的方式跨域调用ASP.NET Web API?)

Flutter - 无法通过 http.get 从 api 获取数据

Flutter:在 http.get 请求之后构建 ListView