【问题标题】:CMS Strapi - response with partial model dataCMS Strapi - 部分模型数据的响应
【发布时间】:2021-05-24 01:36:23
【问题描述】:

我有一个网页,我想在上面展示一组客户的文章。一篇文章由 - 标题作者简短描述文章正文组成。在主页上,我想以较短的形式显示所有可用的文章,仅包括 TitleShort description

当我在 Strapi 的文章后端集合(具有上述字段)上创建获取所有文章(通过 GET 请求)涉及获取所有文章的数据(标题作者、简短描述和文章正文),而在主页上,唯一需要的信息是标题简短描述

有没有办法在 Strapi 的后端设计它,以便在响应中只发送部分信息?

【问题讨论】:

  • 如果你愿意走这条路,可以肯定 Strapi 带有一个 graphql API。这允许您设置应包含哪些属性。常规 REST API 通常不是动态的。
  • @zero298 感谢您指出

标签: reactjs strapi


【解决方案1】:

正如@zero298 建议的那样,graphql 是实现您想要的最佳方式。

其他方式customizing your api's repsonse.

当您创建内容类型时,它会生成一个 API,其中包含以下 endpoints 列表。

每个端点都会触发一个控制器动作。这是创建内容类型时默认存在的controller actions列表。

如果您检查生成的 API ./api/{content-type}/controller/{Content-Type}.js 的控制器文件,您将看到一个空文件。这是因为所有默认逻辑都由 Strapi 管理。但是您可以使用自己的代码覆盖这些操作。

请参阅以下文档Example。此示例准确地解释了您想要的用例。

但是,我更喜欢使用 Strapi 提供的 graphQL enpoint。这使用起来要简单得多,尤其是对于您的用例。

步骤

  • 以超级管理员用户身份登录,选择插件,然后安装graphql插件。 您也可以通过终端使用 npm 或 yarn 安装插件(例如npm run strapi install graphql

  • 然后,启动您的应用程序并在 http://localhost:1337/graphql 打开您的浏览器(打开新窗口)。您应该会看到界面(GraphQL Playground),它将帮助您编写 GraphQL 查询来探索您的数据。

  • 要执行授权请求,您必须首先获得 JWT。如何执行授权请求请参考link

  • 要执行查询请求,您可以参考Query api。对于每个模型,插件会自动生成适合您需求的查询和突变

这是您可以开始使用 graphQL 的方法。顺便说一句,从您的应用程序中,您将需要一个 graphql 客户端来执行请求。 graphql clients的热门列表可以参考这篇文章。对于简单的用例,我更喜欢graphql-request

对于部分用例数据的响应,您的 graphql-request 查询可能类似于:


import { GraphQLClient, gql } from 'graphql-request'

async function main() {
  const endpoint = 'your graphql endpoint'

  const graphQLClient = new GraphQLClient(endpoint, {
    headers: {
      authorization: 'Bearer MY_TOKEN',
    },
  })

  const query = gql`
    {
      Article {
        Title
        Short description
      }
    }
  `
  const data = await graphQLClient.request(query)
  console.log(JSON.stringify(data, undefined, 2))
}

main().catch((error) => console.error(error));

使用graphql 而不是REST 端点的缺点之一是,您需要在响应中指定所需的所有字段。因此,如果您需要端点的所有字段,则需要在查询中明确指定所有字段名称。

【讨论】:

  • 缓存机制呢?是否有可能以某种方式获取本地缓存的strapi数据,以便下次不需要再次请求它(当然,后端的某些数据会被更改)?
  • 对于缓存需求,Apollo、Relay 和 FlacheQL 是用于客户端缓存的库。但是 FlacheQl 的优势在于它提供了基于搜索参数的缓存数据的部分检索——这是其他 GraphQL 库没有提供的功能。 Apollo 和 Relay 等较大的实现只能基于 GraphQL 查询字段缓存数据。参考this文章
  • 这非常有用,感谢您提供的信息。我得到的最后一个问题是每篇文章都有可能(如果是的话,如何实现)有不同的终点?因此,如果客户的网站是 site.com,那么每篇文章都会有自己的 url,例如 site.com/my-awesome-article 等?谢谢
  • 不确定,但我认为这不可能!!
  • 如果你不确定,那么它可能是可能的 :) 还是谢谢
猜你喜欢
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 2012-12-10
  • 2021-04-04
  • 2011-01-07
  • 1970-01-01
  • 2013-02-20
  • 2020-11-28
相关资源
最近更新 更多