当前位置: 首页 > 知识库问答 >
问题:

如何使用与任何特定实体无关的参数编写自定义endpoint

李康安
2023-03-14

我正在尝试编写自定义 GET endpoint,这些endpoint必须具有一个或多个自定义参数,但不构建在特定实体之上。

类似于:/assets/{ device _ id }/{ scene _ id }/{ maybe _ other _ param }

我想象它只是自己的控制器类,我在其中做一些事情,从输入中计算值,手动读取一些数据并返回实体数组。我只得到一个资产实体,但它需要{设备}和{场景}是这个实体的属性…

我不希望这是一个暴露的实体,通过它的属性过滤,我只需要在API中看到简单的endpoint,作为普通的自定义控制器,带一些参数,做一些事情,并返回json。

这听起来很简单,但我阅读了大量的文档和示例,仍然没有找到任何东西。这在API平台中是可能的吗?

共有1个答案

邰钟展
2023-03-14

如果您希望将路径中的参数直接传递到控制器,则需要使用 “read”=false 配置操作。以下是我可以使用此类收集操作的最简单的资产资源:

namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Annotation\ApiProperty;
use App\Controller\GetAssetCollectionByPathParams;

/**
 * @ApiResource(
 *     collectionOperations={
 *         "get",
 *         "get_by_path_params"={
 *             "method"="GET",
 *             "controller"=GetAssetCollectionByPathParams::class,
 *             "path"="/assets/{device_id}/{scene_id}/{maybe_other_param?}",
 *             "read"=false,
 *             "pagination_enabled"=false,
 *             "openapi_context"={
 *                 "summary"="Get by path parameters",
 *                 "parameters"={
 *                     {
 *                         "name" = "device_id",
 *                         "in" = "path",
 *                         "required" = true,
 *                         "type" = "integer"
 *                     },
 *                     {
 *                         "name" = "scene_id",
 *                         "in" = "path",
 *                         "required" = true,
 *                         "type" = "string"
 *                     },
 *                     {
 *                         "name" = "maybe_other_param",
 *                         "in" = "path",
 *                         "required" = false,
 *                         "type" = "string"
 *                     }
 *                 }
 *             }
 *         }
 *     },
 *     itemOperations={
 *         "get"
 *     }
 * )
 */
class Asset
{

    /** @var string */
    public $description;

    /**
     * @return int
     * @ApiProperty(identifier=true)
     */
    public function getId()
    {
        return time();
    }
}

我用以下Controller类测试了它:

namespace App\Controller;

use App\Entity\Asset;

class GetAssetCollectionByPathParams
{
    /**
     * @return Asset[]
     */
    public function __invoke($device_id, $scene_id, $maybe_other_param=null) :array
    {
        $result = new Asset();
        $result->description = "GetAssetCollectionByPathParams result for device_id: $device_id, scene_id: $scene_id, maybe_other_param: $maybe_other_param";
        return [$result];
    }
}

也适用于GET项目操作。对于输出为资源的集合操作,不要删除任何默认的“get”操作,否则IriConverter无法生成必要的iri。如果你不想这样做,你必须输出一个不是资源的DTO或其他,并将输出=配置为输出的类。然后你也需要纠正招摇文档,有关集合操作的示例,请参阅我教程的chapter9-api分支。有关POST操作,请参阅我对此问题的回答。

 类似资料:
  • 问题内容: 我有一个C#/ Selenium / Specflow测试套件,正在使用xunit.console.exe使用Jenkins运行。我需要将这些测试指向不同的环境(Test / QA / Prod等),并想使用命令行参数。 我正在调用的批处理命令是: 并希望包含一个额外的参数,例如: “ -env = PROD”, 以将该作业指向特定的环境。 我愿意采取更好的方法。 问题答案: 对于此解

  • 问题内容: 我正在将NHibernate与旧的rdbms规则引擎一起使用。我正在使用GenericDialect,但生成的某些sql无法正常工作。如果我需要为此规则引擎编写自定义方言,该如何开始? 问题答案: 这是一个方言示例: 它所在的程序集引用了NHibernate.dll hibernate.cfg.dll(请注意,我这里没有设置’connection.connection_string’属

  • 你好,我想知道是否有人可以帮助我完成一些我卡住的代码。因此,我正在使用lambda语句编写一个自定义比较器,我想执行以下操作。如果返回.getName()的名称彼此相等,那么我想从.getDirection()中选择一个是字符串“Up”(在这种情况下,它保证其中一个是“Up”,另一个是“Down”),否则我们将根据.getType()在字母顺序上查看哪个更高)。 到目前为止,我有这个:

  • 我试图在Android Studio中使用自定义字体,就像我们在Eclipse中所做的那样。但不幸的是,无法弄清楚将“资产”文件夹放在哪里!

  • 问题内容: 我需要为AngularJS编写一个自定义模块,但是我找不到关于该主题的任何好的文档。如何为AngularJS编写一个可以与他人共享的自定义模块? 问题答案: 在这种情况下,您认为文档无法再为您提供帮助,一个很好的学习方法是查看其他已经构建的模块,看看其他人是如何做到的,他们如何设计架构以及如何将它们集成到其中。他们的应用。 在查看其他人的工作之后,您至少应该有一个起点。 例如,看看任何

  • 我想在日志文件的开头写入自定义头行。自定义头是日期/时间,XML文件名, 在log4j中,我可以通过扩展PatternLayout来创建自定义头。 我为自定义头包含了PatternLayout的log4j属性config和子类CustomFileHeaderLayout。工作很好。 log4j.属性