无法使用 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 = false
和http
,那就太好了
在下面查看我的答案
【参考方案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对比