2017-02-21 1 views
3

J'ai un fetch où les types de requêtes semblent changer ce qui gâche mon post. Je soumets mon formulaire de base (un seul champ). Voici le fetch.React - fetch Le type de contenu change lors de la visualisation dans fiddler

 handleSubmit(event, data) { 
    //alert('A name was submitted: ' + this.state.value); 
    event.preventDefault(); 
    console.log("SUBMIT STATE::", this.state.value); 
    return (
     fetch("//localhost:5000/api/values/dui/", { 
      method: "post", 
      mode: 'no-cors', 
      headers: { 
       'Access-Control-Allow-Origin': '*', 
       'Content-Type': 'application/json', 
       'Accept': 'application/json',     
      }, 
      body: JSON.stringify({ 
       name: this.state.value, 
      }) 
     }).then(response => { 
      if (response.status >= 400) { 
       this.setState({ 
        value: 'no greeting - status > 400' 
       }); 
       throw new Error('no greeting - throw'); 
      } 
      return response.text() 
     }).then(data => { 
      var myData = JSON.parse(data); 
      this.setState({ 
       greeting: myData.name, 
       path: myData.link 
      }); 
     }).catch(() => { 
      this.setState({ 
       value: 'no greeting - cb catch' 
      }) 
     }) 
    ); 


} 

Mais quand je regarde cela dans le type de contenu Fiddler est maintenant 'type de contenu: text/plain; charset = UTF-8'. Voici le Fiddler brut:

POST http://localhost:5000/api/values/dui/ HTTP/1.1 
Host: localhost:5000 
Connection: keep-alive 
Content-Length: 16 
accept: application/json 
Origin: http://evil.com/ 
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 

-type de contenu: text/plain; charset = UTF-8 Referer: http://localhost:3000/ Accept-Encoding: gzip, dégonfler, br Accept-Language: fr-fr, fr ; q = 0,8

{"name":"molly"} 

Dans DOM Inspector Je vois simplement:

POST http://localhost:5000/api/values/dui/ 415 (type de média non géré)

Je trouve aussi étrange que «accepter» soit en minuscules ou en «type de contenu». Toute raison pour laquelle cela se produit. Je n'ai encore rien trouvé de spécifique dans mes recherches.

Répondre

3

Lorsque mode: 'no-cors' est défini pour une demande, les navigateurs ne vous permettent pas de définir des en-têtes de requête autres que CORS-safelisted request-headers. Voir the spec requirements about adding headers:

Pour ajouter un nom/valeur (nom/valeur) paire à un objet Headers (têtes), exécutez les étapes suivantes:

  1. Sinon, si garde est "request-no-cors" et nom/valeur est pas un CORS-safelisted request-header, le retour.

Dans cet algorithme, return équivaut à « retour sans ajouter cet en-tête de l'objet en-têtes ».

Et la raison pour laquelle il est au lieu de se régler à text/plain;charset=UTF-8 est parce que the algorithm for the request constructor appels dans un extract a body algorithm qui comprend l'étape suivante:

Enclencher objet de type:

USVString

  • Set Content-Type à text/plain;charset=UTF-8.
1

Donc, c'est ce qui a résolu ce problème, j'ai changé 'no-cors' en 'cors'. Franchement, je pensais que j'avais retourné ces flop avant parce que j'avais des problèmes d'origine entre mon poste de développement local et le serveur sur lequel je déployais, mais inutile de le dire, quand j'ai remis le mode: cors, tout a fonctionné . Le poste de travail local et le serveur. Pourquoi cela change l'en-tête de la demande, je ne suis pas sûr. Si quelqu'un a des réponses à ce sujet, je serai ravi d'y répondre.

Merci.