【问题标题】:How to handle correctly JSON request in symfony?如何在 symfony 中正确处理 JSON 请求?
【发布时间】:2018-04-01 16:37:48
【问题描述】:

我正在尝试处理这个问题: 我的应用程序发送 JSON POST 请求,其中包含在 Json 中编码的多个信息。示例:

{"UserInfoA":{"1":123,"2":"hello","3":"bye","4":{"subinfo":1,"subinfo2":10}},
 "UserInfoB":{"a":"12345678","b":"asd"}} // and so on...

每个 UserInfo 都有:

  • 它自己的实体(尽管某些请求可能包含多个实体的信息)。
  • 控制器将此对象持久保存在 DB 上,然后返回此 DB 上的 ID。

所以,为了解决这个问题,我做了另一个控制器,比如 JsonHandler,它接收这个请求,然后在把这个 JSON 转换成不同的对象后转发给每个控制器。示例:

public function getJson (Request $request){
    if (0 === strpos($request->headers->get('Content-Type'), 'application/json')) {
                $data = json_decode($request->getContent(), true);
            }
    if (!isset($data['UserInfoA'])){
         return new JsonResponse('ERROR');
              }
    $uia = $data['UserInfoA'];
    $idInfoA = $this->forward('Path::dataAPersist',array('data'=>$uia));
        }
    // same with userinfoB and other objects
    return $idInfoA ;

这很完美,但它正确吗?我应该改用服务吗?

编辑:我需要在 Json 中响应 ID,并且 this->forward 返回一个响应,所以我不能使用 JsonResponse,如果直接发送 $idInfoA 只是发送 IDNUMBER 而不是 JSON,我该怎么做吗?

总结:一个Json监听器,接收信息,处理它,然后分派到相应的控制器。这个监听器,应该是控制器、服务还是其他东西?

【问题讨论】:

  • 嗯,这太宽泛了。你应该改写这个问题。清楚地描述你希望你的代码做什么。
  • 我想要一个模块来处理 JSON 请求,然后将每个对象(在处理 JSON 请求后获得)发送到已经存在的控制器来处理这个对象并保存在数据库中。所以我制作了另一个控制器,它有 getJson 方法来执行此操作,然后在每个控制器中调用相应的方法。
  • 例如看看 Symfony Serializer、JMS 和 FOS RestBundle

标签: php json symfony service forward


【解决方案1】:

我建议使用symfony-bundles/json-request-bundle,因为它会为您执行 JsonRequestTransformerListener。你只需要像往常一样接收请求参数:

...
$request->get('some_parameter');
...

【讨论】:

  • 就是这样
【解决方案2】:

您好,您必须使用服务进行转换

类 php

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class JsonRequestTransformerListener {


public function onKernelRequest(GetResponseEvent $event) {
    $request = $event->getRequest();
    $content = $request->getContent();
    if (empty($content)) {
        return;
    }
    if (!$this->isJsonRequest($request)) {
        return;
    }
    if (!$this->transformJsonBody($request)) {
        $response = Response::create('Unable to parse request.', 400);
        $event->setResponse($response);
    }
}


private function isJsonRequest(Request $request) {
    return 'json' === $request->getContentType();
}


private function transformJsonBody(Request $request) {
    $data = json_decode($request->getContent(), true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        return false;
    }
    if ($data === null) {
        return true;
    }
    $request->request->replace($data);
    return true;
}
 }

在您的服务中

    kernel.event_listener.json_request_transformer:
    class: You\NameBundle\Service\JsonRequestTransformerListener
    tags:
        - { name: "kernel.event_listener", event: "kernel.request",method: "onKernelRequest", priority: "100" }

现在您可以调用默认请求函数来获取数据

$request->request->all();

【讨论】:

    【解决方案3】:

    您可以使用symfony ParamConverterjson 转换为您想要的任何对象,并在出现任何问题时引发有意义的Exception

    您可以添加自定义ParamConverters 并在您的操作中使用它们annotation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多