Выборка: данные, посланные методом POST в формате JSON, применение/изменение JSON в текст/равнина
Я использую chrome 53.0.2785.116 m (64-бит).
Я получил следующие заголовки на devtools. Проблема отмечена комментарием"//". тип контента действительно не позволяет нам установить его в application/json, я пробовал 100 различными способами.
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);
Заголовки Запроса
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
2 ответов
проблема в том, что когда вы работаете в режиме "no-cors", заголовки становятся неизменяемыми, и вы не сможете изменить некоторые из его записей. Один из руководителей нельзя изменить тип контента. Когда вы установите "mode" в "no-cors", вы сможете изменить только эти заголовки:
Accept
Accept-Language
Content-Language
-
Content-Type
и чье значение после анализа имеет тип MIME (игнорирование параметров), который являетсяapplication/x-www-form-urlencoded
,multipart/form-data
илиtext/plain
другими словами, в "режиме ""- нет- "cors" вы можете установить только application/x-www-form-urlencoded
, multipart/form-data
или text/plain
до Content-Type
.
таким образом, решение перестает использовать fetch или изменять его на "cors ""mode". Конечно, это будет работать только в том случае, если ваш сервер также принимает запросы "cors".
вот пример того, как вы могли бы включить CORS на сервере Apache
SetEnvIfNoCase Access-Control-Request-Method "(GET|POST|PUT|DELETE|OPTIONS)" IsPreflight=1
SetEnvIfNoCase Origin ".*" AccessControlAllowOrigin=
SetEnvIfNoCase Origin "https://(url1.com|url2.com)$" AccessControlAllowOrigin=
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 ^(.*)$ [R=204,L]
приведенный выше код введет заголовки CORS в ответ когда это необходимо. С помощью этого кода ваш сервер разрешит CORS только из доменов "url1.com" или "url2.com".
вот некоторые ссылки
на mode:"no-cors"
параметры, похоже, проблема. Удалите эту опцию и Content-Type
должно быть установлено в "application/json"