使用 Contentful 检索内容类型的更友好方式

Friendlier way to Retrieve Content Types with Contentful

我正在评估 Contentful.com 作为 Angular SPA 的内容引擎。

我面临的问题是按内容类型检索条目(例如获取类型 "blog" 的所有条目)。如documentation example中所述,这是按如下方式完成的:

/spaces/spaceid/entries?access_token=token&content_type=cat

所以在我的情况下,而不是 "cat",content_type="blog" 或 content_type="news" 将是我期望的交互方式。

我面临的现实是,通过 content_type 检索内容不允许我使用我的内容类型的名称 - 它需要的 ID 是一个丑陋的 GUID,所以我的查询看起来像这样:

/spaces/spaceid/entries?access_token=token&content_type=2wKn6yEnZewu2SCCkus4as

问题在于:

目前我能看到的唯一解决方案是在页面加载时预先检索内容类型到 id 的映射并使用它 - 但它不会对性能有太大帮助。

文档似乎总是使用友好易读的内容类型 ID(例如 cat),但这不是我的经验。

所以,要解决这个问题,有没有:

  1. 一种将内容类型设置为具有友好 ID 的方法?或
  2. 一种使用不同查询参数按名称检索条目的方法?

我曾经有过同样的问题,基本上 运行 内容类型的预检索,然后创建一个将名称转换为 if 的小地图。性能并不算太差,因为在应用程序启动时只执行一次。此外,Contentful 使用 CDN,几乎可以即时做出响应。

无论如何,这是个好消息:虽然你不能通过 Contentful 的用户界面定义内容类型的 ID,但你完全可以通过他们的 API 像这样通过 curl 来定义内容类型的 ID(你也可以使用各种 SDK):

curl -H 'Authorization: Bearer <access-token>' \ 
  -X PUT \
  -d '{"name": "Blog", "fields": [{"name":"Name","id":"name","type":"Symbol"}]}' \
  https://api.contentful.com/spaces/<spaceId>/content_types/blog

这将创建一个 ID 为 "blog" 的内容类型,它有一个字段 "name"。一旦您创建了这样的内容类型,您也可以转到用户界面并向其添加更多字段。

如果您在网络应用程序中访问该内容类型的页面,请检查 url 的末尾。它应该看起来像:

content_types/yourContentType

在这种情况下,yourContentType 是您可以使用的 id(这是您在文档中看到的)。我花了一段时间才在文档中找到这个,肯定会更明显。

您实际上可以使用SDK 创建具有指定id 的contentType。您必须使用 ContentfulSpaceAPIcreateContentTypeWithId 方法。

它的签名看起来像

* @property {function(id: string, data: {name: string, fields: Array}): Promise<ContentType>} createContentTypeWithId - creates a ContentType with a specified id

情况不再如此,您可以使用以下类型的查询检索特定内容类型的所有条目:

options = {
    include: 10,
    limit: 1000,
    order: "fields.publishDate",
    "fields.tags[in]": title_case_filter,
    content_type: "blog"
  };

在这种情况下,"blog" 是创建内容类型时分配的 contentType id。