Rest 带飞行前的POST请求包含允许的原点,但错误表明原点是不允许的

Rest 带飞行前的POST请求包含允许的原点,但错误表明原点是不允许的,rest,post,fetch-api,Rest,Post,Fetch Api,我正在向我拥有并有权访问的服务器发送POST请求 这将使用OPTIONS方法触发CORS飞行前请求,并返回以下响应标头: HTTP/1.1 200 Allow: HEAD,POST,GET,OPTIONS Last-modified: Mon, 26 Jun 2017 13:57:08 BST Access-Control-Allow-Origin: http://localhost:3000 Access-Control-Allow-Credentials: true Access-Contr

我正在向我拥有并有权访问的服务器发送POST请求

这将使用OPTIONS方法触发CORS飞行前请求,并返回以下响应标头:

HTTP/1.1 200
Allow: HEAD,POST,GET,OPTIONS
Last-modified: Mon, 26 Jun 2017 13:57:08 BST
Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: POST, GET
Access-Control-Allow-Headers: origin, content-type, accept, authorization
Access-Control-Expose-Headers: Set-Cookie
Content-Type: application/vnd.sun.wadl+xml
Content-Length: 1126
随后的POST请求将报告

获取API无法加载http://localhost:8080/api/reservation. 请求的资源上不存在“Access Control Allow Origin”标头。起源'http://localhost:3000因此,不允许访问。响应的HTTP状态代码为500。如果不透明响应满足您的需要,请将请求的模式设置为“no cors”,以获取禁用cors的资源

使用javascript获取

如上所述,发送到my/reservation端点会导致此类错误。但是,对我的服务器上的其他终结点的POST请求是成功的,并且不会失败,报告不允许使用源站。两者执行相同的获取代码;发布飞行前选项,然后发布

var RestRequest = {

    post: function(endpoint, payload, callback, secondCallback) {

        fetch('http://localhost:8080/api' + endpoint, {
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
            },
            method: 'post',
            credentials: 'include',
            body: payload
        })
        .then(function (response) {
            return response.json()
        })
        .then( function (result) {
            callback(result)
            if (secondCallback != null) {
                secondCallback()
            }
        })
    }
};
当CORS飞行前明确允许访问此特定来源时,为什么我的浏览器抱怨发出请求的来源不允许访问


修改我的服务器CORS响应过滤器以允许所有来源会导致相同的错误消息。从Postman插件发出相同的请求成功。

它表示响应的HTTP状态代码为500,因此它与您发布的HTTP 200响应不同


很可能是服务器错误,导致无法将CORS标头添加到响应中。

状态代码200来自CORS飞行前选项请求。很抱歉,我没有注意到,但是问题仍然是一样的。如果服务器上出现500错误,则不会发送头。因此,您遇到的问题不是CORS,而是服务器上的一些其他错误。服务器上没有错误,因为使用邮递员发出完全相同的请求成功。javascript的FetchAPI似乎有问题,因为使用unirest处理REST请求也会成功。500代码似乎来自一个不完整的POST请求,导致服务器在事后抛出一个500,因为它期望POST请求中有一个主体,而当浏览器意识到源代码不被允许时,却没有收到一个主体。在这种情况下,我不知道为什么任何类型的POST请求都会在不允许的情况下发送到服务器。@Shiri,你能发布有效的Postman请求和无效的fetch请求吗?我认为fetch可以正常工作,但您需要正确设置它。您可能仍然希望查看500,因为如果fetch发出不完整的请求,服务器应该响应400个用户错误,而不是500个服务器错误。这也可能会告诉您获取请求的问题所在。我已经更新了我的问题,以包含代码和与此相关的重要缺失信息。fetch块的其他使用完全成功,但仅在我的一个端点不允许原始访问的情况下失败。关于服务器错误的响应代码,您是对的,我希望能够更好地处理它,但是客户端在报告某些请求不允许使用源代码后发出不完整的请求这一根本问题仍然是一个非常奇怪的不一致性。