CORH与XMLHttpRequest无法正常工作

时间:2014-08-13 21:27:38

标签: javascript html xmlhttprequest

我正在尝试使用XMLHttpRequest读取音频流,但是收到错误“XMLHttpRequest无法加载。请求的资源上没有'Access-Control-Allow-Origin'标头。因此不允许原点'null'访问”。我尝试使用此example

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>AUDIO</title>
  </head>
  <body>
    <script type="text/javascript">
        function createCORSRequest(method, url) {
        var xhr = new XMLHttpRequest();
        if ("withCredentials" in xhr) {
          // XHR for Chrome/Firefox/Opera/Safari.
          xhr.open(method, url, true);
        } else if (typeof XDomainRequest != "undefined") {
          // XDomainRequest for IE.
          xhr = new XDomainRequest();
          xhr.open(method, url);
        } else {
          // CORS not supported.
          xhr = null;
        }
        return 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>

中的CORS。如果我把url放入这样的音频html标签
<!DOCTYPE html>
,然后就可以了。我应该怎么做,将它与XMLHttpRequest一起使用?

2 个答案:

答案 0 :(得分:0)

XMLHttpRequest如何工作?

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 调用,以了解哪些方法可用于endpointURL。服务器也返回CORS标头。有了此信息,XMLHttpRequest便知道它是否可以执行POST调用。 如果允许CORS,则XMLHttpRequest将起作用。

为了测试XMLHttpRequest调用,您可以在邮递员或rest客户工具或CURL中进行OPTIONS调用:

 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,并返回暴露的标题和允许的标题

@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);

    }
}

答案 1 :(得分:0)

我遇到了同样的问题。 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