Tuto Créez une API REST avec Symfony 3 - Method PUT

a marqué ce sujet comme résolu.

Bonjour,

Dans le tuto de BestCoder (qui est au passage est juste génial), je rencontres un soucis lors de l’implémentation de la méthode PUT.

Le gros du controller fonctionne bien, mais il reste un problème lors de l’envoi des data via Postman.

Je dois envoyer les data en x-www-form-url-encode ou raw (directement formatées en json) afin que celles-ci soient interceptables dans la Request Symfony, en form-data ça ne fonctionne pas :( (bien que cela fonctionne avec la method POST). Donc oui, au final je pourrais utiliser x-www-form-url-encode ou raw, mais comment passer une mise à jour de fichier sur un update ?

Merci par avance

Salut,

Tu parles bien de multipart/form-data et de application/x-www-form-urlencoded ? Fais attention à bien préciser multipart/form-data, à la limite ne met que multipart, mais ne met pas form-data tout seul parce que ça ne veut rien dire.

Note que normalement, tu n’as pas à utiliser multipart/form-data sauf si tu veut envoyer des données binaires (typiquement un upload d’image ou autre).

Oui effectivement, je parle bien du multipart/form-data, et cela va poser problème lors d’une mise à jour d’une image (par exemple).

En fouillant un peu dans le HttpFoundation/Request.php sur la méthode createFormGlobals, on peut voir qu’il y a quelques soucis… mais ça ne m’aide pas trop ;)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static function createFromGlobals()
    {
        // With the php's bug #66606, the php's built-in web server
        // stores the Content-Type and Content-Length header values in
        // HTTP_CONTENT_TYPE and HTTP_CONTENT_LENGTH fields.
        $server = $_SERVER;
        if ('cli-server' === PHP_SAPI) {
            if (array_key_exists('HTTP_CONTENT_LENGTH', $_SERVER)) {
                $server['CONTENT_LENGTH'] = $_SERVER['HTTP_CONTENT_LENGTH'];
            }
            if (array_key_exists('HTTP_CONTENT_TYPE', $_SERVER)) {
                $server['CONTENT_TYPE'] = $_SERVER['HTTP_CONTENT_TYPE'];
            }
        }

        $request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $server);

        if (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
            && in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH'))
        ) {
            parse_str($request->getContent(), $data);
            $request->request = new ParameterBag($data);
        }

        return $request;
    }

Il reste toutefois la possibilité de forcer la méthode en POST et d’ajouter le param _method=PUT mais je ne suis pas super fan de cette solution :/

+0 -0

Salut,

Avec FOSRestBundle, tu peux utiliser la méthode raw et choisir du JSON. Il y a un listener de FOSREstBundle (le body listener) qui transformera les données pour toi.

Par contre, si tu veux envoyer des images, il y a un bug connu qui rend impossible l’utilisation de la méthode PUT (https://github.com/symfony/symfony/issues/9226).

Cordialement.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte