首页 > 解决方案 > JSON 在响应上被垃圾稀释

问题描述

我使用 Symfony 5.2。(作曲家更新完成)

PHP 7.4

带有 PHP + NGINX 反向代理 Docker 容器的 Docker 容器。

有一个问题,就是控制器给出了一个无效的 JSON 响应。

但是问题发生在产品上,而不是本地。并不是每个答案都带有损坏的 JSON,而是周期性的,我无法猜测,可能是第三次,或者可能是第 5 次,或者第 7 次,但不断。控制器本身接收一个 JSON 字符串作为参数,并输出一个 JSON 字符串作为输出 (new JsonResponse($data))。

这是控制器的参数

{order: "22", productType: "2", productId: "64"}

这是控制器最终应该放弃的东西

{"order":22,"count":1,"price":5000,"currency":"RUB","cart":[{"id":923,"order":22,"productType":2,"productId":64,"count":1,"created":{"date":"2021-02-03 19:06:39.634912","timezone_type":3,"timezone":"UTC"}}]}

这就是真正给

{"order":"22","product_type":"2","product_id":"64"}{"order":22,"count":1,"price":5000,"currency":"RUB","cart":[{"id":923,"order":22,"productType":2,"productId":64,"count":1,"created":{"date":"2021-02-03 19:06:39.634912","timezone_type":3,"timezone":"UTC"}}]}

也就是说,我的参数被添加到 JSON 响应的开头。注意垃圾字符串后面没有逗号,垃圾字符串中的索引看起来像snake_case,尽管其他所有内容都像camelCase

一开始,我以为可能是在 NGINX 中,但那里一切正常。我使用了 tcpdump 实用程序来检查究竟是什么给了 Symfony 的 PHP 容器。并且有损坏的 JSON。

我还保存在序列化数组的日志数据中,但在日志中一切正常。

  1. 我在new JsonResponse()之前写入日志,一个有效的数组被写入没有垃圾。

  2. 我为优先级为 -10000 的 Response 事件创建了 EventListener(以便最后调用它),并且在其中我还将结果响应写入日志,并且有一个有效的 JSON

  3. 我是在主文件public/index.php之前脚本的响应,我也把它的响应写到日志里,还有一个有效的没有垃圾的JSON

告诉我我该如何解决?

/**
 * @Route("/add-product-to-cart", name="add_product_to_cart", methods={"POST"})
 *
 * @param Request         $request
 * @param OrderProvider   $orderProvider
 * @param LoggerInterface $logger
 * @return JsonResponse
 */
public function addProductToCart(Request $request, OrderProvider $orderProvider, LoggerInterface $logger): JsonResponse
{
    $data = json_decode($request->getContent(), true);
    try {
        $cart = $orderProvider
            ->order($data['order'])
            ->addProduct($data['product_type'], $data['product_id'], $data['count'] ?? 1)
            ->cartsAsArray()
        ;

        $result = [
            'order' => $orderProvider->orderId(),
            'count' => $orderProvider->count(),
            'price' => $orderProvider->price(),
            'currency' => $orderProvider->currency()->getCode(),
            'cart' => $cart,
        ];

        // Тут пишу в лог массив. Там все чтеко !!!
        $logger->error('Server return: ' . json_encode($result));
        
        return new JsonResponse($result);
    } catch (\Exception $e) {
        $logger->error($e->getMessage());
    }

    return new JsonResponse([
        'error' => 1,
        'message' => $e->getMessage(),
    ]);
}

标签: phpjson

解决方案


推荐阅读