微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有自定义请求正文的 API 平台自定义资源

如何解决具有自定义请求正文的 API 平台自定义资源

我对 Symfony 和 API 平台非常陌生。我正在尝试创建一个自定义资源/操作,它接收请求的正文,根据值从数据库获取数据,然后将实体的集合返回给客户端。

示例: 具有以下正文的 GET 请求:

{
   "trackName": "example"
   "anotherKey": "anotherValue"
}

根据这些属性我想查询数据,做计算,然后返回数据。

我正在尝试弄清楚如何使其成为 API 平台方式。我一直在谷歌搜索并在文档中寻找它几个小时,但我找不到实现这一目标的方法

我尝试使用 CollectionDataProvider 和这样的控制器查询数据:

/**
 * @ApiResource(
 *     itemOperations={
 *          "tracks_custom_endpoint"={
 *              "method"="GET",*              "path"="/tracks/custom_endpoint",*              "controller"=MyController::class,*              "read"=false
 *          }
 *     }
 * )
 * @ORM\Entity(repositoryClass=SpotifyTrackRepository::class)
 */
class Track
{
   // Attributes,setters and getters
}

但是,无论哪种方式,我都无法分别访问请求的正文和随其发送的 JSON 数据。有没有办法以某种方式访问​​这些数据然后处理它。

解决方法

首先,考虑 itemOperations 指定与单个资源交互的端点。而 collectionOperations 指定与整个资源集合交互的端点。听起来您的端点应该在 collectionOperations 下配置,因为您要返回过滤的资源集合,而不是单个资源。

其次,集合 GET 操作期望请求正文有效负载以提供集合过滤器是不常见的。这些通常使用查询参数提供。 API 平台随附了许多开箱即用的 query parameter filters,涵盖了大多数用例(包括您的用例)。否则,请使用 Extensions 进行更自定义和更复杂的集合过滤。

最后,Data Transformers 允许您控制如何将输入(请求负载)转换为资源,或如何将资源转换为输出(响应负载)。这似乎就是你要找的。但是,我建议在走这条路之前考虑一下我之前的观点。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。