我尝试使用 XMLHttpRequest 读取音频流,但收到错误“XMLHttpRequest 无法加载。请求的资源上不存在 'Access-Control-Allow-Origin' 标头。因此不允许访问 Origin 'null'” 。我尝试使用这个 example
。如果我像这样将 url 放入音频 html 标签中<!DOCTYPE html>
中的 CORS<html>
<head>
<meta charset="utf-8">
<title>AUDIO</title>
</head>
<body>
<script type="text/javascript">
函数createCORSRequest(方法,url){ var xhr = new XMLHttpRequest(); if (xhr 中的“withCredentials”) { // 适用于 Chrome/Firefox/Opera/Safari 的 XHR。 xhr.open(方法, url, true); } else if (typeof XDomainRequest != "未定义") { // IE 的 XDomainRequest。 xhr = new XDomainRequest(); xhr.open(方法, url); } 别的 { // 不支持 CORS。 xhr = 空; } 返回xhr; }// Helper method to parse the title tag from the response. function getTitle(text) { return text.match('<title>(.*)?</title>')[1]; } // Make the actual CORS request. function makeCorsRequest() { // All HTML5 Rocks properties support CORS. var url = 'http://streaming.radionomy.com/VWClassicRock'; var xhr = createCORSRequest('GET', url); if (!xhr) { alert('CORS not supported'); return; } // Response handlers. xhr.onload = function() { var text = xhr.responseText; var title = getTitle(text); alert('Response from CORS request to ' + url + ': ' + title); }; xhr.onerror = function() { alert('Woops, there was an error making the request.'); }; xhr.send(); } makeCorsRequest(); </script>
</body>
</html>
,然后就可以了。我应该怎么做,才能将它与 XMLHttpRequest 一起使用?<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>AUDIO</title>
</head>
<body>
<audio src='http://streaming.radionomy.com/VWClassicRock' controls></audio>
</body>
</html>
我也遇到了同样的问题。 cors 错误代表客户端问题,具体取决于浏览器。 当您的本地服务器向外部服务器发出请求时会发生这种情况。因此,根据您的本地服务器配置,会显示错误。
根据我个人的经验,使用 fetch 遇到了这个问题。我在我的 php 框架上使用 vue.js。所以基本上我发现我必须设置标题,例如
"X-Requested-With": "XMLHttpRequest", "Access-Control-Allow-Origin": "*"
,如果您使用 fetch 方法,请在前端代码请求上使用 mode: 'no-cors'
。然后错误就消失了我可以从前端调用第三方api。
所以你可以做
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.setRequestHeader('Access-Control-Allow-Origin', '*');
供您参考,您可以看看这个要点:
https://gist.github.com/khorramk/2c0828ca296832b0319d0155a36af7af 和这些链接: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
XMLHttpRequest 是如何工作的?
在 CORS 规范中,浏览器必须执行预检请求才能知道哪些方法可用/允许:GET、POST、HEAD...
预检正在执行 OPTIONS 请求。 OPTIONS 本身是一种方法,因此您也必须像其他 Http 方法一样启用/允许它。
因此 XMLHttpRequest 正在执行 OPTIONS 请求,这将返回哪些方法可用于此调用。如果允许 GET、POST 或任何方法,则执行请求,如果不允许,则出现 CORS 错误。
这是一个例子:
const data = '{"message":"hi there!"}'
const xhr = new XMLHttpRequest()
xhr.open('POST', endpointURL)
xhr.setRequestHeader('Content-type', 'application/json')
xhr.send(JSON.stringify(data))
首先,XMLHttpRequest 对象正在执行 OPTIONS 调用,以便了解哪些方法可用于端点 URL。 CORS 标头也从服务器返回。通过此信息,XMLHttpRequest 知道它是否可以执行 POST 调用。 如果允许 CORS,XMLHttpRequest 就可以工作。
为了测试 XMLHttpRequest 调用,您可以在邮递员或 REST 客户端工具中执行 OPTIONS 调用,或者使用 CURL:
curl -X OPTIONS -k -H 'Conte -Type: application/json' -i 'https://yourserver/path/hello' --data '{"message": "hello world"}'
然后您可以执行 POST 调用:
curl -X POST -k -H 'Content-Type: application/json' -i 'https://yourserver/path/hello' --data '{"message": "world"}'
在服务器端不要忘记启用允许的方法:GET、POST、OPTIONS,并返回expectedHeaders和allowedHeaders
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("POST","GET","OPTIONS")
.allowedHeaders("*")
.allowCredentials(false).maxAge(3600);
}
}