如何设置一个post方法,使其只能接受url编码的请求?

时间:2018-12-27 13:46:30

标签: php slim slim-3

我正在使用php的苗条框架开发Web RESTFul API。我想知道如何限制某些post方法,使其只能接受URL编码的请求参数。在这方面请帮助我。 / p>

2 个答案:

答案 0 :(得分:0)

对此没有预编程的方法-没有Slim或php方法可以确定地检查您的字符串是否经过urlencoded。您可以做的就是在您的路由中实现Slim中间件。

<?php
$app = new \Slim\App();

$mw = function ($request, $response, $next) {
    if ( urlencode(urldecode($data)) === $data){
      $response = $next($request, $response);
    } else {
      $response = ... // throw error
    }

    return $response;
};

$app->get('/', function ($request, $response, $args) { // Your route
    $response->getBody()->write(' Hello ');

    return $response;
})->add($mw); // chained middleware

$app->run();

讨论:Test if string is URL encoded in PHP

中间件:https://www.slimframework.com/docs/v3/concepts/middleware.html

答案 1 :(得分:0)

由于您使用Slim作为API的基础,所以最简单的方法是仅使用定义的所需URL参数构建GET路由:

$app->get('/users/filter/{param1}/{param2}/{param3}', function (Request $request, Response $response) {
    // Route actions here
});

在您的文档中,请确保您将此API告知使用者,它是GET端点,因此不应创建POST正文;相反,应该使用您在URL中概述的参数将客户端的数据传递到API。

如果您打算仅使用URL参数使用POST路由,那么如果该路由检测到传入的POST正文,也可以强制返回响应:

$app->post('/users/filter/{param1}/{param2}/{param3}', function (Request $request, Response $response) {

    $postBody = $request->getParsedBody();

    if (is_array($postBody)) {

        $denyMsg = "This endpoint does not accept POST body as a means to transmit data; please refer to the API documentation for proper usage.";
        $denyResponse = $response->withJson($denyMsg, $status = null, $encodingOptions = 0);

        return $profileData;

    }
});