jaeger/google-apiclient

Google API 客户端库

v2.0.4 2016-09-04 15:58 UTC

README

Build Status

PHP Google API 客户端库

描述

Google API 客户端库使您能够在服务器上使用 Google API,例如 Google+、Drive 或 YouTube。

测试版

此库处于测试版。我们对库的稳定性和功能感到满意,希望您能够在它上面构建实际的生产应用程序。我们将努力支持库的公共和受保护表面,并在未来保持向后兼容性。在测试版期间,我们保留做出不兼容更改的权利。

要求

开发者文档

http://developers.google.com/api-client-library/php

安装

您可以使用 Composer 或直接 下载发行版

Composer

首选方法是使用 Composer。如果您尚未安装 composer,请遵循 安装说明

安装 composer 后,在项目根目录中执行以下命令以安装此库

composer require google/apiclient:^2.0

最后,务必包含自动加载器

require_once '/path/to/your-project/vendor/autoload.php';

下载发行版

如果您讨厌使用 composer,可以下载整个包。在 发行版 页面上列出了所有稳定版本。下载任何名为 google-api-php-client-[RELEASE_NAME].zip 的文件,以获取包含此库及其依赖项的包。

解压您下载的 zip 文件,并在您的项目中包含自动加载器

require_once '/path/to/google-api-php-client/vendor/autoload.php';

有关安装和设置的其他说明,请参阅 文档

示例

请参阅 examples/ 目录中的关键客户端功能示例。您可以通过运行 php 内置网络服务器在浏览器中查看它们。

$ php -S localhost:8000 -t examples/

