Flutter后端服务集成插件appengine的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter后端服务集成插件appengine的使用

简介

package:appengine 提供了在 Google App Engine 上运行用 Dart 编写的服务器应用程序的支持,使用的是自定义运行时与灵活环境。

状态:实验性

注意:此包目前是实验性的,并发布在 labs.dart.dev pub 发布者下以征求反馈。这些包的 API 和破坏性更改率预期较高。

前提条件

安装 Dart 和 Cloud SDKs

确保已安装 Dart SDK 和 Google Cloud SDK,并且它们的 bin 文件夹已被添加到 PATH 中。

设置 gcloud

确保通过以下命令设置 gcloud 以访问云项目并安装 app 组件:

$ gcloud auth login
$ gcloud auth application-default login
$ gcloud config set project <project-name>
$ gcloud components update app

也可以通过设置环境变量 GOOGLE_APPLICATION_CREDENTIALS 指向包含导出的服务账户凭据的文件进行身份验证。

创建一个 HelloWorld 应用程序

要设置一个 HelloWorld 应用程序,我们需要以下四部分:

app/pubspec.yaml 文件描述 Dart 包:

name: hello_world
version: 0.1.0
environment:
  sdk: '>=2.0.0 <3.0.0'

dependencies:
  appengine: ^0.12.0

app/app.yaml 文件描述 AppEngine 应用:

runtime: custom
env: flex
service: default

app/Dockerfile 文件描述如何构建/打包应用:

FROM google/dart-runtime

### 注意:对于本地测试,请取消注释以下行:
#ADD key.json /project/key.json
#ENV GOOGLE_APPLICATION_CREDENTIALS /project/key.json
#ENV GOOGLE_CLOUD_PROJECT dartlang-pub

这需要 key.json 中有导出的服务账户凭据。

app/bin/server.dart 文件包含应用代码:

import 'dart:io';
import 'package:appengine/appengine.dart';

void requestHandler(HttpRequest request) {
  request.response
    ..write('Hello, world!')
    ..close();
}

void main() async {
  await runAppEngine(requestHandler);
}

在本地运行应用

有两种方式可以在本地运行应用程序——带或不带 Docker。

不使用 Docker 运行

最简单的方式是在命令行中像这样运行:

$ gcloud auth application-default login
$ export GOOGLE_CLOUD_PROJECT=<project-name>
$ dart bin/server.dart

这将在 localhost:8080 提供应用程序!

使用 Docker 运行

为了更接近生产环境,可以将应用程序在一个 Docker 容器内运行。首先需要按照官方说明安装 Docker。

要在本地运行应用程序,取消 Dockerfile 中的三行注释并将服务账户密钥放置于 key.json 中:

ADD key.json /project/key.json
ENV GOOGLE_APPLICATION_CREDENTIALS /project/key.json
ENV GOOGLE_CLOUD_PROJECT dartlang-pub

然后可以通过以下命令运行应用程序:

$ docker build .
...
Successfully built <docker-image-hash>
$ docker run -it <docker-image-hash>
...

为了找出 Docker 容器可用的 IP 地址,我们可以通过以下命令检查正在运行的容器:

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
<container-id>       ...
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container-id>
172.17.0.2

然后应用程序将在 172.17.0.2:8080 可用。

部署

在部署应用程序之前,请确保删除用于本地测试的 Dockerfile 中的环境变量!

要将应用程序部署到云端,运行以下命令(可选择传递 --no-promote 标志以避免替换生产版本):

$ gcloud app deploy --no-promote app.yaml
...
Updating service [default]...done.
Deployed service [default] to [https://<version-id>-dot-<project-id>.appspot.com]
...

更多关于Flutter后端服务集成插件appengine的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter后端服务集成插件appengine的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter应用中集成后端服务通常涉及到与多种后端架构的交互,包括Google App Engine(GAE)。虽然Flutter本身是一个前端框架,但你可以通过HTTP请求与后端服务进行通信。在Flutter中,你可以使用http包或者更高级的dio包来发送请求。

以下是一个基本的示例,展示了如何在Flutter中使用dio包与Google App Engine上的后端服务进行集成。假设你的GAE服务提供了一个简单的REST API。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加dio依赖:

dependencies:
  flutter:
    sdk: flutter
  dio: ^4.0.0  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

2. 创建dio实例

在你的Flutter项目中,创建一个dio实例来管理HTTP请求。你可以在一个单独的Dart文件中做这件事,比如network_service.dart

import 'package:dio/dio.dart';

class NetworkService {
  final Dio dio;

  NetworkService({BaseOptions? options}) : dio = Dio(options ?? BaseOptions(
    baseUrl: 'https://your-gae-app-id.appspot.com', // 替换为你的GAE应用ID
    connectTimeout: 5000,
    receiveTimeout: 3000,
  ));

  // 示例:获取数据
  Future<dynamic> getData(String endpoint) async {
    try {
      Response response = await dio.get(endpoint);
      return response.data;
    } catch (e) {
      print("Error fetching data: $e");
      return null;
    }
  }

  // 示例:发送数据
  Future<dynamic> postData(String endpoint, Map<String, dynamic> data) async {
    try {
      Response response = await dio.post(endpoint, data: data);
      return response.data;
    } catch (e) {
      print("Error posting data: $e");
      return null;
    }
  }
}

3. 使用NetworkService

现在你可以在你的Flutter组件中使用NetworkService来与GAE后端进行通信。例如,在一个简单的Flutter页面组件中:

import 'package:flutter/material.dart';
import 'network_service.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final NetworkService networkService = NetworkService();
  String? responseData;

  @override
  void initState() {
    super.initState();
    fetchData();
  }

  Future<void> fetchData() async {
    String endpoint = '/your-endpoint'; // 替换为你的实际API端点
    dynamic data = await networkService.getData(endpoint);
    setState(() {
      responseData = data?.toString();
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter GAE Integration'),
      ),
      body: Center(
        child: Text(responseData ?? 'Loading...'),
      ),
    );
  }
}

在这个示例中,我们创建了一个NetworkService类来封装HTTP请求,然后在Flutter组件中使用这个服务来从GAE后端获取数据。

注意事项

  1. 安全性:确保你的GAE后端服务有适当的身份验证和授权机制,以防止未授权访问。
  2. 错误处理:在生产环境中,应该有更健壮的错误处理机制,而不仅仅是打印错误信息。
  3. CORS:如果你的GAE后端服务是基于Web的,确保它配置了正确的CORS策略以允许来自Flutter应用的请求。

这个示例提供了一个基本的框架,你可以根据需要进行扩展和修改。

回到顶部