如何在单个 Apigility 项目中访问两个相似但位于不同的 API?

How to access two similar but located in different API in a single Apigility project?

假设我们确实有 Apigility URL 像 localhost:8888/user.

但我在单个 Apigility 项目中确实有两个 API,ApiOne ApiTwo.

localhost:8888/user 发出 GET 请求总是 returns ApiTwo 生成的资源。但是当我想从 ApiOne 获取相同的用户资源时,因为它来自不同的数据库,我无法检索它。我已经尝试为 Accept 媒体类型提供正确的版本(希望它会有所帮助),以访问 ApiOne(例如 Accept application/vnd.apione.v1+json

根据你的问题,我猜你有 ApiOne 和 /user 的路由,ApiTwo 有到 /user 的路由?

问题是它们不是不同的路线。 ZF2 将使用(我相信)组合配置文件中最后定义的那个。如果您希望能够同时使用 API 资源,则需要以某种方式使用不同的路由。这可能实际上是将其中之一更改为 /user1 之类的内容。

理论上,您还可以路由到 entities 的两个不同端点,前提是您对 id 提供约束,使它们可区分。我的意思是你可以有这样的两条路线:

/api/user[/:user_id]

/api/user[/:user_name]

就ZF2 路由器而言,在这一点上,这些路由是相同的。可变部分 user_id 和 user_name 可能是同一件事。

但是,您需要其他东西来使路线不同。 Apigility(和 ZF2)允许对 URL 的部分进行约束。因此,您可以对 [0-9]+ 的 user_id 施加约束,对 [a-z]+ 的 user_name 施加约束。这些将使实体的路由相互排斥,但路由的 collection 版本仍然相同。

在路由中添加约束,如下所示:


'router' => array(
        'routes' => array(
            'your-api.rest.user' => array(
                'type' => 'Segment',
                'options' => array(
                    'route' => '/user[/:user_id]',
                    'defaults' => array(
                        'controller' => 'YourApi\V1\Rest\User\Controller',
                    ),
                    'constraints' => array(
                        **'user_id' => '[0-9]+'**,
                    ),
                ),
            ),
            'your-api.rest.username' => array(
                'type' => 'Segment',
                'options' => array(
                    'route' => '/user[/:user_name]',
                    'defaults' => array(
                        'controller' => 'YourApi\V1\Rest\Username\Controller',
                    ),
                    'constraints' => array(
                        **'user_name' => '[a-z]+'**,
                    ),
                ),
            ),
        ),
    ),
)

在此示例中,如果未提供 user_id 或 user_name,则应调用用户名资源,因为它是最后定义的。

但总的来说,我的建议是您更改路线,使它们不同。 accept header with version 本质上用于版本控制,而不是路由到不同的 API 资源。