Php 当多部分请求时,Fosrestbundle主体为空

Php 当多部分请求时,Fosrestbundle主体为空,php,rest,symfony,phpunit,fosrestbundle,Php,Rest,Symfony,Phpunit,Fosrestbundle,在下面的代码中,我希望$request->getContents()获得HTTP请求的主体内容。当发送非多部分请求时,这与预期一样有效,尽管在使用多部分请求时,$body变量保持为空 public function postDebugAction(Request $request) { $body = $request->getContent(); if (empty($body)) { throw new \Exception('Body empty.'

在下面的代码中,我希望
$request->getContents()
获得
HTTP
请求的主体内容。当发送非多部分请求时,这与预期一样有效,尽管在使用多部分请求时,
$body
变量保持为空

public function postDebugAction(Request $request) {
    $body = $request->getContent();

    if (empty($body)) {
        throw new \Exception('Body empty.');
    }


    return $this->view(array(), 201);
}
在阅读了问答之后,我还添加了一个身体倾听者

<?php

namespace VSmart\ApiBundle\Listener;

use FOS\RestBundle\EventListener\BodyListener as BaseBodyListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use FOS\RestBundle\Decoder\DecoderProviderInterface;

class BodyListener extends BaseBodyListener {

    /**
     * @var DecoderProviderInterface
     */
    private $decoderProvider;

    /**
     * @param DecoderProviderInterface $decoderProvider Provider for fetching decoders
     */
    public function __construct(DecoderProviderInterface $decoderProvider) {
        $this->decoderProvider = $decoderProvider;
    }

    /**
     * {@inheritdoc}
     */
    public function onKernelRequest(GetResponseEvent $event) {
        $request = $event->getRequest();

        if (strpos($request->headers->get('Content-Type'), 'multipart/form-data') !== 0) {
            return;
        }

        $format = 'json';

        if (!$this->decoderProvider->supports($format)) {
            return;
        }

        $decoder = $this->decoderProvider->getDecoder($format);
        $iterator = $request->request->getIterator();
        $request->request->set($iterator->key(), $decoder->decode($iterator->current(), $format));
    }

}
标题:

Authorization: Bearer ZGYzYjY1YzY4MGY3YWM3OTFhYTI4Njk3ZmI0NmNmOWZmMjg5MDFkYzJmOWZkOWE4ZTkyYTRmMGM4NTE1MWM0Nw
Content-Type: multipart/form-data; boundary=-----XXXXX
内容:

-----XXXXX
Content-Disposition: form-data; name="json"
Content-Type: application/json; charset=utf-8

{
    "blabla": 11
}

-----XXXXX
Content-Disposition: form-data; name="q_3101"; filename="image.jpg"
Content-Type: image/jpeg

contents of a file...

-----XXXXX--
更新
我不确定是否在没有使用
BodyListener
的情况下通过了调试器。当我做的时候,结果是完全一样的。因此,如果没有
BodyListener
,PHPUnit案例将获得body,尽管模拟请求仍然为空

请参见php.net上的
php://
wrappers:

注意:在PHP5.6之前,使用php://input 只能读一次;该流不支持seek操作。但是,根据SAPI实现,可能会打开另一个php://input 流并重新开始读取。只有在已保存请求正文数据的情况下,才能执行此操作。通常,POST请求是这种情况,但其他请求方法(如PUT或PROPFIND)则不是这种情况


因此,请更新您的PHP版本或确保只读取一次输入。

fos\u rest.decoder\u provider
解码后,您可以在
$request->files->all()
中找到上载的文件

-----XXXXX
Content-Disposition: form-data; name="json"
Content-Type: application/json; charset=utf-8

{
    "blabla": 11
}

-----XXXXX
Content-Disposition: form-data; name="q_3101"; filename="image.jpg"
Content-Type: image/jpeg

contents of a file...

-----XXXXX--