假设我们确实拥有像localhost:8888/user
这样的 Apigility 网址。
但我在一个 Apigility 项目中有两个API, ApiOne 和 ApiTwo 。
从GET
执行localhost:8888/user
请求始终返回ApiTwo生成的资源。但是当我想获得与ApiOne相同的用户资源时,因为它来自不同的数据库,我无法检索它。我已经尝试为Accept媒体类型提供正确的版本(希望它会有所帮助),以访问ApiOne(例如Accept application/vnd.apione.v1+json
)
答案 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资源。