gitlab-it / google-workspace-sdk
Google Workspace API SDK for Laravel
Requires
- php: ^8.0
- doctrine/annotations: ^1.13
- glamstack/google-auth-sdk: ^2.5
- illuminate/contracts: ^9.0
- spatie/laravel-package-tools: ^1.9.2
- symfony/options-resolver: ^6.0
- symfony/validator: ^6.0
Requires (Dev)
- ext-dom: *
- nunomaduro/collision: ^6.0
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: ^7.0
- pestphp/pest: ^1.21
- pestphp/pest-plugin-laravel: ^1.1
- pestphp/pest-plugin-mock: ^1.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.5
- spatie/laravel-ray: ^1.26
This package is not auto-updated.
Last update: 2024-09-26 04:42:11 UTC
README
概览
Google Workspace SDK 是由 GitLab IT Engineering 开发的开源 Composer 包,用于 GitLab Access Manager Laravel 应用程序,以便连接到 Google API 端点,以提供用户、组、组成员和其他相关功能的配置和撤销配置。
免责声明:这不是 Google 或 GitLab 产品和开发团队维护的官方包。这是我们 GitLab IT 部门使用的内部工具,我们将其开源作为我们公司价值观的一部分。
请自行承担风险,并为我们遇到的任何错误创建问题。
我们不维护社区功能请求路线图,但我们邀请您贡献,我们很乐意审查您的合并请求。
依赖项
注意:此包需要 glamstack/google-auth-sdk
包才能运行。这已在 composer.json 文件中配置为必需的包,并在安装此包时自动加载。
默认情况下,此包的所有配置都将配置在
glamstack-google-workspace.php
文件中,当安装此包时将加载该文件。有关进一步指导,请参阅安装文档
维护者
名称 | GitLab 处理 |
---|---|
Dillon Wheeler | @dillonwheeler |
Jeff Martin | @jeffersonmartin |
工作原理
此包利用 glamstack/google-auth-sdk 包创建 Google JWT Web Token 以认证 Google Workspace API。
有关 glamstack/google-auth-sdk 的更多信息,请参阅 Google Auth SDK README.md。
此包并非旨在提供 Google Workspace API 的每个端点的功能。端点将根据需要构建。如果您希望添加任何其他端点,请参阅 CONTRIBUTING。
如果所需的端点尚未创建,我们已经提供了可以执行 GET、POST、PUT 和 DELETE 请求的 REST 类,这些请求是对您在 Google Workspace API 的文档 中找到的任何端点的请求,该类将处理 API 响应、错误处理和分页。
:warning:
PATCH
请求目前不起作用,但将在将来实现。
此包建立在 Laravel HTTP Client 的简单性之上,该客户端由 Guzzle HTTP 客户端提供动力,以提供对 Google Workspace API 响应的“最后一行代码解析”,以改善开发者体验。
// Initialized Client with `connection_key` parameter
$google_workspace_api = new \Glamstack\GoogleWorkspace\ApiClient('workspace');
// Retrieves a paginated list of either deleted users or all users in a domain.
// https://developers.google.com/admin-sdk/directory/reference/rest/v1/users/list
$records = $google_workspace_api->rest()->get('https://admin.googleapis.com/admin/directory/v1/users');
// Retrieves a paginated list of either deleted users or all users in a domain
// with query parameters included.
// https://developers.google.com/admin-sdk/directory/reference/rest/v1/users/list
// https://developers.google.com/admin-sdk/directory/reference/rest/v1/users/list#OrderBy
// https://developers.google.com/admin-sdk/directory/v1/guides/search-users
$records = $google_workspace_api->rest()->get('https://admin.googleapis.com/admin/directory/v1/users',[
'maxResults' => '200',
'orderBy' => 'EMAIL',
'query' => [
'orgDepartment' => 'Test Department'
]
]);
// Get a specific user from Google Workspace
// https://developers.google.com/admin-sdk/directory/reference/rest/v1/users/get
$user_key = 'klibby@example.com';
$record = $google_workspace_api->rest()->get('https://admin.googleapis.com/admin/directory/v1/users/'.$user_key);
// Create new Google Workspace User
// https://developers.google.com/admin-sdk/directory/reference/rest/v1/users/insert
// https://developers.google.com/admin-sdk/directory/reference/rest/v1/users#User
$record = $google_workspace_api->rest()->post('https://admin.googleapis.com/admin/directory/v1/users', [
'name' => [
'familyName' => 'Libby',
'givenName' => 'Kate'
],
'password' => 'ac!dBurnM3ss3sWithTheB4$t',
'primaryEmail' => 'klibby@example.com'
]);
// Update an existing Google Workspace User
// https://developers.google.com/admin-sdk/directory/reference/rest/v1/users/update
$user_key = 'klibby@example.com';
$record = $google_workspace_api->rest()->put('https://admin.googleapis.com/admin/directory/v1/users/'.$user_key, [
'name' => [
'givenName' => 'Libby-Murphy'
]
]);
// Delete a Google Workspace User
// https://developers.google.com/admin-sdk/directory/reference/rest/v1/users/delete
$user_key = 'klibby@example.com';
$record = $google_workspace_api->rest()->delete('https://admin.googleapis.com/admin/directory/v1/users/'.$user_key);
包初始化
此软件包通过配置初始化,请参阅如何使用配置文件初始化,了解两种初始化方法的说明。
安装
要求
要求 | 版本 |
---|---|
PHP | >=8.0 |
Laravel | >=9.0 |
添加Composer包
此软件包使用日历版本控制。
我们建议始终在您的composer.json
文件中使用特定版本,并查看变更日志,以了解每个发布版本中的重大变更,在假设最新版本适合您的项目之前。
composer require glamstack/google-workspace-sdk
如果您正在为此软件包做贡献,请参阅贡献,了解如何配置具有符号链接的本地composer包的说明。
发布配置文件
php artisan vendor:publish --tag=glamstack-google-workspace
版本升级
如果您已升级到该软件包的新版本,应备份现有的配置文件,以避免您的自定义配置被覆盖。
cp config/glamstack-google-workspace.php config/glamstack-google-workspace.php.bak
php artisan vendor:publish --tag=glamstack-google-workspace
日历版本控制
GitLab IT工程团队使用日历版本控制(CalVer)的修改版,而不是语义版本控制(SemVer)。CalVer有YY(例如2021 => 21),但对我们来说,版本21.xx
感觉不太直观。由于我们团队从2021年开始,我们决定只使用年份的最后一位整数(2021 => 1.x,2022 => 2.x等)。
版本号代表以vY.M.D
格式表示的发布日期。
为什么我们不使用语义版本控制
- 我们持续向
main
/master
/production
发布,并在大多数发布中进行破坏性更改,因此对我们来说,具有语义向后兼容的版本号是不直观的。 - 我们不喜欢争论如何称呼我们的发布/里程碑,以及它是否是主要版本、次要版本还是补丁版本。我们只是编写代码,编写变更日志,然后在完成的那一天发布。变更日志的发布日期成为标签版本号(例如,
2022-02-01
是v2.2.1
)。我们可能对更大的版本号(例如,v2.2
)进行引用,但这仅用于每月里程碑计划和规范目的。所有代码标签都包括发布日期(例如,v2.2.1
)。 - 这使我们能够使用GitLab CI/CD自动化基于管道作业运行日期的版本标记过程。
- 我们在预定更改窗口期间更新我们的项目
composer.json
文件,该文件使用此软件包,将其更新为特定或新版本号,而无需担心与“保持最新版本”的差异和/或破坏性更改。我们不维护任何分叉或分支。 - 我们的软件包使用您现有的Laravel应用程序中的底层软件包,因此保持您的Laravel应用程序版本更新可以解决大多数安全问题。
初始化SDK
API客户端的初始化可以通过传递(字符串)连接密钥或传递(数组)连接配置来完成。
Google API身份验证
该软件包利用glamstack/google-auth-sdk软件包来创建Google JWT Web Token,以用于认证Google Cloud API端点。
有关 glamstack/google-auth-sdk 的更多信息,请参阅 Google Auth SDK README.md。
连接密钥
我们使用 连接密钥 的概念,它指的是 config/glamstack-google-workspace.php
中的配置数组,允许您预配置一个或多个 API 连接。
每个连接密钥都与一个 GCP 服务帐户 JSON 密钥相关联。这可以用来配置不同的认证范围连接和权限,针对您使用的 API 调用,对您的 GCP 组织或不同的 GCP 项目(s)。这允许对特定 API 调用具有最小权限,您还可以配置具有相同 GCP 项目和不同权限级别的多个连接。
示例连接密钥初始化
// Initialize the SDK using the `test` configuration from `glamstack-google-workspace.php`
$client = new Glamstack\GoogleWorkspace\ApiClient('test');
示例连接密钥配置
return [
'connections' => [
'test' => [
'api_scopes' => [
'https://www.googleapis.com/auth/admin.directory.group',
'https://www.googleapis.com/auth/admin.directory.user'
],
'json_key_file_path' => storage_path(env('GOOGLE_WORKSPACE_TEST_JSON_KEY_FILE_PATH')),
'log_channels' => ['single'],
'customer_id' => env('GOOGLE_WORKSPACE_TEST_CUSTOMER_ID'),
'domain' => env('GOOGLE_WORKSPACE_TEST_DOMAIN'),
'subject_email' => env('GOOGLE_WORKSPACE_TEST_SUBJECT_EMAIL'),
'test_group_email' => env('GOOGLE_WORKSPACE_TEST_GROUP_EMAIL')
],
]
]
动态连接配置数组
如果您不想预先配置您的连接,而是希望动态使用存储在您的数据库中的连接变量,您可以通过传递数组(见 示例连接配置数组初始化)来使用 connection_config
数组,这是 ApiClient
构造方法的第二个参数,从而获得所需的配置。
所需参数
键 | 类型 | 描述 |
---|---|---|
api_scopes | 数组 | 需要用于 API 的 API 范围数组 |
customer_id | 字符串 | Google Workspace 客户端 ID |
domain | 字符串 | API 将在其中使用的 Google Workspace 域 |
json_key_file_path | 字符串 | 选项 1 - 提供到 .json 密钥文件的路径 |
json_key | 字符串 | 选项 2 - 提供存储在您的数据库中的 JSON 密钥内容 |
在文件系统中使用 JSON 密钥文件
$client = new Glamstack\GoogleWorkspace\ApiClient(null, [
'api_scopes' => [
'https://www.googleapis.com/auth/admin.directory.group',
'https://www.googleapis.com/auth/contacts'
],
'customer_id' => config('tests.connections.test.customer_id'),
'domain' => config('tests.connections.test.domain'),
'json_key_file_path' => storage_path('keys/glamstack-google-workspace/test.json'),
'log_channels' => ['single'],
'subject_email' => config('tests.connections.test.subject_email')
]);
在数据库中使用 JSON 密钥字符串
安全警告:您绝对不应将服务帐户密钥(JSON 内容)作为变量提交到源代码中,以避免泄露您的 GCP 组织或项目的凭证。
建议在加密之前将 JSON 密钥转换为 base 64 编码的字符串,因为这是 GCP 服务帐户 API 中 privateKeyData
字段使用的格式。
// Get service account from your model (`GoogleServiceAccount` is an example)
$service_account = \App\Models\GoogleServiceAccount::where('id', '123456')->firstOrFail();
// Get JSON key string from database column that has an encrypted value
$json_key_string = decrypt(json_decode($service_account->json_key));
$client = new \Glamstack\GoogleWorkspace\ApiClient(null, [
'api_scopes' => [
'https://www.googleapis.com/auth/admin.directory.group',
'https://www.googleapis.com/auth/contacts'
],
'customer_id' => config('tests.connections.test.customer_id'),
'domain' => config('tests.connections.test.domain'),
'json_key' => $json_key_string,
'log_channels' => ['single'],
'subject_email' => config('tests.connections.test.subject_email')
]);
以下示例显示了存储在您的数据库中的 JSON 密钥的值。
// Get service account from your model (`GoogleServiceAccount` is an example)
$service_account = \App\Models\GoogleServiceAccount::where('id', '123456')->firstOrFail();
dd(decrypt(json_decode($service_account->json_key));
// {
// "type": "service_account",
// "project_id": "project_id",
// "private_key_id": "key_id",
// "private_key": "key_data",
// "client_email": "xxxxx@xxxxx.iam.gserviceaccount.com",
// "client_id": "123455667897654",
// "auth_uri": "https://#/o/oauth2/auth",
// "token_uri": "https://oauth2.googleapis.com/token",
// "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
// "client_x509_cert_url": "some stuff"
// }
自定义日志配置
默认情况下,我们使用在您的应用程序的 config/logging.php
文件中配置的 single
通道发送所有日志。这会将所有 Google Workspace 日志消息发送到 storage/logs/laravel.log
文件。
如果您希望在不相关的日志消息中看到单独的日志文件,以便更容易进行故障排除,您可以创建自定义日志通道。例如,我们建议使用 glamstack-google-workspace
的值,但是您可以选择任何您喜欢的名称。
将自定义日志通道添加到 config/logging.php
。
'channels' => [
// Add anywhere in the `channels` array
'glamstack-google-workspace' => [
'name' => 'glamstack-google-workspace',
'driver' => 'single',
'level' => 'debug',
'path' => storage_path('logs/glamstack-google-workspace.log')
]
],
更新 channels.stack.channels
数组以包括您的自定义通道的数组键(例如,glamstack-google-workspace
)。请确保将 glamstack-google-workspace
添加到现有数组值中,而不是替换现有值。
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => [
'single','slack', 'glamstack-google-workspace'
],
'ignore_exceptions' => false
]
],
REST API 请求
您可以向 Google Workspace Admin SDK 目录文档 中的任何资源端点发出 API 请求。
内联使用
// Initialize the SDK
$api_client = new \Glamstack\GoogleWorkspace\ApiClient('workspace');
$response = $api_client->rest()->get('https://admin.googleapis.com/admin/directory/v1/users');
GET 请求
使用REST类时,端点需要完整的URL。
例如,列出Google Workspace用户 API文档显示了端点
GET https://admin.googleapis.com/admin/directory/v1/users
使用SDK,您可以使用get()方法和Google Workspace用户的端点。
$google_workspace_api->rest()->get('https://admin.googleapis.com/admin/directory/v1/users');
您还可以使用变量或数据库模型来获取构建端点所需的数据。
$endpoint = 'https://admin.googleapis.com/admin/directory/v1/users';
$records = $google_workspace_api->rest()->get($endpoint);
以下是使用端点的更多示例。
// Get a list of Google Workspace Users
// https://developers.google.com/admin-sdk/directory/reference/rest/v1/users/list
$records = $google_workspace_api->rest()->get('https://admin.googleapis.com/admin/directory/v1/users');
// Get a specific Google Workspace User
// https://developers.google.com/admin-sdk/directory/reference/rest/v1/users/get
$user_key = 'klibby@example.com';
$record = $google_workspace_api->get('https://admin.googleapis.com/admin/directory/v1/users/' . $userKey);
带有查询字符串参数的GET请求
get()
方法的第二个参数是一个可选的参数数组,由SDK和Laravel HTTP客户端解析,并以查询字符串的形式自动添加?
和&
进行渲染。
// Retrieves a paginated list of either deleted users or all users in a domain
// with query parameters included.
// https://developers.google.com/admin-sdk/directory/reference/rest/v1/users/list
// https://developers.google.com/admin-sdk/directory/reference/rest/v1/users/list#OrderBy
// https://developers.google.com/admin-sdk/directory/v1/guides/search-users
$records = $google_workspace_api->rest()->get('https://admin.googleapis.com/admin/directory/v1/users',[
'maxResults' => '200',
'orderBy' => 'EMAIL'
]);
// This will parse the array and render the query string
// https://admin.googleapis.com/admin/directory/v1/users?maxResults='200'&orderBy='EMAIL'
POST请求
post()
方法几乎与get()
请求相同,都有一个参数数组,但是参数作为使用application/json
内容类型的表单数据传递,而不是作为查询字符串在URL中传递。这是行业标准,并非特定于SDK。
您可以在Laravel HTTP客户端文档中了解更多关于请求数据的信息。
// Create new Google Workspace User
// https://developers.google.com/admin-sdk/directory/reference/rest/v1/users/insert
// https://developers.google.com/admin-sdk/directory/reference/rest/v1/users#User
$record = $google_workspace_api->rest()->post('https://admin.googleapis.com/admin/directory/v1/users', [
'name' => [
'familyName' => 'Libby',
'givenName' => 'Kate'
],
'password' => 'ac!dBurnM3ss3sWithTheB4$t',
'primaryEmail' => 'klibby@example.com'
]);
PUT请求
put()
方法用于更新现有记录(类似于PATCH
请求)。您需要确保在第一个参数(URI)中提供您要更新的记录的ID。
在大多数应用程序中,这将是从您的数据库或其他位置获取的变量,而不是硬编码的。
// Update an existing Google Workspace User
// https://developers.google.com/admin-sdk/directory/reference/rest/v1/users/update
$user_key = 'klibby@example.com';
$record = $google_workspace_api->rest()->put('https://admin.googleapis.com/admin/directory/v1/users/' . $user_key, [
'name' => [
'givenName' => 'Libby-Murphy'
]
]);
DELETE请求
delete()
方法用于根据您提供的ID销毁资源的操作。
请注意,delete()
方法的返回状态码将根据供应商而有所不同(例如,200、201、202、204等)。Google Workspace API将返回204
状态码表示成功删除资源。
// Delete a Google Workspace User
// https://developers.google.com/admin-sdk/directory/reference/rest/v1/users/delete
$user_key = 'klibby@example.com';
$record = $google_workspace_api->rest()->delete('https://admin.googleapis.com/admin/directory/v1/users/' . $user_key);
类方法
上面的示例显示了适用于大多数用例的基本内联用法。如果您更喜欢使用类和构造函数,下面的示例将提供有用的示例。
<?php
use Glamstack\GoogleWorkspace\ApiClient;
class GoogleWorkspaceUserService
{
protected $google_workspace_api;
public function __construct() {
$this->google_workspace_api = new \Glamstack\GoogleWorkspace\ApiClient();
}
public function listUsers(array $query = []) : object
{
$users = $this->google_workspace_api->rest()->get('https://admin.googleapis.com/admin/directory/v1/users', $query);
return $users->object;
}
public function getUser(string $user_key, array $query = []) : object
{
$user = $this->google_workspace_api->rest()->get('https://admin.googleapis.com/admin/directory/v1/users/' . $user_key, $query);
return $user->object;
}
public function storeUser(string $user_key, array $request_data = []) : object
{
$response = $this->google_workspace_api->rest()->post('https://admin.googleapis.com/admin/directory/v1/users/' . $user_key, $request_data);
return $response->object;
}
public function updateUser(string $user_key, array $request_data = []) : object
{
$response = $this->google_workspace_api->rest()->put('https://admin.googleapis.com/admin/directory/v1/users/' . $user_key, $request_data);
return $response->object;
}
public function deleteUser(string $user_key) : bool
{
$response = $this->google_workspace_api->rest()->delete('https://admin.googleapis.com/admin/directory/v1/users/' . $user_key);
return $response->status->successful;
}
}
API响应
此SDK使用GLAM堆栈标准进行API响应格式化。
// API Request
$response = $this->google_workspace_api->rest()->get('https://admin.googleapis.com/admin/directory/v1/users/' . $user_key);
// API Response
$response->headers; // object
$response->json; // json
$response->object; // object
$response->status; // object
$response->status->code; // int (ex. 200)
$response->status->ok; // bool
$response->status->successful; // bool
$response->status->failed; // bool
$response->status->serverError; // bool
$response->status->clientError; // bool
API响应头
$response = $this->google_workspace_api->rest()->get('https://admin.googleapis.com/admin/directory/v1/users/' . $user_key);
$response->headers;
{
+"ETag": ""nMRgLWac8h8NyH7Uk5VvV4DiNp4uxXg5gNUd9YhyaJE/MgKWL9SwIVWCY7rRA988mR8yR-k""
+"Content-Type": "application/json; charset=UTF-8"
+"Vary": "Origin X-Origin Referer"
+"Date": "Thu, 20 Jan 2022 16:36:03 GMT"
+"Server": "ESF"
+"Content-Length": "1257"
+"X-XSS-Protection": "0"
+"X-Frame-Options": "SAMEORIGIN"
+"X-Content-Type-Options": "nosniff"
+"Alt-Svc": "h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43""
}
API响应特定头
$headers = (array) $response->headers;
$content_type = $headers['Content-Type'];
application/json
API响应JSON
$response = $this->google_workspace_api->rest()->get('https://admin.googleapis.com/admin/directory/v1/users/' . $user_key);
$response->json;
{
"kind":"admin#directory#user","id":"1111111111111",
"etag":"\"nMRgLWac8h8NyH7Uk5VvV4DiNp4uxXg5gNUd9YhyaJE\/MgKWL9SwIVWCY7rRA988mR8yR-k\"",
"primaryEmail":"klibby@example.com",
"name":{
"givenName":"Kate",
"familyName":"Libby",
"fullName":"Kate Libby"
},
"isAdmin":true,
"isDelegatedAdmin":false,
"lastLoginTime":"2022-01-18T15:26:16.000Z",
"creationTime":"2021-12-08T13:15:43.000Z",
"agreedToTerms":true,
"suspended":false,
"archived":false,
"changePasswordAtNextLogin":false,
"ipWhitelisted":false,
"emails":[
{
"address":"klibby@example.com",
"type":"work"
},
{
"address":"klibby@example.com",
"primary":true
},
{
"address":"klibby@example.com.test-google-a.com"
}
],
"phones":[
{
"value":"5555555555",
"type":"work"
}
],
"languages":[
{
"languageCode":"en",
"preference":"preferred"
}
],
"nonEditableAliases":[
"klibby@example.com.test-google-a.com"
],
"customerId":"C000aaaaa",
"orgUnitPath":"\/",
"isMailboxSetup":true,
"isEnrolledIn2Sv":false,
"isEnforcedIn2Sv":false,
"includeInGlobalAddressList":true
}
API响应对象
$response = $this->google_workspace_api->rest()->get('https://admin.googleapis.com/admin/directory/v1/users/' . $user_key);
$response->object;
{#1256
+"kind": "admin#directory#user"
+"id": "1111111111111"
+"etag": ""nMRgLWac8h8NyH7Uk5VvV4DiNp4uxXg5gNUd9YhyaJE/MgKWL9SwIVWCY7rRA988mR8yR-k""
+"primaryEmail": "klibby@example.com"
+"name": {#1242
+"givenName": "Kate"
+"familyName": "Libby"
+"fullName": "Kate Libby"
}
+"isAdmin": true
+"isDelegatedAdmin": false
+"lastLoginTime": "2022-01-18T15:26:16.000Z"
+"creationTime": "2021-12-08T13:15:43.000Z"
+"agreedToTerms": true
+"suspended": false
+"archived": false
+"changePasswordAtNextLogin": false
+"ipWhitelisted": false
+"emails": array:3 [
0 => {#1253
+"address": "klibby@example.com"
+"type": "work"
}
1 => {#1258
+"address": "klibby@example.com"
+"primary": true
}
2 => {#1259
+"address": "klibby@example.com.test-google-a.com"
}
]
+"phones": array:1 [
0 => {#1247
+"value": "5555555555"
+"type": "work"
}
]
+"languages": array:1 [
0 => {#1250
+"languageCode": "en"
+"preference": "preferred"
}
]
+"nonEditableAliases": array:1 [
0 => "klibby@example-test.com.test-google-a.com"
]
+"customerId": "C000aaaaa"
+"orgUnitPath": "/"
+"isMailboxSetup": true
+"isEnrolledIn2Sv": false
+"isEnforcedIn2Sv": false
+"includeInGlobalAddressList": true
}
API响应状态
请参阅Laravel HTTP客户端文档了解有关不同状态布尔值的更多信息。
$response = $this->google_workspace_api->rest()->get('https://admin.googleapis.com/admin/directory/v1/users/' . $user_key);
$response->status;
{
+"code": 200
+"ok": true
+"successful": true
+"failed": false
+"serverError": false
+"clientError": false
}
API响应状态码
$response = $this->google_workspace_api->rest()->get('https://admin.googleapis.com/admin/directory/v1/users/' . $user_key);
$response->status->code;
200
错误处理
API响应的HTTP状态码包含在每个日志条目的消息和JSON status_code
中。任何内部SDK错误也包括等效的状态码,具体取决于错误的类型。message
包括SDK友好的消息。如果抛出异常,则reference
如果API返回一个5xx
错误,则GoogleWorkspaceApiClient
的handleException
方法将返回一个响应。
请参阅下面的日志输出了解SDK如何处理错误和日志记录。
日志输出
错误消息的输出显示在
README
中,以便搜索引擎可以索引这些消息以支持开发人员调试。任何5xx错误消息将作为Symfony\Component\HttpKernel\Exception\HttpException
或配置错误返回,包括在ApiClient::setApiConnectionVariables()
方法中出现的任何错误。
问题跟踪和错误报告
请访问我们的问题跟踪器并创建一个问题或对现有问题发表评论。
贡献
请参阅CONTRIBUTING.md以了解更多关于如何贡献的信息。