J'utilise le chrome 53.0.2785.116 m (64 bits).
J'ai les en-têtes suivants sur devtools. Le problème est marqué avec un "//" commentaire. Le type de contenu ne nous permet vraiment pas de le régler sur application/json, j'ai déjà essayé 100 méthodes différentes.
import fetch from 'isomorphic-fetch';
const option = {
method: 'POST',
mode: 'no-cors',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({'aa':'bb'})
}
fetch('/books', opts)
.then(check401)
.then(check404)
.then(jsonParse)
.then(errorMessageParse);
En-têtes de demande
accept:application/json
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8
Connection:keep-alive
Content-Length:97
content-type:text/plain;charset=UTF-8 //What happen?
Host:127.0.0.1:8989
Origin:http://127.0.0.1:8989
Referer:http://127.0.0.1:8989/
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36
Le problème est que lorsque vous travaillez en «mode» «non corsé», les en-têtes deviennent immuables et vous ne pouvez pas modifier certaines de ses entrées. L'une des têtes que vous ne pouvez pas modifier est le type de contenu. Lorsque vous définissez 'mode' sur 'no-cors', vous ne pourrez modifier que les en-têtes suivants:
Accept
Accept-Language
Content-Language
Content-Type
et dont la valeur, une fois analysée, a un type MIME (ignorant les paramètres) qui est application/x-www-form-urlencoded
, multipart/form-data
ou text/plain
En d'autres termes, en 'mode' '-no-'cors', vous ne pouvez définir que application/x-www-form-urlencoded
, multipart/form-data
ou text/plain
avec le Content-Type
.
Donc, la solution est d’arrêter d’utiliser fetch ou de le changer en mode 'cors'. Bien sûr, cela ne fonctionnera que si votre serveur accepte également les requêtes 'cors'.
Voici un exemple de la manière dont vous pouvez activer CORS sur un serveur Apache.
SetEnvIfNoCase Access-Control-Request-Method "(GET|POST|PUT|DELETE|OPTIONS)" IsPreflight=1
SetEnvIfNoCase Origin ".*" AccessControlAllowOrigin=$0
SetEnvIfNoCase Origin "https://(url1.com|url2.com)$" AccessControlAllowOrigin=$0
Header always set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" env=IsPreflight
Header always set Access-Control-Allow-Headers "Content-Type, Authorization, Accept, Accept-Language" env=IsPreflight
Header always set Access-Control-Max-Age "7200" env=IsPreflight
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteCond %{ENV:IsPreflight} 1
RewriteRule ^(.*)$ $1 [R=204,L]
Le code ci-dessus injectera les en-têtes CORS dans la réponse lorsque cela est nécessaire . Avec ce code, votre serveur autorisera CORS uniquement à partir des domaines "url1.com" ou "url2.com".
Voici quelques références
Les options mode:"no-cors"
semblent être le problème. Supprimez cette option et le Content-Type
devrait être défini sur "application/json"