Dart/Flutter:Http 请求引发 XMLHttpRequest 错误

Ph.*_*lpp 28 xml rss http dart flutter

我正在尝试制作一个带有 flutter 的 RSS 阅读器,但该程序引发了XMLHttpRequest error.

\n

在我的测试中,我使用网络(Chrome)作为我的目标平台。

\n

感谢您的帮助。

\n
  Future<RssFeed> fetchFeed() async {\ntry {\n  final response = await http.get(Uri.parse(url), headers: {"Access-Control-Allow-Origin": "*"});\n  return RssFeed.parse(response.body);\n} catch (e) {\n  print(e);\n  return RssFeed(title: "Test");\n  }}\n\n  var feed = await fetchFeed();\n
Run Code Online (Sandbox Code Playgroud)\n

完整错误日志:

\n
Error: XMLHttpRequest error.\nC:/b/s/w/ir/cache/builder/src/out/host_debug/dart-\n\nsdk/lib/_internal/js_dev_runtime/patch/core_patch.dart 910:28                get current\npackages/http/src/browser_client.dart 69:22                                                                                    <fn>\nC:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/zone.dart 1685:54                                              runUnary\nC:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 159:18                                        handleValue\nC:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 766:44                                        handleValueCallback\nC:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 795:13                                        _propagateToListeners\nC:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/future_impl.dart 592:7                                         [_complete]\nC:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/stream_pipe.dart 61:11                                         _cancelAndValue\nC:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/async/stream.dart 1288:7                                             <fn>\nC:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 334:14  _checkAndCall\nC:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 339:39  dcall\nC:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/html/dart2js/html_dart2js.dart 37301:58                              <fn>\n\n\n    at Object.createErrorWithStack (http://localhost:49656/dart_sdk.js:5080:12)\n    at Function._throw (http://localhost:49656/dart_sdk.js:20337:18)\n    at Function.throwWithStackTrace (http://localhost:49656/dart_sdk.js:20334:18)\n    at async._AsyncCallbackEntry.new.callback (http://localhost:49656/dart_sdk.js:40851:18)\n    at Object._microtaskLoop (http://localhost:49656/dart_sdk.js:40708:13)\n    at _startMicrotaskLoop (http://localhost:49656/dart_sdk.js:40714:13)\n    at http://localhost:49656/dart_sdk.js:36191:9\n
Run Code Online (Sandbox Code Playgroud)\n

颤动医生输出:

\n
[\xe2\x88\x9a] Flutter (Channel stable, 2.10.1, on Microsoft Windows [Version 10.0.19042.1526], locale de-DE)\n[\xe2\x88\x9a] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1)\n[\xe2\x88\x9a] Chrome - develop for the web\n[\xe2\x88\x9a] Visual Studio - develop for Windows (Visual Studio Community 2022 17.0.5)\n[\xe2\x88\x9a] Android Studio (version 2021.1)\n[\xe2\x88\x9a] VS Code (version 1.63.2)\n[\xe2\x88\x9a] Connected device (4 available)\n[\xe2\x88\x9a] HTTP Host Availability\n
Run Code Online (Sandbox Code Playgroud)\n

依赖项:

\n
dependencies:\n  flutter:\n    sdk: flutter\n\n\n\n  # The following adds the Cupertino Icons font to your application.\n  # Use with the CupertinoIcons class for iOS style icons.\n  cupertino_icons: ^1.0.2\n  url_launcher: ^6.0.20\n  http: ^0.13.0\n  flutter_staggered_grid_view: ^0.6.1\n  calendar_view: ^0.0.3\n  webfeed: ^0.7.0\n  string_similarity: ^2.0.0\n  sortedmap: ^0.5.1\n
Run Code Online (Sandbox Code Playgroud)\n

And*_*nto 12

此错误的原因是当您使用 Uri.parse(url) 时,您应该使用 Uri.https('urlPath', 'callPath') (例如:Uri.https('api.to.consults', 'login') ),我花了几天时间寻找解决方案,但没有任何效果,直到我改变了这一点。我希望它能帮助某人。例子

...
var uri = Uri.https('my.apiurl.com', 'my/api/endopoint/path');
var response = await client.get(uri);
...
Run Code Online (Sandbox Code Playgroud)

您可能会注意到“my.apiurl.com”不包含“http://”或“https://”,如果它携带任一协议,您应该根据需要调用 Uri.http 或 Uri.https。

另请注意,“my/api/endopoint/path”是要查询的端点的路径,例如“api/users/login”或“api/categories”。