Slim - 修改中间件内的 POST 请求体
Slim - modify POST request body inside middleware
我正在为我的 API 使用 Slim v3 and the 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"}')
时它也不起作用。
您的代码用新数据替换了请求的主体,
您必须创建一个新请求,将先前的正文包含在新数据中
你可以使用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,您通常会得到一个关联数组,但是使用上面的代码片段,解析的主体将是一个对象。
希望该代码段将来对用户有所帮助。
我正在为我的 API 使用 Slim v3 and the 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"}')
时它也不起作用。
您的代码用新数据替换了请求的主体, 您必须创建一个新请求,将先前的正文包含在新数据中
你可以使用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,您通常会得到一个关联数组,但是使用上面的代码片段,解析的主体将是一个对象。
希望该代码段将来对用户有所帮助。