0

假设我们确实有一个Apigility URL,例如localhost:8888/user.

但是我在一个Apigility项目中确实有两个 API,即 ApiOneApiTwo

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

4

1 回答 1

1

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

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

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

/api/user[/:user_id]

/api/user[/:user_name]

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

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

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


'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,则应调用 Username 资源,因为它是最后定义的。

总的来说,我的建议是你改变路线,使它们不同。带有版本的接受标头本质上用于版本控制,而不是路由到不同的 API 资源。

于 2015-05-14T05:28:07.217 回答