Slim如何用于组合多个REST请求?

时间:2017-08-15 16:43:30

标签: php rest slim

我有一个页面,它使用相同的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);
});

1 个答案:

答案 0 :(得分:1)

也许组合请求并不是您尝试实现的最佳描述,因为我认为我们实际上不能组合 HTTP请求。如果您想使用POST方法,这可能会更容易,但是,要使用GET方法实现此目的,您可能需要的路径模式可用于返回user的多个组合, 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);

});

此路由将始终返回包含usersrolesdepartments键的结果,但如果调用者不需要其中任何一个键,则这些键可能包含空数组,这样就可以了调用者,但调用者必须始终指定他是否不想要任何这些键路由参数的顺序始终相同。例如,可以访问https://rest.api.com/user:false/role:true/department:100以获取忽略用户( / user:false )的结果,角色列表( / role:true )和部门subdept=100 / deptartment:100 )。

更复杂的模式可能会对您有所帮助,但一般的想法是定义一个路由模式,该模式可以确定用户想要的可用个别端点的组合并根据该模式返回结果。