Тело Fosrestbundle пусто при многочастном запросе
В коде ниже я ожидаю$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));
}
}
Согласно моему тесту PHPUnit это работало, хотя при использованииPostman
а такжеAdvanced Rest Client
для имитации запроса тело кажется снова пустым. Я дважды проверил это, чтобы запустить оба имитирующих запроса как PHPUnit с отладчиком. Результатом является то, что, действительно, тело пусто при моделировании через клиент Rest и не пусто при запуске через PHPUnit.
Тестовый пример, который я использовал:
POST URL:
http://localhost/EntisServer/web/app_dev.php/api2/debug
Заголовки:
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 получает тело, хотя моделируемый запрос все еще пуст.