如何在单个 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 资源。
假设我们确实有 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 资源。