应该如何使用 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=]、roledepartment 根据来电者的要求。

为了简单起见,假设 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 结果包括 usersrolesdepartments 键,但如果调用者不想要任何这些键,这些键可能包含空数组作为值其中,这取决于调用者,但调用者 必须始终指定他是否不需要这些键中的任何一个 路由参数的顺序始终相同。例如,可以访问 https://rest.api.com/user:false/role:true/department:100 以获得忽略用户的结果 (/user:false),角色列表 (/role:true) 和部门 subdept=100 (/deptartment:100).

更复杂的模式可能对您有所帮助,但总体思路是定义一个路由模式,该模式可以确定用户想要和return可用的各个端点的组合结果基于此。