使用 API

简介

本文档适用于想要编写客户端库、IDE 插件和其他工具以便与 Google API 进行交互的开发者。借助 Google API Discovery Service,您可以通过简单的 API 公开其他 Google API 的机器可读元数据,从而实现上述所有目的。本指南简要介绍了发现文档的各个部分,并提供了实用的文档使用提示。

对此 API 的所有调用都是未经身份验证且基于 SSL 的 REST 请求,这些请求使用 SSL,例如,网址以 https 开头。

如果您不熟悉 Google API Discovery Service 的概念,请在开始编写代码之前阅读使用入门

探索文档格式

本部分简要介绍了发现文档。

以下所有示例均使用 Google Cloud Service Management API 中的 Discovery 文档。您可以执行以下 GET 请求,加载 Google Cloud Service Management API 的发现文档

GET https://servicemanagement.googleapis.com/$discovery/rest?version=v1

发现文档的格式包括六大类:

下面逐一介绍了这些发现文档的各个部分。如需详细了解每个属性,请参阅参考文档

基本 API 说明

探索文档包含一组 API 专用属性:

"kind": "discovery#restDescription",
"name": "servicemanagement",
"version": "v1",
"title": "Service Management API",
"description": "Google Service Management allows service producers to publish their services on Google Cloud Platform so that they can be discovered and used by service consumers.",
"protocol": "rest",
"rootUrl": "https://servicemanagement.googleapis.com/. Root URL under which all API services live",
"servicePath": "",

这些 API 级别属性包含有关 API 特定版本的详细信息,包括 nameversiontitledescriptionprotocol 始终具有固定的 rest 值,因为 API Discovery Service 仅支持通过 RESTful 方法访问 API。

servicePath 字段用于指明此特定 API 版本的路径前缀。

身份验证

auth 部分包含有关 API 的 OAuth 2.0 身份验证范围的详细信息。要详细了解如何在 OAuth 2.0 中使用范围,请参阅使用 OAuth 2.0 访问 Google API

auth 部分包含嵌套的 oauth2scopes 部分。scopes 部分是一个从范围值到范围的更多详细信息的键值对:

"auth": {
  "oauth2": {
    "scopes": {
      "https://www.googleapis.com/auth/cloud-platform.read-only": {
        "description": "View your data across Google Cloud Platform services"
      },
      "https://www.googleapis.com/auth/service.management.readonly": {
        "description": "View your Google API service configuration"
      },
      "https://www.googleapis.com/auth/cloud-platform": {
        "description": "View and manage your data across Google Cloud Platform services"
      },
      "https://www.googleapis.com/auth/service.management": {
        "description": "Manage your Google API service configuration"
      }
    }
  }
}

auth 部分仅定义特定 API 的范围。如需了解这些作用域如何与 API 方法相关联,请参阅下文中的方法部分。

资源和架构

API 的操作会对名为 resources 的数据对象执行操作。“发现”文档是围绕资源的概念构建的。每个发现文档都有一个顶级 resources 部分,用于对与此 API 关联的所有资源进行分组。例如,Google Cloud Service Management API 在顶级 resources 下设置了 services 资源和 operations 资源,而 services 资源包含三个子资源 configsrolloutsconsumers

"resources": {
  "services": {
    // Methods and sub-resources associated with the services resource
    "configs": {
      // Methods and sub-resources associated with the services.configs resource
    },
    "rollouts": {
      // Methods and sub-resources associated with the services.rollouts resource
    },
    "consumers": {
      // Methods and sub-resources associated with the services.consumers resource
    }
  },
  "operations": {
    // Methods and sub-resources associated with the operations resource
  }
}

每个资源部分内都有与该资源相关联的方法。例如,Google Cloud Service Management API 有三个与 services.rollouts 资源关联的方法:getlistcreate

架构可以告知您 API 中的资源是什么样的。每个发现文档都有一个顶级 schemas 部分,其中包含指向对象的架构 ID 的名称/值对。架构 ID 对于每个 API 都是唯一的,用于对发现文档的 methods 部分中的架构进行唯一标识:

"schemas": {
  "Rollout": {
    // JSON Schema of the Rollout resource.
  }
}

API 探索服务使用 JSON 架构草稿-03 作为其架构表示法。以下是 Url 资源的 JSON 架构代码段,以及实际响应资源:

