Fosrestbundle Körper leer, wenn mehrteilige Anfrage

m Code unten erwarte ich das$request->getContents(), um den Inhalt des @ zu erhaltHTTP Anfrage. Wenn Sie eine nicht mehrteilige Anfrage senden, funktioniert dies wie erwartet, wenn Sie jedoch mehrteilige Anfragen verwenden, wird das$body Variable bleibt leer.

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

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


    return $this->view(array(), 201);
}

Nach dem LesenDie Frage und Antwort Ich habe auch einen Body-Listener hinzugefügt.

<?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));
    }

}

aut meinem PHPUnit-Test funktionierte dies jedoch bei Verwendung vonPostman undAdvanced Rest Client um die Anfrage zu simulieren, scheint der Body wieder leer zu sein. Ich habe dies doppelt überprüft, um beide Simulationsanforderungen als PHPUnit mit dem Debugger auszuführen. Das Ergebnis ist, dass der Body tatsächlich leer ist, wenn er über einen Rest-Client simuliert wird, und nicht leer, wenn er über PHPUnit ausgeführt wird.

Der Testfall, den ich benutzt habe:

POST-URL:

http://localhost/EntisServer/web/app_dev.php/api2/debug

Headers:

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

Inhalt

-----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--

AKTUALISIERE Ich war mir nicht sicher, ob ich durch den Debugger gegangen bin, ohne das @ zu verwendeBodyListener. Als ich das gemacht habe, ist das Ergebnis genau das gleiche. Also, ohne dasBodyListener Der PHPUnit-Fall ruft den Text ab, obwohl die simulierte Anforderung noch leer ist.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage