首页 > 解决方案 > 使用颤振客户端向 node.js express api 发出 post 请求

问题描述

这是我的第一个问题,所以我为这个平台上的任何菜鸟错误提前道歉。

我正在使用 Express.js 创建一个带有 Firebase Cloud Functions 的 API。我正在尝试让 Flutter 与此 API 进行通信以注册用户。当我在 Postman 中测试我的 API 时,一切正常。我使用原始 JSON 数据发送请求,响应为我提供了一些我希望在客户端上显示的帐户信息的 JSON 对象。

我将 VSCode 用于所有这些,并使用 Web 调试器调试 Flutter 代码。

我在这里环顾四周,并尝试了两种解决方案,它们都有自己的错误。第一种方法:

var response = await http.post(uri, body: {
  'email': 'bob@email.com',
  'username': 'BoB',
  'password': 'password',
  'passwordConfirm': 'password',
});

我开始Error: XMLHttpRequest error.这样做了。Error: Bad state: Cannot set the body fields of a Request with content-type "application/json".当我尝试在 http.post 函数中使用这种方法设置标头时,我收到了:

headers: <String, String>{'content-type': 'application/json',},

在这个网站上阅读了一些之后,我遇到了第二种方法:

HttpClient httpClient = new HttpClient();
var jsonMap = {
  'email': 'bob@email.com',
  'username': 'BoB',
  'password': 'password',
  'passwordConfirm': 'password',
};
HttpClientRequest request = await httpClient.postUrl(uri);
request.headers.add('content-type', 'application/json');
request.add(utf8.encode(json.encode(jsonMap)));
HttpClientResponse response = await request.close();
httpClient.close();

希望第一种方法只是删除了一些必要的标头,但是,这种方法产生了Error: Unsupported operation: Platform._version所以我尝试更新 Flutter,但收到了同样的错误。

API 代码如下所示:

const functions = require("firebase-functions");
const signup = require("./handlers/signup");
const app = require("express")();
const cors = require("cors");
app.use(cors());

app.post("/signup", signup);

exports.api = functions.https.onRequest(app);

注册处理程序所做的第一件事是将请求记录到控制台,而我尝试过的任何事情都没有做到这一点。

我正在使用 localhost 来提供 firebase 功能并运行颤振客户端。

我还尝试在 http.post 请求中发送纯文本/文本,并让处理程序将其解析为一个对象,以与我已有的代码一起使用,但是,请求并没有发送到处理程序。我没有保存代码或以这种方式收到的错误。即使使用 Postman,我也无法使用这种方法。

谢谢您的帮助。如果您需要更多信息,请告诉我。

标签: javascriptnode.jsjsonflutterhttp

解决方案


将内容类型设置x-www-form-urlencoded为如图所示有效:

var response = await http.post(
  Uri.parse(
      'http://localhost:5000/fadenworlddev/us-central1/api/signup'),
  headers: <String, String>{
    'Content-Type':
        'application/x-www-form-urlencoded; charset=UTF-8',
  },
  body: <String, String>{
    'username': 'BoB',
    'email': 'Bob@email.com',
    'password': 'password',
    'passwordConfirm': 'password',
  },
);

推荐阅读