【问题标题】:Changing GET to POST in Middleware - SLIM Framework 3在中间件中将 GET 更改为 POST - SLIM Framework 3
【发布时间】:2018-10-23 13:25:20
【问题描述】:

我正在使用 SLIM FRAMEWORK 3 开发 Rest API,我需要检查 GET 调用是否返回中间件中的特定数据。如果没有返回数据,我需要先用 POST 方法重新调用,将数据写入 API,然后继续 $next()。

我尝试了 withRedirect(),但它似乎只适用于 GET。有没有办法做到这一点?谢谢。

<?php

$app->add(function($req, $res, $next){
$uri = $req->getUri()->getPath();

//get query_string params
$params = $req->getUri()->getQuery();
parse_str($params, $args);

//check if is desired route...
if($req->isGet() && isset($args['name']) && isset($args['borndate']) && $uri == 'api/v1/example'){
    global $app;

    //try to get data from DB 
    $dados_mapa = (new App\Models\MyExampleModel())->get()
            ->where('name', '=', $args['name'])
            ->where('borndate', '=', $args['borndate'])
            ->first();

    //check data
    if(isset($dados_mapa->id))
    {
        //data exists, continue
        return $next($req, $res);

    }else{

        //no data, I need to do a POST call here...
        $new_post_uri = 'api/v1/example';

        doPostHere($new_post_uri); ////how to make this POST?

        //continue with the first call
        return $next($req, $res);

    }

  }

});

【问题讨论】:

  • 如果您希望中间件仅适用于某些路由,则无需将其添加到 $app。将中间件添加到路由本身。
  • 这听起来像是客户端应该做的事情,而不是你的服务器;还有中间件发出 POST 请求 - 听起来很可疑。
  • @ZamronyP.Juhara 谢谢。你是对的!
  • @zedling 谢谢。也许我必须改变它,真的。

标签: routes slim middleware slim-3


【解决方案1】:

要回答您的问题,请使用Guzzle 发出 POST 请求,因为您想进行新的 HTTP 调用,而 Guzzle 是一个相当不错的 PHP HTTP 客户端。

但是,请注意,这是一种特别糟糕的模式,您不应该这样做。 GET 不应该有副作用,创建新数据肯定是副作用!

更好的模式是在数据不存在时返回 4xx 错误,然后让客户端执行 POST 请求来创建它。

【讨论】:

  • 我完全同意。
  • 谢谢。这些是非常有用的提示。我会重新考虑逻辑(但有趣的是,在这些情况下 Guzzle 是一个选项)
猜你喜欢
  • 2017-06-18
  • 2022-08-03
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多