Dart 如何在flatter中使用googleapi?
我想在我的flatter应用程序中使用谷歌云自然语言,我得到了 这适用于颤振,相关性适用于0.2.1。 我如何实现它们?这对我来说很有效: 使用软件包Dart 如何在flatter中使用googleapi?,dart,flutter,Dart,Flutter,我想在我的flatter应用程序中使用谷歌云自然语言,我得到了 这适用于颤振,相关性适用于0.2.1。 我如何实现它们?这对我来说很有效: 使用软件包google\u-sign\u-in登录,然后从中获取身份验证标题: import 'package:google_sign_in/google_sign_in.dart' show GoogleSignIn, GoogleSignInAccount; import 'package:googleapis/people/v1.dart'
google\u-sign\u-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
实现,它会自动将auth头添加到每个请求中。googleapis调用支持传递一个自定义HTTP客户机来使用,而不是默认的(见上文)
import'包:http/io_client.dart';
导入“包:http/http.dart”;
类GoogleHttpClient扩展IOClient{
地图标题;
GoogleHttpClient(this._headers):super();
@凌驾
未来发送(BaseRequest请求)=>
super.send(request..headers.addAll(_headers));
@凌驾
未来头(对象url,{Map headers})=>
header(url,headers:headers..addAll(_headers));
}
我还不能添加评论,所以我将把它作为答案发布
我一直试图按照上面的答案创建一个GoogleHttpClient,但在导入时,它说“库”包:http/http.dart“不会导出显示名称为“IOClient”的成员。”
我在这里找到了答案,它说您应该单独导入IOClient,例如:import'包:http/io_client.dart'代码>
我认为这可能会帮助其他刚刚接触flifter及其googleapi实现的人。您需要获得2个软件包,然后才能使用googleapis软件包中列出的所有api。我会给你举个例子
import 'package:googleapis/androidpublisher/v3.dart' as androidPublisher;
import 'package:googleapis_auth/auth_io.dart' as auth;
final _credentials = new auth.ServiceAccountCredentials.fromJson(r'''
{
"private_key_id": ...,
"private_key": ...,
"client_email": ...,
"client_id": ...,
"type": "service_account"
}
''');
const _SCOPES = const [
androidPublisher.AndroidpublisherApi.AndroidpublisherScope
];
auth.clientViaServiceAccount(_credentials, _SCOPES).then((httpClient) {
var publisher = new androidPublisher.AndroidpublisherApi(httpClient);
publisher.purchases.products
.get(
packageName,
productID,
purchaseToken)
.then((pub) {
debugPrint(pub.toJson().toString());
});
});
你可以创建这样的键
在云控制台中打开IAM&Admin页面
打开IAM和管理页面
单击“选择项目”,选择项目,然后单击“打开”
在左侧导航中,单击服务帐户
查找要为其创建密钥的服务帐户的行。
在该行中,单击“更多垂直”按钮,然后单击“创建”
钥匙
选择密钥类型,然后单击“创建”
公认的答案很可能是针对旧版本的SDK编写的,我只是无法让它工作。这就是目前为止对我有效的方法
例如,以下内容允许我们访问Google Drive中的文件,Google Drive是Google的一部分
依赖关系
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;
步骤1,登录用户并请求对google drive的访问权限(范围):
final googleSignIn = signIn.GoogleSignIn.standard(scopes: [drive.DriveApi.DriveScope]);
final sign.GoogleSignInAccount account = await googleSignIn.signIn();
步骤2,构建一个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));
}
}
签出以获取详细信息。更新到
除了和包,现在您可以使用包(由flatter.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,
);
}
我真的怀疑googleapis\u auth
在flift上是否有效,因为它依赖于http
html
我的意思是,对不起,我能用这个GoogleHttpClient
用gmailAPI发送电子邮件和/或用FireBase邀请发送邀请吗?我还没有用过这些API,但如果谷歌为这些任务提供API,您应该能够使用GiigleHttpClient完成此操作。现在可以使用。将来会尝试使用您的方法。GoogleHttpClient来自哪里?我在上面的回答中发明了它;)这只是我为我的自定义子类IOClient
使用的名称。我可以问一下,这种方法与使用googleapis_auth
包中的authenticatedClient
函数来获取经过身份验证的客户端有什么区别吗?请不要在您的Flatter应用程序中使用服务帐户。服务帐户的私钥是一个秘密,它不应该在客户端(电话和/或浏览器)上。这是一个安全漏洞。
final baseClient = new Client();
final authenticateClient = AuthenticateClient(authHeader, baseClient);
final driveApi = drive.DriveApi(authenticateClient);
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,
);
}