然后浏览到您指定的主机和端口(在上面的示例中,http://localhost:8000)。

基本示例

// include your composer dependencies
require_once 'vendor/autoload.php';

$client = new Google_Client();
$client->setApplicationName("Client_Library_Examples");
$client->setDeveloperKey("YOUR_APP_KEY");

$service = new Google_Service_Books($client);
$optParams = array('filter' => 'free-ebooks');
$results = $service->volumes->listVolumes('Henry David Thoreau', $optParams);

foreach ($results as $item) {
  echo $item['volumeInfo']['title'], "<br /> \n";
}

使用 OAuth 进行身份验证

此示例的示例请参阅 examples/simple-file-upload.php

  1. 按照说明 创建 Web 应用程序凭证

  2. 下载 JSON 凭证

  3. 使用 Google_Client::setAuthConfig 设置这些凭证的路径

    $client = new Google_Client();
    $client->setAuthConfig('/path/to/client_credentials.json');
  4. 设置您要调用的 API 所需的权限范围

    $client->addScope(Google_Service_Drive::DRIVE);
  5. 设置您应用程序的重定向 URI

    // Your redirect URI can be any registered URI, but in this example
    // we redirect back to this same page
    $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
    $client->setRedirectUri($redirect_uri);
  6. 在处理重定向 URI 的脚本中,将授权代码交换为访问令牌

    if (isset($_GET['code'])) {
        $token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
        $client->setAccessToken($token);
    }

使用服务帐户进行身份验证

此示例的示例请参阅 examples/service-account.php

  1. 按照说明 创建服务帐户

  2. 下载 JSON 凭证

  3. 使用 GOOGLE_APPLICATION_CREDENTIALS 环境变量设置这些凭证的路径

    putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json');
  4. 告诉 Google 客户端使用您的服务帐户凭证进行身份验证

    $client = new Google_Client();
    $client->useApplicationDefaultCredentials();
  5. 设置您要调用的 API 所需的权限范围

    $client->addScope(Google_Service_Drive::DRIVE);
  6. 如果您已将域范围访问权限委托给服务帐户,并想代表用户帐户进行操作,请使用setSubject方法指定用户帐户的电子邮件地址。

    $client->setSubject($user_to_impersonate);

发送请求

google-api-php-client-services中使用的类用于调用API,这些类是自动生成的。它们直接映射到在APIs Explorer中找到的JSON请求和响应。

Datastore API的JSON请求可能看起来像这样

POST https://datastore.googleapis.com/v1beta3/projects/YOUR_PROJECT_ID:runQuery?key=YOUR_API_KEY

{
    "query": {
        "kind": [{
            "name": "Book"
        }],
        "order": [{
            "property": {
                "name": "title"
            },
            "direction": "descending"
        }],
        "limit": 10
    }
}

使用此库,相同的调用可能看起来像这样

// create the datastore service class
$datastore = new Google_Service_Datastore($client)

// build the query - this maps directly to the JSON
$query = new Google_Service_Datastore_Query([
    'kind' => [
        [
            'name' => 'Book',
        ],
    ],
    'order' => [
        'property' => [
            'name' => 'title',
        ],
        'direction' => 'descending',
    ],
    'limit' => 10,
]);

// build the request and response
$request = new Google_Service_Datastore_RunQueryRequest(['query' => $query]);
$response = $datastore->projects->runQuery('YOUR_DATASET_ID', $request);

但是,由于每个JSON API属性都有一个相应的生成类,上面的代码也可以写成这样

// create the datastore service class
$datastore = new Google_Service_Datastore($client)

// build the query
$request = new Google_Service_Datastore_RunQueryRequest();
$query = new Google_Service_Datastore_Query();
//   - set the order
$order = new Google_Service_Datastore_PropertyOrder();
$order->setDirection('descending');
$property = new Google_Service_Datastore_PropertyReference();
$property->setName('title');
$order->setProperty($property);
$query->setOrder([$order]);
//   - set the kinds
$kind = new Google_Service_Datastore_KindExpression();
$kind->setName('Book');
$query->setKinds([$kind]);
//   - set the limit
$query->setLimit(10);

// add the query to the request and make the request
$request->setQuery($query);
$response = $datastore->projects->runQuery('YOUR_DATASET_ID', $request);

使用哪种方法是个人喜好问题,但在没有首先了解API的JSON语法的情况下,很难使用此库,因此建议在使用此处提供的任何服务之前先查看APIs Explorer

直接发送HTTP请求

如果外部应用程序需要Google身份验证,或者在此库中尚未提供Google API,可以直接发送HTTP请求。

authorize方法返回一个授权的Guzzle客户端,因此使用客户端发出的任何请求都将包含相应的授权。

// create the Google client
$client = new Google_Client();

/**
 * Set your method for authentication. Depending on the API, This could be
 * directly with an access token, API key, or (recommended) using
 * Application Default Credentials.
 */
$client->useApplicationDefaultCredentials();
$client->addScope(Google_Service_Plus::PLUS_ME);

// returns a Guzzle HTTP Client
$httpClient = $client->authorize();

// make an HTTP request
$response = $httpClient->get('https://www.googleapis.com/plus/v1/people/me');

缓存

建议使用另一个缓存库来提高性能。这可以通过向客户端传递一个兼容PSR-6的库来实现

$cache = new Stash\Pool(new Stash\Driver\FileSystem);
$client->setCache($cache);

在这个例子中,我们使用StashPHP。使用composer将此添加到您的项目中

composer require tedivm/stash

更新令牌

当使用刷新令牌服务帐户凭证时,当新的访问令牌被授权时执行某些操作可能很有用。为此,将可调用传递到客户端上的setTokenCallback方法

$logger = new Monolog\Logger;
$tokenCallback = function ($cacheKey, $accessToken) use ($logger) {
  $logger->debug(sprintf('new access token received at cache key %s', $cacheKey));
};
$client->setTokenCallback($tokenCallback);

使用Charles调试您的HTTP请求

通过查看原始HTTP请求来调试API调用通常非常有用。此库支持使用Charles Web Proxy。下载并运行Charles,然后使用以下代码通过Charles捕获所有HTTP流量

// FOR DEBUGGING ONLY
$httpClient = new GuzzleHttp\Client([
    'proxy' => 'localhost:8888', // by default, Charles runs on localhost port 8888
    'verify' => false, // otherwise HTTPS requests will fail.
]);

$client = new Google_Client();
$client->setHttpClient($httpClient);

现在,此库发出的所有调用都将出现在Charles UI中。

在Charles中查看SSL请求需要额外的步骤。转到Charles > Proxy > SSL Proxying Settings并添加您想捕获的域名。对于Google API,这通常是*.googleapis.com

特定服务的示例

YouTube: https://github.com/youtube/api-samples/tree/master/php

我如何贡献?

请参阅贡献页面以获取更多信息。特别是,我们非常喜欢pull请求 - 但请确保签署贡献者许可协议

常见问题解答

如果某些事情不起作用,我该怎么办?

对于库的支持,最佳提问方式是前往 StackOverflow 上的 google-api-php-client 标签:[http://stackoverflow.com/questions/tagged/google-api-php-client](http://stackoverflow.com/questions/tagged/google-api-php-client)

如果库中存在特定错误,请在 Github 问题跟踪器中[提交一个 issue](https://github.com/google/google-api-php-client/issues),包括失败的代码示例和任何特定的错误信息。也可以提交功能请求,只要它们是核心库请求,而不是特定于 API 的:对于这些,请参考各个 API 的文档,以确定最佳请求提交位置。请尽量提供清晰的问题陈述,说明该功能将解决的问题。

我想看一个 X 的例子!

如果 X 是库的一个功能,请忽略!如果 X 是使用特定服务的示例,最佳去处是那些特定 API 的团队——我们更喜欢链接到他们的示例,而不是将它们添加到库中,因为这样他们可以针对库的特定版本进行固定。如果您有其他 API 的示例,请告诉我们,我们将很高兴在 README 中添加链接!

为什么你还支持 5.2 版本?

当我们在 1.0.0 分支上开始工作时,我们知道库的 0.6 版本中存在一些需要解决的问题。当时我们检查了库的使用情况,以及其他相关项目,并确定仍然存在一个庞大且活跃的 PHP 5.2 安装基础。您可以在 WordPress 统计中的 PHP 版本图表中看到这一点:[http://wordpress.org/about/stats/](http://wordpress.org/about/stats/)。我们将继续关注我们看到的用法类型,并在可能的情况下利用更新的 PHP 功能。

为什么 Google_..._Service 有奇怪的名字?

_Service 类通常是自动从 API 发现文档生成的:[https://developers.google.com/discovery/](https://developers.google.com/discovery/)。有时 API 中会添加一些具有不寻常名称的新功能,这可能导致 PHP 类中出现一些意外或不标准的命名风格。

如何处理非 JSON 响应类型?

一些服务默认返回 XML 或类似内容,而不是 JSON,这是库所支持的。您可以通过在方法调用的最后添加一个 'alt' 参数来请求 JSON 响应。

$opt_params = array(
  'alt' => "json"
);

如何设置字段为 null?

库会从发送到 Google API 的对象中删除 null,因为这是所有未初始化属性的默认值。为了解决这个问题,将您想设置为 null 的字段设置为 Google_Model::NULL_VALUE。这是一个占位符,在通过网络发送时会替换为真正的 null。

代码质量

使用 PHPUnit 运行 PHPUnit 测试。您可以在 BaseTest.php 中配置 API 密钥和令牌来运行所有调用,但这需要在 Google 开发者控制台中进行一些设置。

phpunit tests/

编码风格

要检查编码风格违规,运行

vendor/bin/phpcs src --standard=style/ruleset.xml -np

要自动修复(可修复的)编码风格违规,运行

vendor/bin/phpcbf src --standard=style/ruleset.xml