使用 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
问题在于:
- 对开发者不友好
- 不可跨环境移植(即测试 Space 和生产 space)
目前我能看到的唯一解决方案是在页面加载时预先检索内容类型到 id 的映射并使用它 - 但它不会对性能有太大帮助。
文档似乎总是使用友好易读的内容类型 ID(例如 cat),但这不是我的经验。
所以,要解决这个问题,有没有:
- 一种将内容类型设置为具有友好 ID 的方法?或
- 一种使用不同查询参数按名称检索条目的方法?
我曾经有过同样的问题,基本上 运行 内容类型的预检索,然后创建一个将名称转换为 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。您必须使用 ContentfulSpaceAPI
的 createContentTypeWithId
方法。
它的签名看起来像
* @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。
我正在评估 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
问题在于:
- 对开发者不友好
- 不可跨环境移植(即测试 Space 和生产 space)
目前我能看到的唯一解决方案是在页面加载时预先检索内容类型到 id 的映射并使用它 - 但它不会对性能有太大帮助。
文档似乎总是使用友好易读的内容类型 ID(例如 cat),但这不是我的经验。
所以,要解决这个问题,有没有:
- 一种将内容类型设置为具有友好 ID 的方法?或
- 一种使用不同查询参数按名称检索条目的方法?
我曾经有过同样的问题,基本上 运行 内容类型的预检索,然后创建一个将名称转换为 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。您必须使用 ContentfulSpaceAPI
的 createContentTypeWithId
方法。
它的签名看起来像
* @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。