Axios: Application d'envoi PUT et PATCH/données codées x-www-form-urlen

Créé le 3 août 2015  ·  36Commentaires  ·  Source: axios/axios

Utilisation de 0.5.4

J'essaie d'utiliser des axios sur mon front-end et du carburant sur le back-end. Fuel Input::patch('param') me donnera les données de la demande de formulaire de type patch. Ceci est également vrai pour PUT. Peut-être aussi POST aso

Lorsque j'utilise axios, les données sont vides et si j'utilise jquery, j'obtiens très bien mes données.

        $.ajax({
            method: "PATCH",
            url: URL,
            data: {
                'firstname': this.state.account.firstname,
                'surname': this.state.account.surname,
            }
        })
        .done(function( msg ) {
            console.log(msg);
        });
        axios.patch(URL, {
                'firstname': this.state.account.firstname,
                'surname': this.state.account.surname,
            })
            .then((response) => {
                   console.log(response);
            });

La différence est que si vous regardez les outils de développement Chrome, jquery envoie les données en tant que formData et axios envoie les données en tant que charge utile de requête json.

Commentaire le plus utile

Que diriez-vous d'axios incluant le code de sérialisation mentionné ci-dessus afin qu'un Content-Type de application/x-www-form-urlencoded déclenche le bon encodage lorsqu'un objet est passé ?

axios.post(
  '/foo',
  { some: 'data' },
  { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
);

… devrait fonctionner hors de la boîte IMHO. Ou est-ce que je rate quelque chose ?

Tous les 36 commentaires

J'ai essayé d'utiliser formData mais cela est toujours envoyé comme une balise body dans chrome et non comme formData.

En-têtes

PUT /url/path HTTP/1.1
Host: hostname
Connection: keep-alive
Content-Length: 1234
User-Agent: Mozilla/5.0 
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryJsCvT2m1SBzbA23B
Accept: application/json, text/plain, */*
Referer: URL
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

Charge utile

Content-Disposition: form-data; name="firstname"

Daniel
------WebKitFormBoundaryJsCvT2m1SBzbA23B
Content-Disposition: form-data; name="surname"

Persson

À la place de

En-têtes

PUT /url/path HTTP/1.1
Host: hostname
Connection: keep-alive
Content-Length: 1234
Accept: */*
Origin: http://adminhost
User-Agent: Mozilla/5.0
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: URL
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

Données de formulaire

firstname=Daniel&surname=Persson

Si cela ne devrait pas être standard, je pense que cela devrait au moins être une option à envoyer en tant que données de formulaire.

J'ai fait un petit travail pour résoudre le problème pour moi.

      config['transformRequest'] = [function (data, headers) {
        var str = [];
        for(var p in data)
          if (data.hasOwnProperty(p) && data[p]) {
            str.push(encodeURIComponent(p) + "=" + encodeURIComponent(data[p]));
          }
        return str.join("&");
      }];

J'ai rencontré cela aussi, merci pour la solution de contournement :+1:

@kalaspuffar sommes-nous d'accord pour fermer ça ?

@mzabriskie

Salut.

Je ne travaille actuellement pas sur le projet en utilisant axios, donc je ne peux pas vérifier si la nouvelle version résout le problème, mais la solution de contournement fonctionne bien pour nous pour le moment.

Si le problème est résolu, fermez. Si ce n'est pas le cas, documentez peut-être une solution de contournement afin que les autres n'aient pas à rechercher ce message.

Mais ça ne me dérange pas de fermer le sujet.

Meilleures salutations
Daniel

Que diriez-vous d'axios incluant le code de sérialisation mentionné ci-dessus afin qu'un Content-Type de application/x-www-form-urlencoded déclenche le bon encodage lorsqu'un objet est passé ?

axios.post(
  '/foo',
  { some: 'data' },
  { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }
);

… devrait fonctionner hors de la boîte IMHO. Ou est-ce que je rate quelque chose ?

:+1 : pour prendre en charge x-www-form-urlencoded lorsque les en-têtes sont définis

+1

Juste un peu d'art antérieur à ajouter ici. La bibliothèque de requêtes utilise différentes clés pour body , form (urlencodé, ce dont nous parlons ici) et formData (téléchargements de formulaires en plusieurs parties). Cela oblige l'utilisateur à savoir que ceux-ci doivent être différents et à faire un choix. J'aimerais qu'axios choisisse simplement une valeur par défaut raisonnable basée sur le type de contenu, mais cela pourrait être un changement radical si quelqu'un s'appuie sur l'ancienne implémentation.

@jimthedev Vous avez peut-être raison d'avoir choisi le mauvais type d'objet de données.

Mais ce que j'ai trouvé étrange, c'est qu'un simple GET et POST me donnaient des informations de formulaire simples dans la requête

?ab=CD&ef=gh

en utilisant l'envoi par défaut. Mais PUT et PATCH ont changé la valeur par défaut en données multiparties.

@kalaspuffar Oh je vois. Ouais ça semble étrange.

+1 x-www-formulaire-urlencodé

Agréable

y a-t-il un intérêt à avoir un support de première classe pour le put/post urlencodé intégré dans axios ?

Oui

+1

+1

+1

+1

+1

Je pense que cela devrait être résolu en ajoutant la prise en charge de URLSearchParams . BTW, cela a récemment été implémenté dans fetch : https://github.com/github/fetch/commit/d77810a15c78bbbaf2defd4ea3af6db21c8d117f

Le seul problème est que URLSearchParams n'est pas pris en charge par tous les navigateurs, mais il existe un polyfill.

+1

Content de voir que c'est en cours

axios v0.12.0 prend en charge URLSearchParams qui peut être utilisé pour envoyer les données en tant qu'application/x-www-form-urlencodé depuis le navigateur :

var params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
axios.post('/foo', params); 

Veuillez noter que URLSearchParams n'est pas pris en charge par tous les navigateurs, vous devrez donc peut-être le remplir . (Assurez-vous d'ajouter le polyfill à la portée globale.)

