应该如何使用 Slim 来组合多个 REST 请求?
How should Slim be used to combine multiple REST requests?
我有一个页面使用相同的 HTTP 方法向 API 发出多个请求并显示结果。
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_URL, "https://rest.api.com/staff");
$staff=curl_exec( $ch );
curl_setopt($ch, CURLOPT_URL, "https://rest.api.com/departments/accounting");
$departments=curl_exec( $ch );
curl_setopt($ch, CURLOPT_URL, "https://rest.api.com/roles");
$roles=curl_exec( $ch );
curl_close($ch);
echo $twig->render('offices.html', ['staff'=>$staff,'departments'=>$departments,'roles'=>$roles]);
API 位于 https://rest.api.com,由我控制。这三个端点有时需要单独访问,因此必须保留。
<?php
$app = new \Slim\App();
$app->get('/users', function ($request, $response, $args) {
return $response->withJson(getUsers(),200);
});
$app->get('/departments/{subdept}', function ($request, $response, $args) {
return $response->withJson(getDepartments($args['subdept']),200);
});
$app->get('/roles', function ($request, $response, $args) {
return $response->withJson(getRoles(),200);
});
// other endpoints...
$app->run();
如何将三个请求合并为一个请求?我不想做类似下面的事情,因为它不灵活并且需要为每个组合端点提供额外的文档。
$app->get('/users_and_departments_and_roles', function ($request, $response, $args) {
return $response->withJson([
'users'=>getUsers(),
'departments'=>getDepartments($args['subdept']),
'roles'=>getRoles()
],200);
});
也许 合并请求 并不是对您要实现的目标的最佳描述,因为我认为我们实际上无法 合并 HTTP 请求。如果您想使用 POST
方法,这可能会更容易,但是,要使用 GET
方法实现此目的,您可能需要一个路由模式,它可用于 return [=] 的多个组合13=]、role
和 department
根据来电者的要求。
为了简单起见,假设 subdept
只接受数值,这里有一个例子来表达我对解决方案的总体想法:
$app->get('/api/combine/user:{users_required:true|false}/role:{roles_require:true|false}/department:{subdept:[0-9]+|false}', function ($req, $res, $args) {
return $res->withJson([
'users'=> $args['users_required'] == 'true' ? getUsers() : [],
'departments'=> $args['subdept'] == 'false' ? [] : getDepartments($args['subdept']),
'roles'=> $args['roles_required'] == 'true' ? getRoles() : []
],200);
});
此路由将始终 return 结果包括 users
、roles
和 departments
键,但如果调用者不想要任何这些键,这些键可能包含空数组作为值其中,这取决于调用者,但调用者 必须始终指定他是否不需要这些键中的任何一个 和 路由参数的顺序始终相同。例如,可以访问 https://rest.api.com/user:false/role:true/department:100
以获得忽略用户的结果 (/user:false),角色列表 (/role:true) 和部门 subdept=100
(/deptartment:100).
更复杂的模式可能对您有所帮助,但总体思路是定义一个路由模式,该模式可以确定用户想要和return可用的各个端点的组合结果基于此。
我有一个页面使用相同的 HTTP 方法向 API 发出多个请求并显示结果。
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_URL, "https://rest.api.com/staff");
$staff=curl_exec( $ch );
curl_setopt($ch, CURLOPT_URL, "https://rest.api.com/departments/accounting");
$departments=curl_exec( $ch );
curl_setopt($ch, CURLOPT_URL, "https://rest.api.com/roles");
$roles=curl_exec( $ch );
curl_close($ch);
echo $twig->render('offices.html', ['staff'=>$staff,'departments'=>$departments,'roles'=>$roles]);
API 位于 https://rest.api.com,由我控制。这三个端点有时需要单独访问,因此必须保留。
<?php
$app = new \Slim\App();
$app->get('/users', function ($request, $response, $args) {
return $response->withJson(getUsers(),200);
});
$app->get('/departments/{subdept}', function ($request, $response, $args) {
return $response->withJson(getDepartments($args['subdept']),200);
});
$app->get('/roles', function ($request, $response, $args) {
return $response->withJson(getRoles(),200);
});
// other endpoints...
$app->run();
如何将三个请求合并为一个请求?我不想做类似下面的事情,因为它不灵活并且需要为每个组合端点提供额外的文档。
$app->get('/users_and_departments_and_roles', function ($request, $response, $args) {
return $response->withJson([
'users'=>getUsers(),
'departments'=>getDepartments($args['subdept']),
'roles'=>getRoles()
],200);
});
也许 合并请求 并不是对您要实现的目标的最佳描述,因为我认为我们实际上无法 合并 HTTP 请求。如果您想使用 POST
方法,这可能会更容易,但是,要使用 GET
方法实现此目的,您可能需要一个路由模式,它可用于 return [=] 的多个组合13=]、role
和 department
根据来电者的要求。
为了简单起见,假设 subdept
只接受数值,这里有一个例子来表达我对解决方案的总体想法:
$app->get('/api/combine/user:{users_required:true|false}/role:{roles_require:true|false}/department:{subdept:[0-9]+|false}', function ($req, $res, $args) {
return $res->withJson([
'users'=> $args['users_required'] == 'true' ? getUsers() : [],
'departments'=> $args['subdept'] == 'false' ? [] : getDepartments($args['subdept']),
'roles'=> $args['roles_required'] == 'true' ? getRoles() : []
],200);
});
此路由将始终 return 结果包括 users
、roles
和 departments
键,但如果调用者不想要任何这些键,这些键可能包含空数组作为值其中,这取决于调用者,但调用者 必须始终指定他是否不需要这些键中的任何一个 和 路由参数的顺序始终相同。例如,可以访问 https://rest.api.com/user:false/role:true/department:100
以获得忽略用户的结果 (/user:false),角色列表 (/role:true) 和部门 subdept=100
(/deptartment:100).
更复杂的模式可能对您有所帮助,但总体思路是定义一个路由模式,该模式可以确定用户想要和return可用的各个端点的组合结果基于此。