Flutter后端服务集成插件appengine的使用
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
更多关于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后端获取数据。
注意事项
- 安全性:确保你的GAE后端服务有适当的身份验证和授权机制,以防止未授权访问。
- 错误处理:在生产环境中,应该有更健壮的错误处理机制,而不仅仅是打印错误信息。
- CORS:如果你的GAE后端服务是基于Web的,确保它配置了正确的CORS策略以允许来自Flutter应用的请求。
这个示例提供了一个基本的框架,你可以根据需要进行扩展和修改。