我想在我的Flutter应用中使用Google Cloud自然语言,我获得了Google API包。这适用于Flutter和Google API_AUTH依赖项适用于0.2.1版本。我该如何实现它们?
我想在我的Flutter应用中使用Google Cloud自然语言,我获得了Google API包。这适用于Flutter和Google API_AUTH依赖项适用于0.2.1版本。我该如何实现它们?
这对我有用:
使用 google_sign_in
包登录,然后从中获取身份验证标头:
import 'package:google_sign_in/google_sign_in.dart'
show GoogleSignIn, GoogleSignInAccount;
import 'package:googleapis/people/v1.dart'
show ListConnectionsResponse, PeopleApi;
useGoogleApi() async {
final _googleSignIn = new GoogleSignIn(
scopes: [
'email',
'https://www.googleapis.com/auth/contacts.readonly',
],
);
await _googleSignIn.signIn();
final authHeaders = _googleSignIn.currentUser.authHeaders;
// custom IOClient from below
final httpClient = GoogleHttpClient(authHeaders);
data = await PeopleApi(httpClient).people.connections.list(
'people/me',
personFields: 'names,addresses',
pageToken: nextPageToken,
pageSize: 100,
);
}
这是一个自定义的 IOClient
实现,它会自动将身份验证标头添加到每个请求中。googleapis 调用支持传递自定义 HTTP 客户端来替代默认客户端(请参见上文)。
import 'package:http/io_client.dart';
import 'package:http/http.dart';
class GoogleHttpClient extends IOClient {
Map<String, String> _headers;
GoogleHttpClient(this._headers) : super();
@override
Future<StreamedResponse> send(BaseRequest request) =>
super.send(request..headers.addAll(_headers));
@override
Future<Response> head(Object url, {Map<String, String> headers}) =>
super.head(url, headers: headers..addAll(_headers));
}
IOClient
子类的名称。 - Günter Zöchbauer我还不能添加评论,所以我会将它发布为答案。
我一直在尝试按照置顶答案中的方法创建GoogleHttpClient,但导入时出现了“library 'package:http/http.dart'没有导出名称为'IOClient'的成员”的提示。
我在这里找到了答案:https://pub.dartlang.org/packages/http#-changelog-tab-,其中提到您应该单独导入IOClient,如下所示:import 'package:http/io_client.dart';
我认为这可能会帮助其他刚接触Flutter和其Google API实现的人。
接受的答案很可能是针对旧版SDK编写的,我无法使其正常工作。这是目前适用于我的内容。
例如,以下内容允许我们访问Google Drive中的文件,该文件是googleapis的一部分。
pubspec.yaml:
dependencies:
google_sign_in: any
googleapis: any
(这里只是举例用了any
,但你应该针对你实际的应用程序具体指定版本。)
必要的导入:
import 'package:googleapis/drive/v3.dart' as drive;
import 'package:google_sign_in/google_sign_in.dart' as signIn;
第一步,登录用户并请求访问Google Drive的权限(范围):
final googleSignIn = signIn.GoogleSignIn.standard(scopes: [drive.DriveApi.DriveScope]);
final sign.GoogleSignInAccount account = await googleSignIn.signIn();
AuthenticateClient
:class AuthenticateClient extends http.BaseClient {
final Map<String, String> headers;
final http.Client client;
AuthenticateClient(this.headers, this.client);
Future<http.StreamedResponse> send(http.BaseRequest request) {
return client.send(request..headers.addAll(headers));
}
}
正如 http 中所建议的,这里使用了具有额外身份验证标头(可组合)的 BaseClient
。
第3步,使用从步骤1和2创建的经过身份验证的HTTP客户端,访问谷歌驱动器API。
final baseClient = new Client();
final authenticateClient = AuthenticateClient(authHeader, baseClient);
final driveApi = drive.DriveApi(authenticateClient);
查看如何在Flutter应用中使用Google Drive API以获取详细信息。
googleapis_auth
包中的authenticatedClient
函数获取已验证客户端之间有什么区别吗? - Nelson Yeung更新为已接受的答案
现在,除了google_sign_in和googleapis包之外,您还可以使用extension_google_sign_in_as_googleapis_auth 包(由flutter.dev提供)来获取配置的http客户端。 因此,已接受的答案可以简化如下。 不需要实现GoogleHttpClient。
import 'package:extension_google_sign_in_as_googleapis_auth/extension_google_sign_in_as_googleapis_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:googleapis/people/v1.dart';
useGoogleApi() async {
final _googleSignIn = new GoogleSignIn(
scopes: [
'email',
PeopleServiceApi.contactsReadonlyScope,
],
);
await _googleSignIn.signIn();
// custom IOClient
final httpClient = await _googleSignIn.authenticatedClient();
data = await PeopleApi(httpClient!).people.connections.list(
'people/me',
personFields: 'names,addresses',
pageToken: nextPageToken,
pageSize: 100,
);
}
nextPageToken
在此方法的响应中提供,并且可以省略或为空,因为它是可选的。 - kanji
googleapis_auth
在 Flutter 上是否可行,因为它依赖于http
。 - Pacane