rest - Slim - 修改中间件内的 POST 请求正文

标签 rest slim jsonschema

我正在使用 Slim v3the json schema validator by justinrainbow对于我的 API。我想做但无法上类的是:

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

  • 我失败的是:
    # 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"}')以及。

    最佳答案

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

  • 愿该片段将来对用户有所帮助。

    关于rest - Slim - 修改中间件内的 POST 请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45039193/

    相关文章:

    javascript - NodeJS Ajv 模块总是记录消息 ' $ref: keywords ignored in schema at path "#"'

    Angular CLI - 为现在部署设置生产代理

    php - Slim 缺少闭合

    php - Slim v3 重复缓存控制 header

    javascript - 如何路由我的 Angular 2 应用程序以便使用我自己的 Slim Framework API?

    java - 使用 Jackson 从 POJO 数组生成 JSON 模式

    python - jsonschema 如何将原始 json 字符串值映射到 python 对象?

    java - Spring REST 模板接受 header

    java - RestTemplate.exchange() DELETE 删除请求正文

    multithreading - 在Java中的RESTful Web服务上使用线程