发布资源 JSON 架构 实际发布资源响应
{
  "Rollout": {
    "id": "Rollout",
    "type": "object",
    "description": "...",
    "properties": {
      "serviceName": {
        "type": "string",
        "description": "..."
      },
      "rolloutId": {
        "type": "string",
        "description": "..."
      },
      "status": {
        "type": "string",
        "enum": [
          "ROLLOUT_STATUS_UNSPECIFIED",
          "IN_PROGRESS",
          "SUCCESS",
          "CANCELLED",
          "FAILED",
          "PENDING",
          "FAILED_ROLLED_BACK"
        ],
        "enumDescriptions": [
          ...
        ],
        "description": "..."
      },
      "trafficPercentStrategy": {
        "$ref": "TrafficPercentStrategy",
        "description": "..."
      },
      "deleteServiceStrategy": { ... },
      "createTime": { ... },
      "createdBy": { ... }
    }
  }
}

{
  "serviceName": "discovery.googleapis.com",
  "rolloutId": "2020-01-01R0",
  "status": "SUCCESS",
  "trafficPercentStrategy":{
    "precentages":{
      "2019-12-01R0": 70.00,
      "2019-11-01R0": 30.00
    }
  }
}

以粗体显示的字段显示了 JSON 架构与实际响应之间的映射。

架构也可能包含对其他架构的引用。如果您正在构建客户端库,这有助于您有效地在数据模型类中为 API 的对象建模。在上面的 Rollout 示例中,trafficPercentStrategy 属性实际上是对 ID 为 TrafficPercentStrategy 的架构的引用。如果您查看 schemas 部分,就会发现 TrafficPercentStrategy 架构。此架构的值可以替换为 Rollout 资源中的 trafficPercentStrategy 属性(请注意,$ref 语法来自 JSON 架构规范)。

在指示架构的请求和响应正文时,方法还可以引用架构。如需了解详情,请参阅方法部分。

方法

Discovery 文档的核心是围绕各种方法构建的。方法是指可以对 API 执行的操作。methods 部分位于发现文档的各个方面,包括顶级(我们称之为 API 级别方法)或 resources 级别。

"methods": {
  // API-level methods
}
"resources": {
  "resource1": {
    "methods": {
      // resource-level methods
    }
    "resources": {
      "nestedResource": {
        "methods": {
          // methods can even be found in nested-resources
        }
      }
    }
  }
}

虽然 API 可以有 API 级方法,但资源必须包含 methods 部分。

每个 methods 部分都是从方法名称到该方法的其他详细信息的键值对。以下示例记录了三个方法:getlistcreate

