我应该使用什么地址来进行“ localhost”在我的Flutter应用程序中?

发布于 2025-01-22 05:04:31 字数 2219 浏览 4 评论 0原文

我正在使用flutter应用程序中的以下代码,并且它没有问题,但是今天,在我升级了颤动后,它不起作用,并且给了我XMLHTTTPREQUEST错误

  Future<void> _authenticate(
      String email, String password, String urlSegment) async {
    final host = UniversalPlatform.isAndroid ? '10.0.2.2' : '127.0.0.1';
    final url = Uri.parse('http://$host:8000/api/$urlSegment');

    try {
      final http.Response response = await http.post(
        url,
        headers: {"Content-Type": "application/json"},
        body: json.encode(
          {
            'email': email,
            'password': password,
          },
        ),
      );

新的Flutter版本是否有任何更改?我是否应该更改指定我的主机地址的代码行?

    final host = UniversalPlatform.isAndroid ? '10.0.2.2' : '127.0.0.1';

编辑:我尝试将cors添加到我的nodejs后端服务器,这是我的app.ts文件如下:

import express, { Request, Response, NextFunction } from "express";
import cors from "cors";
import dotenv from "dotenv";
dotenv.config();
import config from "config";
import responseTime from "response-time";
import connect from "./utils/connect";
import logger from "./utils/logger";
import routes from "./routes";
import deserializeUser from "./middleware/deserializeUser";
import { restResponseTimeHistogram, startMetricsServer } from "./utils/metrics";
import swaggerDocs from "./utils/swagger";

const allowedOrigins = ['http://localhost:8000' , 'https://10.0.2.2:8000', 'http://127.0.0.1:8000'];

const options: cors.CorsOptions = {
  origin: allowedOrigins
};

const port = config.get<number>("port");

const app = express();

app.use(express.json());


app.use(cors(options));

app.use(deserializeUser);

app.use(
  responseTime((req: Request, res: Response, time: number) => {
    if (req?.route?.path) {
      restResponseTimeHistogram.observe(
        {
          method: req.method,
          route: req.route.path,
          status_code: res.statusCode,
        },
        time * 1000
      );
    }
  })
);

app.listen(port, async () => {
  logger.info(`App is running at http://localhost:${port}`);

  await connect();

  routes(app);

  startMetricsServer();

  swaggerDocs(app, port);
});

但是仍然不起作用,我会遇到相同的错误!

I was using the following code within my Flutter app and it was working with no problems, but today after I upgraded my Flutter, it doesn't work and gives me XMLHttpRequest error.

  Future<void> _authenticate(
      String email, String password, String urlSegment) async {
    final host = UniversalPlatform.isAndroid ? '10.0.2.2' : '127.0.0.1';
    final url = Uri.parse('http://$host:8000/api/$urlSegment');

    try {
      final http.Response response = await http.post(
        url,
        headers: {"Content-Type": "application/json"},
        body: json.encode(
          {
            'email': email,
            'password': password,
          },
        ),
      );

Does anything have been changed in new Flutter version? Should I change the following line of code that specifies my host address?

    final host = UniversalPlatform.isAndroid ? '10.0.2.2' : '127.0.0.1';

EDIT: I tried to add cors to my NodeJS backend server and this is my app.ts file as following:

import express, { Request, Response, NextFunction } from "express";
import cors from "cors";
import dotenv from "dotenv";
dotenv.config();
import config from "config";
import responseTime from "response-time";
import connect from "./utils/connect";
import logger from "./utils/logger";
import routes from "./routes";
import deserializeUser from "./middleware/deserializeUser";
import { restResponseTimeHistogram, startMetricsServer } from "./utils/metrics";
import swaggerDocs from "./utils/swagger";

const allowedOrigins = ['http://localhost:8000' , 'https://10.0.2.2:8000', 'http://127.0.0.1:8000'];

const options: cors.CorsOptions = {
  origin: allowedOrigins
};

const port = config.get<number>("port");

const app = express();

app.use(express.json());


app.use(cors(options));

app.use(deserializeUser);

app.use(
  responseTime((req: Request, res: Response, time: number) => {
    if (req?.route?.path) {
      restResponseTimeHistogram.observe(
        {
          method: req.method,
          route: req.route.path,
          status_code: res.statusCode,
        },
        time * 1000
      );
    }
  })
);

app.listen(port, async () => {
  logger.info(`App is running at http://localhost:${port}`);

  await connect();

  routes(app);

  startMetricsServer();

  swaggerDocs(app, port);
});

But still doesn't work and I get the same error!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

身边 2025-01-29 05:04:31

您已经将允许的rigins设置为:8000,但这是 Backend 服务器的地址。取而代之的是,您需要将其设置为Flutter Debug Server的地址(如果与后端服务器不完全相同),则将其设置为托管生产应用程序的Web服务器。 (您可以删除以8000结尾的所有地址。)

问题是调试服务器为每次运行选择一个随机端口。您可以告诉它使用固定端口,然后将其变成您需要包含在允许起源中的端口。

添加-web-hostname = localhost -web-port = 9999作为命令行参数,到达您运行main.dart的位置,然后添加localhost:99999作为允许的来源。

(作为jail的抢断,也可以尝试*作为允许的来源。)

最后,您可能应该明确将允许的方法设置为服务器API期望的方法列表;可能的选项,获取和发布。

You've set the allowed origins to :8000, but that's the backend server's address. Instead, you need to set it to the Flutter debug server's address (and eventually to the web server where you host the production app, if that's not exactly the same as the backend server). (You can remove all the addresses ending in 8000.)

The problem is that the debug server picks a random port for each run. You can tell it to use a fixed port and then that becomes the port you need to include in your allowed origins.

Add --web-hostname=localhost --web-port=9999 as command line parameters to where you run your main.dart, then add localhost:9999 as an allowed origin.

(As a get-out-of-jail, also try * as an allowed origin.)

Finally, you should probably explicitly set the CORS allowed methods to the list of methods your server's API expects; probably OPTIONS, GET and POST.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文