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

Slim - modify POST request body inside middleware

我正在为我的 API 使用 Slim v3 and the json schema validator by justinrainbow。我想做但无法开始工作的是:

我失败的是:

# 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"}') 时它也不起作用。

您的代码用新数据替换了请求的主体, 您必须创建一个新请求,将先前的正文包含在新数据中

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

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

希望该代码段将来对用户有所帮助。