来自 Flutter Web 的 HTTP Post 请求

Posted

技术标签:

【中文标题】来自 Flutter Web 的 HTTP Post 请求【英文标题】:HTTP Post request from Flutter Web 【发布时间】:2021-03-12 03:24:20 【问题描述】:

我在 Google Cloud Functions 上有一个函数,我正试图在我的 Flutter Web 应用程序中发出发布请求。我在 Python 中测试了一个发布请求,它适用于以下请求:

params = 'input_key':'input_value'
headers = "Content-Type": "application/json"
r = requests.post("https://us-central1-lucid-bond-261904.cloudfunctions.net/cloudFunction", data=jason.dumps(params), headers=headers)

但是,当我尝试使用 http 包从 Flutter Web 应用程序执行相同的请求时,我不断收到 XMLHttpRequest 错误。这是我在 Flutter Web 应用中的 http 请求

String path = "https://us-central1-lucid-bond-261904.cloudfunctions.net/cloudFunction";
Map params = 'input_key':'input_value'
var response = await http.post(path, body: json.encode(params), headers: <String, String>'Content-Type': 'application/json');

我知道它成功触发了云功能,因为我有云功能做的第一件事就是在日志中打印'hello'。我选择内容类型的方式似乎可能是一个错误。 I read this thread 这意味着内容类型可能会更改为“application/json; charset=utf-8”,但他们指定的修复不适用于 Flutter Web,因为 dart io 包不适用于 Flutter网络。 那么我该如何正确指定内容类型呢?或者有没有更好的flutter包来应对这种情况?

Flutter 中抛出的错误是:

Error: XMLHttpRequest error.
    C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 264:20      get current
packages/http/src/browser_client.dart 84:22

还有我的云函数中的错误

line 99, in cloudFunction shop_name = inputs_dict['input_key'] TypeError: 'NoneType' object is not subscriptable

编辑:刚刚尝试从 Postman 发出相同的发布请求,并且成功。尽管如此,我的颤振应用程序仍然无法正常工作。我是否需要在 Google Cloud Function 中启用 CORS 或其他功能?

【问题讨论】:

【参考方案1】:

我终于成功了。在我的云函数中,request.get_json() 返回 null。当我添加参数 force=True 时,它​​终于起作用了。通过python或postman触发函数时我不必执行force=True,但由于某种原因通过flutter触发它需要force=true。

request.get_json(force=True)

【讨论】:

伟大的,伟大的,伟大的研究!我有一个完全相同的情况(发布请求是 curl 命令可调用但从 Flutte Web 无法发送它)并用您的解决方案解决了它。对于那些想出这种情况的人来说,这不是 CORS 问题!

以上是关于来自 Flutter Web 的 HTTP Post 请求的主要内容,如果未能解决你的问题,请参考以下文章

Flutter蓝牙热敏POS打印机

将图像/文件上传到 Strapi (Flutter Web)

Flutter PUT 来自文件的 HTTP 请求

如何在 Flutter 中使用带有打印机名称的以太网 POS 打印机打印收据?

使用 Flutter 打印到 ESC/POS 时如何防止套接字超时错误

断言失败:第 22 行 pos 14: 'url != null': is not true