+1 J'en ai vraiment besoin aussi, ce serait formidable si le "urlencodé" pouvait fonctionner à partir d'AXIOS uniquement en fonction du type de contenu.

+1 Il devrait être géré par la bibliothèque. Les paramètres de données doivent être simplement des objets et nous ne voulons pas nous soucier du type de requête dont il s'agit.

+1 a toujours des problèmes avec ça.

+1
J'ai utilisé le polyfill URLSearchParams recommandé. Semble toujours avoir le problème lors de l'utilisation d'IE11.

Éditer:
Le problème a été causé par le clonage de l'objet de configuration axios avant qu'il ne soit transmis à axios pour demande. Si l'objet de configuration contient une instance de URLSearchParams pour les données dans IE11 à l'aide du Polyfill recommandé, l'instance de URLSearchParams dans l'objet cloné n'est pas clonée correctement. Ce n'est tout simplement plus une instance URLSearchParams.

@kalaspuffar amélioration de votre fonction pour analyser également les objets
axios.post(url, { user: { name: 'john' }}, ...) sera encodé comme user[name] = john

function jsonToFormEncoded(data, headers) {
  var str = [];
  for(var p in data){
    if(_.isObject(data[p])){
      var d = data[p];
      for(var o in d){
        if (d.hasOwnProperty(o) && d[o]) {
          str.push(p+'['+encodeURIComponent(o) + "]=" + encodeURIComponent(d[o]));
        }
      }
    }else{
      if (data.hasOwnProperty(p) && data[p]) {
        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(data[p]));
      }
    }
  }
  return str.join("&");
}

Ayant le même problème. En utilisant le middleware OWIN et puisque la requête axios.put envoie du JSON brut, je ne peux pas le gérer correctement.

Toujours des problèmes. Surpris qu'il n'ait pas été corrigé depuis qu'il s'agit d'une fonctionnalité si essentielle ?

+1

Ce truc est vraiment ennuyeux. Avoir à installer un polyfill semble tout simplement trop, Axios devrait s'en occuper de manière transparente. De tels problèmes incitent les gens à rechercher d'autres bibliothèques à la place.

J'utilise cet intercepteur, qui fonctionne assez bien.

Vue.axios.interceptors.request.use((config) => {
    if (config.headers['Content-Type'] && config.headers['Content-Type'] === 'application/x-www-form-urlencoded') {
      config.transformRequest = (data) => {
        const str = [];
        Object.keys(data).forEach(key => str.push(`${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`));
        return str.join('&');
      };
    }

    return config;
  }, error => Promise.reject(error));

@kalaspuffar -s code comme configuration par défaut, merci ça marche maintenant !

```

axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
axios.defaults.transformRequest = [fonction (données, en-têtes) {
var chaîne = [] ;
pour (var p dans les données)
if (data.hasOwnProperty(p) && data[p]) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(data[p]));
}
return str.join("&");
}] ;

Un an plus tard et c'est toujours un problème. (Et pourquoi est-il fermé ?)

Même URLSearchParams ne couvre pas tout le problème.

Maintenant, je veux envoyer un objet FormData, par PATCH. Et que dois-je faire ?

jQuery l'a sorti de la boîte il y a de nombreuses années. Mais axios ne peut pas reconnaître formData

Cette page vous a été utile?
0 / 5 - 0 notes