"methods": {
  "get": { //details about the "get" method },
  "list": { //details about the "list" method },
  "create": { //details about the "create" method }
}

最后,每个方法的部分中都详细说明了该方法的各种属性。下面是一个 get 方法示例:

"get": {
  "id": "servicemanagement.services.rollouts.get",
  "path": "v1/services/{serviceName}/rollouts/{rolloutId}",
  "flatPath": "v1/services/{serviceName}/rollouts/{rolloutId}",
  "httpMethod": "GET",
  "description": "Gets a service configuration rollout.",
  "response": { "$ref": "Rollout" },
  "parameters": { // parameters related to the method },
  "parameterOrder": [ // parameter order related to the method ],
  "scopes": [ // OAuth 2.0 scopes applicable to this method ],
  "mediaUpload": { // optional media upload information },
},

本部分包含常规方法详细信息,例如标识方法的唯一 ID、要使用的 httpMethod 以及方法的 path(如需详细了解如何使用 path 属性计算完整方法网址,请参阅编写请求部分)。除了这些常规方法属性外,还有一些属性用于将方法与发现文档中的其他部分相关联:

权限范围

本文档前面定义的 auth 部分包含有关特定 API 支持的所有范围的信息。如果某个方法支持其中某个范围,则该方法将拥有范围数组。对于该方法支持的每个范围,此数组中都有一个条目。例如,Google Cloud Service Management API get 方法的 scopes 部分如下所示:

"scopes": [
  "https://www.googleapis.com/auth/cloud-platform",
  "https://www.googleapis.com/auth/cloud-platform.read-only",
  "https://www.googleapis.com/auth/service.management",
  "https://www.googleapis.com/auth/service.management.readonly"
]

请注意,选择要在应用中使用的身份验证范围取决于多种因素,例如要调用哪些方法,以及随方法一起发送哪些参数。因此,具体使用哪种作用域由开发者决定。只能用于发现范围对某个方法有效的文档。

请求和响应

如果该方法具有请求或响应正文,请分别参阅 requestresponse 部分。在上面的 get 示例中,该方法具有 response 正文:

"response": {
  "$ref": "Rollout"
}

上面的语法表明响应正文由 ID 为 Rollout 的 JSON 架构定义。此架构可在顶级架构部分找到。请求正文和响应正文都使用 $ref 语法来引用架构。

参数

如果某个方法有应由用户指定的参数,则这些参数会记录在方法级 parameters 部分中。本部分包含将参数名称映射到相应参数的键值对的更多详细信息:

"parameters": {
  "serviceName": {
    "type": "string",
    "description": "Required. The name of the service.",
    "required": true,
    "location": "path"
  },
  "rolloutId": { ... }
},
"parameterOrder": [
  "serviceName",
  "rolloutId"
]

在上面的示例中,get 方法有两个参数:serviceNamerolloutId。参数可以位于 path 或网址 query 中;location 属性用于指明客户端库应该将该参数放在什么位置。

还有很多其他描述参数的属性,包括参数数据 type(对强类型语言很有用)、参数是否为 required 以及参数是否为枚举。如需详细了解这些属性,请参阅参考指南

参数顺序

客户端库可通过多种方式构建其接口。一种方法是在方法签名中有一个包含每个 API 参数的方法。但是,由于 JSON 是一种无序格式,因此以编程方式难以知道如何对方法签名中的参数进行排序。parameterOrder 数组为发出请求提供固定的参数顺序。该数组会按有效性顺序列出每个参数的名称;它可以包含路径参数或查询参数,但数组中的每个参数都是必需参数。在上面的示例中,Java 方法签名可能如下所示:

public Rollout get(String serviceName, String rolloutId, Map<String, Object> optionalParameters);

parameterOrder 数组中的第一个值 serviceName 也是方法签名中的第一个元素。如果 parameterOrder 数组中还有其他形参,这些形参则位于 serviceName 形参后面。由于 parameterOrder 数组仅包含必需参数,因此最好也提供一种供用户指定可选参数的方法。上面的示例使用 optionalParameters 地图执行此操作。

媒体上传

如果某个方法支持上传媒体(例如图片、音频或视频),则 mediaUpload 部分会记录支持上传该媒体的位置和协议。本部分详细介绍了哪些上传协议受支持,以及可以上传哪些类型的媒体:

"supportsMediaUpload": true,
"mediaUpload": {
  "accept": [
    "image/*"
  ],
  "maxSize": "10MB",
  "protocols": {
    "simple": {
      "multipart": true,
      "path": "/upload/storage/v1beta1/b/{bucket}/o"
    },
    "resumable": {
     "multipart": true,
     "path": "/resumable/upload/storage/v1beta1/b/{bucket}/o"
    }
  }
}

在上面的示例中,supportsMediaUpload 属性是一个布尔值,用于确定该方法是否支持上传媒体。如果值为 true,则 mediaUpload 部分会记录可以上传的媒体种类。

accept 属性是一系列媒体范围,用于确定可接受的上传 MIME 类型。上述示例中显示的端点将接受任何图片格式。

maxSize 属性的上传大小上限。该值是一个以 MB、GB 或 TB 为单位的字符串。在上面的示例中,上传文件的大小上限为 10 MB。请注意,此值不会反映单个用户的 API 剩余存储空间配额,因此即使上传量低于 maxSize,客户端库也应准备好处理由于空间不足而上传的失败情况。

protocols 部分列出了某个方法支持的上传协议。simple 协议只是在单个 HTTP 请求中将媒体发布到给定端点。resumable 协议意味着 path URI 中提供的端点支持可续传上传协议。如果 multipart 属性为 true,则端点接受多部分上传,这意味着 JSON 请求和媒体可以封装在互斥/相关正文中并一起发送。请注意,simpleresumable 协议可能均支持多部分上传。

path 属性是一个 URI 模板,应像方法的 path 属性一样进行扩展,如编写请求部分中所述。

媒体下载

如果某个方法支持下载媒体(例如图片、音频或视频),则通过 supportsMediaDownload 参数指明:

"supportsMediaDownload": true,

下载媒体时,您必须在请求网址中将 alt 查询参数设为 media

如果 API 方法的 useMediaDownloadService 属性为 true,请在 servicePath 前插入 /download 以避免重定向。例如,如果 servicePathpath 的串联为 /youtube/v3/captions/{id},下载路径为 /download/youtube/v3/captions/{id}。即使 useMediaDownloadService 为 false,仍建议您使用 /download 构建媒体下载网址。

常见参数

顶级发现文档包含一个 parameters 属性。本部分与每种方法的参数部分类似,但这些参数可应用于 API 中的任何方法。

例如,Google Cloud Service Management API 的 get、insert 或 list 方法的请求参数中可以有 prettyPrint 参数,该参数采用人类可读懂的格式设置所有方法的响应。下面列出了常见参数:

参数 含义 备注 适用性
access_token 当前用户的 OAuth 2.0 令牌。
alt

响应的数据格式。

  • 有效值:jsonatomcsv
  • 默认值:因 API 而异。
  • 并非所有值都适用于所有 API。
  • 适用于所有资源的所有操作。
callback 回调函数。
  • 用于处理响应的 JavaScript 回调函数的名称。
  • 用于 JavaScript JSON-P 请求。
fields 指定响应中所含字段子集的选择器。
  • 如需了解详情,请参阅部分响应文档。
  • 用于提升性能。
key API 密钥。(必需*)
  • *必需参数(除非您提供 OAuth 2.0 令牌)。
  • 您的 API 密钥用于标识您的项目,并且为您提供 API 访问权限、配额和报告。
  • API 控制台获取项目的 API 密钥。
prettyPrint

返回带有标识符和换行符的响应。

  • 如果该参数的值为 true,则系统会以人类可读的格式返回响应。
  • 默认值:因 API 而异。
  • 如果该参数的值为 false,则可缩减响应的载荷大小(在某些环境中或许可提升性能)。
quotaUser userIp 的替代参数。
  • 可以让您即使在用户 IP 地址不明的情况下,也能通过服务器端的应用实施每个用户的配额限制。例如,当应用代表用户在 App Engine 上运行 cron 作业时,会发生此类情况。
  • 您可以选择使用任意字符串作为用户的唯一标识符,但字符数不能超过 40 个。
  • 如果同时提供这两个参数,则该参数会覆盖 userIp
  • 详细了解上限的用法
userIp 最终用户的 IP 地址,表示此 API 是为哪个用户调用的。
  • 通过服务器端应用调用 API 时,您可以利用该参数强制执行每个用户的配额限制。
  • 详细了解上限的用法

特性

在某些情况下,API 支持探索文档其余范围之外的自定义功能。这些数据收集在 features 数组中。功能数组包含 API 支持的各个特殊功能的字符串标签。目前,dataWrapper 是唯一受支持的功能,但将来可能会支持其他功能。

"features": dataWrapper

dataWrapper 功能表示对 API 的所有请求和来自 API 的响应均封装在 data JSON 对象中。这是旧版 Google API 的一项功能,但今后我们将弃用。以下 API 支持 dataWrapper 功能:汇问 v1翻译 v2

作为客户端库开发者,如果 API 支持“dataWrapper”功能,您应执行以下操作:

  1. 针对请求:将请求资源封装在 data JSON 对象中。
  2. 在响应时:在 data JSON 对象内找到相应资源。

Discovery 文档中的架构不包含数据封装容器,因此您必须明确添加和移除这些封装容器。例如,假设有一个名为“Foo”的 API,其资源如下所示:

{
  "id": 1,
  "foo": "bar"
}

在使用 API 插入此资源之前,您需要先将其封装在数据元素中:

{
  "data": {
    "id": 1,
    "foo": "bar"
  }
}

另一方面,当您从 API 获得响应时,它还包含数据封装容器:

{
  "data": {
    "id": 1,
    "foo": "bar"
  }
}

如需获取架构定义的资源,您需要移除数据封装容器:

{
  "id": 1,
  "foo": "bar"
}

内嵌文档

每个发现文档都带有许多 description 字段,这些字段提供 API 内嵌文档。您可以为以下 API 元素找到 description 字段:

  • API 本身
  • OAuth 范围
  • 资源架构
  • API 方法
  • 方法参数
  • 某些参数的可接受值

如果您希望使用 Google API Discovery Service 为客户端库(例如 JavaDoc)生成简单易懂的文档,这些字段将特别有用。

后续步骤