web-dev-qa-db-fra.com

Chercher: post json data, application/json changer en text/plain

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
12
Bowen Wang

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

14
Stavarengo

Les options mode:"no-cors" semblent être le problème. Supprimez cette option et le Content-Type devrait être défini sur "application/json"

0
guest271314