修剪 - 修改中间件内的POST请求体

时间:2017-07-11 15:48:24

标签: rest slim jsonschema

我正在使用Slim v3the json schema validator by justinrainbow作为我的API。我想要做的只是不能上班的是:

    中间件中的
  • :使用默认值验证传入的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"}')时它不起作用。

2 个答案:

答案 0 :(得分:4)

解决方案是 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,你通常会得到一个关联数组,但是使用上面的代码片段,解析后的正文将成为一个对象。

该片段可能会在将来对用户有所帮助。

答案 1 :(得分:0)

您的代码用新数据替换请求的主体, 您必须创建一个新请求包含具有新数据的上一个正文

您可以使用 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);