Corpo do Fosrestbundle vazio quando solicitação de várias partes
No código abaixo, espero que o$request->getContents()
para obter o conteúdo corporal doHTTP
solicitação. Ao enviar uma solicitação que não seja de várias partes, isso funciona como esperado, embora ao usar solicitações de várias partes, o$body
A variável permanece vazia.
public function postDebugAction(Request $request) {
$body = $request->getContent();
if (empty($body)) {
throw new \Exception('Body empty.');
}
return $this->view(array(), 201);
}
Depois de leresta pergunta e resposta Eu adicionei um ouvinte corporal também.
<?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));
}
}
De acordo com o meu teste PHPUnit, isso estava funcionando embora ao usarPostman
eAdvanced Rest Client
para simular a solicitação, o corpo parece estar vazio novamente. Eu verifiquei isso duas vezes para executar as solicitações simuladas como PHPUnit com o depurador. O resultado é que, de fato, o corpo está vazio quando simulado através de um cliente Rest e não vazio quando executado no PHPUnit.
O caso de teste que eu usei:
URL do POST:
http://localhost/EntisServer/web/app_dev.php/api2/debug
Cabeçalhos:
Authorization: Bearer ZGYzYjY1YzY4MGY3YWM3OTFhYTI4Njk3ZmI0NmNmOWZmMjg5MDFkYzJmOWZkOWE4ZTkyYTRmMGM4NTE1MWM0Nw
Content-Type: multipart/form-data; boundary=-----XXXXX
Conteúdo:
-----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--
ATUALIZAR Eu não sabia se havia passado pelo depurador sem usar oBodyListener
. Quando eu fiz o resultado é exatamente o mesmo. Então, sem oBodyListener
o caso PHPUnit obtém o corpo, embora a solicitação simulada ainda esteja vazia.