无法使用 HttpClient 从 Flutter Web 发布

Posted

技术标签:

【中文标题】无法使用 HttpClient 从 Flutter Web 发布【英文标题】:Can't POST from Flutter Web with HttpClient 【发布时间】:2021-05-26 01:52:05 【问题描述】:

任何帮助将不胜感激!或者一个更好的图书馆想法,用followRedirects = false 从 Flutter Web 上做一个 POST。谢谢!!

   HttpClientRequest request = await HttpClient().postUrl(Uri.https("xyz.com:1000", "login"))..followRedirects = false;
    var response = await request.close();

给予(即使我删除了..followRedirects = false

Error: Unsupported operation: Platform._version
    at Object.throw_ [as throw] (http://localhost:56880/dart_sdk.js:5331:11)
    at Function._version (http://localhost:56880/dart_sdk.js:56165:17)
    at Function.get version [as version] (http://localhost:56880/dart_sdk.js:56239:27)
    at get _version (http://localhost:56880/dart_sdk.js:56109:27)
    at Function.desc.get [as _version] (http://localhost:56880/dart_sdk.js:5836:17)
    at Function.get version [as version] (http://localhost:56880/dart_sdk.js:56083:26)
    at Object._getHttpVersion (http://localhost:56880/dart_sdk.js:197292:31)
    at new _http._HttpClient.new (http://localhost:56880/dart_sdk.js:192274:28)
    at Function.new (http://localhost:56880/dart_sdk.js:186732:16)
    at login._LoginFormState.new.doLogin (http://localhost:56880/packages/webcargo_mobile/user/login.dart.lib.js:783:50)
    at doLogin.next (<anonymous>)
    at runBody (http://localhost:56880/dart_sdk.js:39049:34)
    at Object._async [as async] (http://localhost:56880/dart_sdk.js:39080:7)
    at login._LoginFormState.new.doLogin (http://localhost:56880/packages/webcargo_mobile/user/login.dart.lib.js:781:20)
    at http://localhost:56880/packages/webcargo_mobile/user/login.dart.lib.js:775:20
    at ink_well._InkResponseState.new.[_handleTap] (http://localhost:56880/packages/flutter/src/material/icon_button.dart.lib.js:50511:42)
    at tap.TapGestureRecognizer.new.invokeCallback (http://localhost:56880/packages/flutter/src/gestures/recognizer.dart.lib.js:203:18)
    at tap.TapGestureRecognizer.new.handleTapUp (http://localhost:56880/packages/flutter/src/gestures/tap.dart.lib.js:417:40)
    at tap.TapGestureRecognizer.new.[_checkUp] (http://localhost:56880/packages/flutter/src/gestures/tap.dart.lib.js:223:12)
    at tap.TapGestureRecognizer.new.handlePrimaryPointer (http://localhost:56880/packages/flutter/src/gestures/tap.dart.lib.js:169:23)
    at tap.TapGestureRecognizer.new.handleEvent (http://localhost:56880/packages/flutter/src/gestures/recognizer.dart.lib.js:458:16)
    at pointer_router.PointerRouter.new.[_dispatch] (http://localhost:56880/packages/flutter/src/gestures/pointer_router.dart.lib.js:103:9)
    at http://localhost:56880/packages/flutter/src/gestures/pointer_router.dart.lib.js:138:26
    at LinkedMap.new.forEach (http://localhost:56880/dart_sdk.js:26136:11)
    at pointer_router.PointerRouter.new.[_dispatchEventToRoutes] (http://localhost:56880/packages/flutter/src/gestures/pointer_router.dart.lib.js:135:29)
    at pointer_router.PointerRouter.new.route (http://localhost:56880/packages/flutter/src/gestures/pointer_router.dart.lib.js:127:37)
    at binding$5.WidgetsFlutterBinding.new.handleEvent (http://localhost:56880/packages/flutter/src/gestures/binding.dart.lib.js:331:26)
    at binding$5.WidgetsFlutterBinding.new.dispatchEvent (http://localhost:56880/packages/flutter/src/gestures/binding.dart.lib.js:314:24)
    at binding$5.WidgetsFlutterBinding.new.dispatchEvent (http://localhost:56880/packages/flutter/src/rendering/layer.dart.lib.js:6087:13)
    at binding$5.WidgetsFlutterBinding.new.[_handlePointerEventImmediately] (http://localhost:56880/packages/flutter/src/gestures/binding.dart.lib.js:285:14)
    at binding$5.WidgetsFlutterBinding.new.handlePointerEvent (http://localhost:56880/packages/flutter/src/gestures/binding.dart.lib.js:258:43)
    at binding$5.WidgetsFlutterBinding.new.[_flushPointerEventQueue] (http://localhost:56880/packages/flutter/src/gestures/binding.dart.lib.js:247:14)
    at binding$5.WidgetsFlutterBinding.new.[_handlePointerDataPacket] (http://localhost:56880/packages/flutter/src/gestures/binding.dart.lib.js:237:65)
    at Object.invoke1 (http://localhost:56880/dart_sdk.js:183501:7)
    at _engine.EnginePlatformDispatcher.__.invokeOnPointerDataPacket (http://localhost:56880/dart_sdk.js:163995:15)
    at _engine.PointerBinding.__.[_onPointerData] (http://localhost:56880/dart_sdk.js:164629:49)
    at http://localhost:56880/dart_sdk.js:165081:26
    at http://localhost:56880/dart_sdk.js:165034:16
    at http://localhost:56880/dart_sdk.js:164733:11

【问题讨论】:

dart:io 在 Flutter Web 中不受支持。你应该得到一个 linter 警告/错误。使用http 包。 谢谢@christopher-moore!这就解释了!虽然没有看到任何警告。根据其他帖子,如果您能告诉我如何使用followRedirects = falsehttp,那就太好了 在下面查看我的答案 【参考方案1】:

如果您想向您拥有的服务器或其他一些 REST API 发出发布请求(或任何请求),那么我建议您使用 Flutter 的 HTTP 库。

这是我在项目中提出发布请求的方式。

import 'package:http/http.dart' as http;

  Future check(String apiexten, Map <String,dynamic> json) async
    final http.Response response = await http.post('http://192.168.1.4:3000/$apiexten',
      headers: <String,String>
        'Content-Type': 'application/json; charset=UTF-8',
      ,
      body: jsonEncode(json));
    return jsonDecode(response.body);
  

只需将我正在使用的网址替换为您正在使用的网址,您应该会很好。

【讨论】:

【参考方案2】:

dart:io 在 Flutter web 中不受支持。你应该得到一个 linter 警告/错误。使用http 包。

要不使用 http 包跟踪重定向,请将 followRedirects 属性设置为 false。

//Construct the request
final req = Request('POST', Uri.https("xyz.com:1000", "login"));

//Set the body
req.body = ...;

//Disable redirects
req.followRedirects = false;

//Send request
final resp = await req.send();

//Handle response
final respStr = await resp.bytesToString();

【讨论】:

非常感谢!奇怪的是发送请求正常,但我仍然看到来自第二个重定向 http 请求的响应 - 我没有看到 302 响应 @Mark 您可以使用resp.isRedirect 在响应中检查它是否是重定向。如果这是false,那么您可能不应该期待任何重定向和 302 响应。检查服务器以确认您对 302 的期望。 谢谢。所以@Christopher 我可以在 Chrome 开发者工具网络中看到我收到一个 302,然后是一个带有 200 的重定向调用。然而,dart HTTP 响应显示代码 200 和 isRedirect=false!有什么想法吗?

以上是关于无法使用 HttpClient 从 Flutter Web 发布的主要内容,如果未能解决你的问题,请参考以下文章

从 HttpClient SendAsync 请求获取响应时出现无法解释的超时和延迟

在 .net 4.5 中尝试使用 HttpClient 使 cookie 无法响应

Angular:无法使用 HttpClient 获取本地 json

Flutter Dio源码分析--HttpClientHttpDio对比

使用 Jetty 9 从 HttpClient 获取响应时出错

无法使用 HttpClient 对 ASP.NET Web Api 服务进行身份验证