2016-09-25 55 views
8

我使用的是chrome 53.0.2785.116 m(64位)。提取:发布json数据,应用程序/ json更改为文本/ plain

我在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 
+1

注意,对象'option'被创建,但'opts'传递给'fetch'。 – guest271314

回答

8

问题是,当您在'模式''no-cors'工作时,标题变成不可变的,您将无法更改其某些条目。 Content-Type是您无法更改的头之一。当您设置“模式”到“无CORS”你将只能更改这些标题:

  • Accept
  • Accept-Language
  • Content-Language
  • Content-Type和其价值,解析一次,有一个MIME类型(忽略参数)是application/x-www-form-urlencodedmultipart/form-data,或text/plain

在另一个WO rds,在'mode''-no-'cors'中,您只能将application/x-www-form-urlencoded,multipart/form-datatext/plain设置为Content-Type

因此,解决方案是停止使用提取或将其更改为'cors''模式'。当然,这只会在你的服务器也接受'cors'请求的时候才起作用。

这里是你如何可以使CORS在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] 

当其需要将上面的代码注入CORS标头在响应的例子。 使用此代码,您的服务器将只允许来自域“url1.com”或“url2.com”的CORS。

这里有一些参考

+0

谢谢你的解释。 –

0

mode:"no-cors"选项似乎是问题。删除该选项和Content-Type应设置为"application/json"

+0

@BowenWang jsfiddle https://jsfiddle.net/b5j4vw5c/ – guest271314

+0

谢谢。答案为我工作。 –