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

时间:2015-02-06 04:07:19

标签: rest apigility

假设我们确实拥有像localhost:8888/user这样的 Apigility 网址。

但我在一个 Apigility 项目中有两个API, ApiOne ApiTwo

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

1 个答案:

答案 0 :(得分: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和[a-z] +的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资源,因为它是最后定义的。

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