【问题标题】:Slim - modify POST request body inside middlewareSlim - 修改中间件内的 POST 请求正文
【发布时间】:2017-12-15 18:58:12
【问题描述】:

我的 API 使用 Slim v3the json schema validator by justinrainbow。我想做但不能上班的是:

  • 在中间件中:使用默认值验证传入的 json。这会产生一个修改过的对象
  • 将修改后的对象写回请求中,以便核心控制器对其进行处理

我失败的是:

# inside middleware:
$requestbody = $request->getBody();
$requestobject = json_decode($requestbody);
# validation and modification of $requestobject takes place here
$request->getBody()->write(json_encode($requestobject));
$request->reparseBody();
return $next($request, $response);

从那时起,请求正文就是null。我究竟做错了什么?我很确定我修改 Slim 对象的方式有问题,因为当我手动尝试 $request->getBody()->write('{"some": "content"}') 时它也不起作用。

【问题讨论】:

    标签: rest slim jsonschema


    【解决方案1】:

    解决方案是withParsedBody()

    # inside middleware:
    $requestbody = $request->getBody();
    $requestobject = json_decode($requestbody);
    
    # validation and modification of $requestobject takes place here
    
    $request = $request->withParsedBody($requestobject);
    return $next($request, $response);
    

    它完全用修改后的对象覆盖了请求正文,就像我需要的那样。您需要注意的事项:

    • 从那时起,请求将包含一个已解析的对象作为正文,并且在调用 $request->getParsedBody() 时,如果我正确理解源代码,它将不会被重新解析
    • 在调用 $request->getParsedBody() 时,如果正文是 JSON,通常会得到一个关联数组,但使用上面的 sn-p,解析后的正文将是一个对象。

    愿sn-p以后对用户有所帮助。

    【讨论】:

      【解决方案2】:

      您的代码将请求的正文替换为新数据, 您必须创建一个新请求,其中包含带有新数据的先前正文

      您可以使用 withAttribute 方法将参数传递给中间件的内部路由 你的代码会是这样的

      # inside middleware:
      $requestbody = $request->getBody();
      $requestobject = json_decode($requestbody);
      # validation and modification of $requestobject takes place here
      $request=$request->withAttribute(Your Key-Values parms );
      return $next($request, $response);
      

      【讨论】:

      • 用新数据替换请求正文正是我需要做的。问题:它实际上并没有这样做,它只是将正文设置为null
      • 这样就可以使用withAttribute来发送参数了
      • 这根本不起作用;设置属性似乎不会以任何方式修改请求正文
      猜你喜欢
      • 2015-03-20
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      相关资源
      最近更新 更多