问题 为什么我的JavaScript在所请求的资源上出现“No'Access-Control-Allow-Origin'标头”错误,当Postman没有?
我正在尝试使用授权 JavaScript的 通过连接到 REST风格 API 内置的 烧瓶。但是,当我发出请求时,我收到以下错误:
XMLHttpRequest无法加载 HTTP:// myApiUrl /登录。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许原点'null'访问。
我知道API或远程资源必须设置标头,但为什么在我通过Chrome扩展程序发出请求时它才有效 邮差?
这是请求代码:
$.ajax({
type: "POST",
dataType: 'text',
url: api,
username: 'user',
password: 'pass',
crossDomain : true,
xhrFields: {
withCredentials: true
}
})
.done(function( data ) {
console.log("done");
})
.fail( function(xhr, textStatus, errorThrown) {
alert(xhr.responseText);
alert(textStatus);
});
10875
2017-11-17 19:29
起源
答案:
如果我理解得对,你就是在做 XMLHttpRequest的 到您的网页所在的不同域。因此浏览器阻止它,因为出于安全原因,它通常允许同一来源的请求。当您想要执行跨域请求时,您需要执行不同的操作。关于如何实现这一目标的教程是 使用CORS。
当您使用邮递员时,他们不受此政策的限制。引自 跨源XMLHttpRequest:
常规网页可以使用XMLHttpRequest对象从远程服务器发送和接收数据,但它们受到相同原始策略的限制。扩展不是那么有限。扩展可以与其来源之外的远程服务器通信,只要它首先请求跨源权限即可。
1008
2017-11-17 19:49
这不是生产修复或必须向客户端显示应用程序时,这仅在UI和后端时有用 发展 是不同的 服务器 在生产中,它们实际上在同一台服务器上。例如:在为任何应用程序开发UI时,如果需要在本地测试它指向后端服务器,在这种情况下,这是一个完美的修复。 对于生产修复,必须将CORS头添加到后端服务器以允许跨源访问。
简单的方法是在谷歌浏览器中添加扩展名以允许使用CORS进行访问。
(https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en-US)
只要您希望允许访问no,只需启用此扩展 “访问控制允许来源” 标头请求。
要么
在Windows中,粘贴此命令 跑 窗口
chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security
这将开启一个新的 铬 浏览器允许访问否 “访问控制允许来源” 标头请求。
450
2018-03-04 06:42
如果你能处理 JSON 作为回报,然后尝试使用 JSONP (注意 P 最后)在域名之间发言:
$.ajax({
type: "POST",
dataType: 'jsonp',
...... etc ......
了解有关使用JSONP的更多信息 这里:
JSONP的出现 - 本质上是一个双方同意的跨站点脚本黑客 - 为强大的内容混搭打开了大门。许多着名网站都提供JSONP服务,允许您通过预定义的API访问其内容。
312
2018-02-22 00:42
如果您正在使用它,解决起来非常简单 PHP。只需在处理请求的PHP页面的开头添加以下脚本:
<?php header('Access-Control-Allow-Origin: *'); ?>
警告: 这包含您的PHP文件的安全问题,攻击者可以调用它。您必须使用会话和cookie进行身份验证,以防止您的文件/服务遭受此攻击。您的服务容易受到攻击 跨站请求伪造 (CSRF)。
如果你正在使用 节点红 你必须允许CORS node-red/settings.js
通过取消注释以下行来归档:
// The following property can be used to configure cross-origin resource sharing
// in the HTTP nodes.
// See https://github.com/troygoode/node-cors#configuration-options for
// details on its contents. The following is a basic permissive set of options:
httpNodeCors: {
origin: "*",
methods: "GET,PUT,POST,DELETE"
},
185
2017-12-03 20:24
我希望很久以前有人和我分享这个网站 http://cors.io/ 与构建和依赖我自己的代理相比,它可以节省大量时间。但是,当您转向生产时,拥有自己的代理是最好的选择,因为您仍然可以控制数据的所有方面。
一切你需要的:
https://cors.io/?http://HTTP_YOUR_LINK_HERE
143
2017-07-21 22:08
使用Ajax存在跨域问题。您必须确保您正在访问您的文件 http://
没有路径 www.
(或访问 http://www.
并发布到相同的路径,包括 www.
)浏览器在通过a访问时认为是另一个域 www.
路径,所以你看到问题所在。您正在发布到其他域,并且浏览器会因原始问题阻止流。
如果 API 没有放在您请求的同一主机上,流被阻止,您将需要找到另一种与API通信的方式。
61
2018-03-12 08:53
如果你正在使用 Node.js的, 尝试一下:
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
更多信息: ExpressJS上的CORS
55
2018-02-12 16:27
因为
$ .ajax({type:“POST” - 电话 OPTIONS
$。员额( - 电话 POST
两者都是不同的Postman称之为“POST”,但当我们称之为“OPTIONS”时
对于c#web服务 - webapi
请在<system.webServer>标记下的web.config文件中添加以下代码。这会奏效
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
请确保您在ajax调用中没有犯任何错误
jQuery的
$.ajax({
url: 'http://mysite.microsoft.sample.xyz.com/api/mycall',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
type: "POST", /* or type:"GET" or type:"PUT" */
dataType: "json",
data: {
},
success: function (result) {
console.log(result);
},
error: function () {
console.log("error");
}
});
Angular 4问题请参考: http://www.hubfly.com/blog/solutions/how-to-fix-angular-4-api-call-issues/
注意: 如果您正在寻找下载内容 来自第三方网站 然后 这对你没有帮助。您可以尝试以下代码,但不能使用JavaScript。
System.Net.WebClient wc = new System.Net.WebClient();
string str = wc.DownloadString("http://mysite.microsoft.sample.xyz.com/api/mycall");
41
2017-12-13 13:02
尝试 XDomain,
简介:纯JavaScript CORS替代/ polyfill。无需服务器配置 - 只需在要与之通信的域上添加proxy.html。这个库使用XHook挂钩所有 XHR,因此XDomain应该与任何库一起使用。
22
2018-04-01 07:46
如果你不想:
- 在Chrome中停用网络安全
- 使用JSONP
- 使用第三方网站重新路由您的请求
并且您确定您的服务器已启用CORS(此处测试CORS: http://www.test-cors.org/)
然后你需要在你的请求中传入origin参数。
此来源必须与您的浏览器与您的请求一起发送的来源相匹配。
你可以在这里看到它:
http://www.wikibackpacker.com/app/detail/Campgrounds/3591
编辑功能将GET&POST请求发送到其他域以获取数据。我设置了解决问题的origin参数。
后端是一个mediaWiki引擎。
tldr:在调用中添加“origin”参数,该参数必须是浏览器发送的Origin参数(不能欺骗origin参数)
9
2017-07-07 04:26