如何指定自己的图标,以便它们显示在Google Endpoints API发现文档中?

时间:2013-05-13 22:56:35

标签: google-cloud-endpoints

我试图让图标部分包含我自己的图标,而不是通过尝试猴子补丁ApiConfigGenerator.get_descriptor_defaults来搜索谷歌。不幸的是,在完成发现文档时会忽略/丢弃这些文件。

{
 "kind": "discovery#restDescription",
 "etag": "...",
 "discoveryVersion": "v1",
 "id": "acme:v1",
 "name": "acme",
 "version": "v1",
 "description": "Acme API",
 "ownerDomain": "google.com",
 "ownerName": "Google",
 "icons": {
  "x16": "http://www.google.com/images/icons/product/search-16.gif",  # <-- acme icon url here!
  "x32": "http://www.google.com/images/icons/product/search-32.gif"   # <--
 },
 "protocol": "rest",
 "baseUrl": "http://acme.appspot.com/_ah/api/acme/v1/",
 "basePath": "/_ah/api/acme/v1/",
 "rootUrl": "http://acme.appspot.com/_ah/api/",
 "servicePath": "acme/v1/",
 "batchPath": "batch",
 "parameters": {

如果有的话,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

google.appengine.api.endpoints库中尚不支持此功能,但如果您在API配置中指定icon16icon32,则可以使用此功能。为此,您可以在pretty_print_config_to_json类上修补ApiConfigGenerator方法,或者对其进行子类化,并在google.appengine.ext.endpoints.api_config模块中修补该类。

例如,我们在猴子修补模块之前导入模块并保存原始类:

import json
from google.appengine.ext.endpoints import api_config
OriginalConfigGenerator = api_config.ApiConfigGenerator

然后我们定义一个子类来替换它:

class NewConfigGenerator(OriginalConfigGenerator):

然后覆盖生成API配置的方法:

  def pretty_print_config_to_json(self, services, hostname=None):
    descriptor = super(NewConfigGenerator, self).pretty_print_config_to_json(
        services, hostname=hostname)
    descriptor = json.loads(descriptor)

获得配置字典后,您可以添加自己的密钥并将其返回:

    descriptor['icon16'] = 'YOUR-16x16-ICON-LINK'
    descriptor['icon32'] = 'YOUR-32x32-ICON-LINK'
    # This will be slower than overwriting __api_descriptor
    # due to the json.parse/json.loads having to occur twice
    # but hacking around private methods is a pain.
    return json.dumps(descriptor, sort_keys=True, indent=2)

最后,确保在实际创建API之前修补模块:

api_config.ApiConfigGenerator = NewConfigGenerator

这可以通过将这个猴子补丁放在像monkey_patch.py这样的文件然后使用

来完成。
import monkey_patch

在定义API类的文件中。希望这会有所帮助。