2017-01-25 136 views
6

我正在向我的本地web服务发出一个GET请求,我期待一个302响应返回头中的位置。但是,即使我可以在本地看到请求正在被服务,并且在webservice中没有任何错误地创建响应,我也会收到未定义的响应和网络错误。302响应错误

我试过邮差和Chrome,它收到重定向响应并重定向。

我不确定这是否是一个CORS问题,如果是的话,我该如何解决这个问题?

我在为CORS响应标头已经添加过滤

Access-Control-Expose-Headers: Location, [own headers] 
Access-Control-Allow-Origin: '*' 
Access-Control-Allow-Methods: POST, PUT, GET, OPTIONS, DELETE 
Access-Control-Max-Age: [some age] 
Access-Control-Allow-Headers: [own headers] 

和所述位置是存在于报头,当我使用邮差

请求我使用Axios公司制造和的配置是

const config = { 
    url: [someURL], 
    method: 'GET', 
    headers: { 
    'customHeader':'token', 
    }, 
    params: { 
    [params] 
    }, 
    maxRedirects: 0, 
    validateStatus: status => (status >= 200 && status < 300) || status === 302, 
}; 

任何帮助将真正理解,为什么反应是不确定的,当它达到我的JS代码,但在邮差和Chrome的正常工作。

我可以解决这个问题的一个方法是使用HTTP状态代码200并获取位置标头重定向,但我想避免这种情况,因为它在技术上是重定向响应。

+0

可能您可以尝试检查'readyState'状态并查找'HEADERS_RECEIVED'(https://xhr.spec.whatwg.org/)。请检查此http://stackoverflow.com/questions/228225/prevent-redirection-of-xmlhttprequest答案。 –

+0

但我得到一个未定义的响应,其中不包含任何状态或响应正文或标题 – diepjy

回答

2

'customHeader':'token'请求的一部分triggers your browser to first send a CORS preflight OPTIONS request任何您添加到标题以外的其他请求的标头定义为CORS-safelisted request-headers触发浏览器发送CORS预检选项请求。

Postman没有得到这个的原因是,与浏览器引擎不同,邮差没有实现CORS,所以它不会发送OPTIONS请求。 (Postman不在相同来源的Web安全模式下运行,浏览器针对Web应用程序执行此操作)。

如果服务器没有以正确方式响应CORS预检选项请求,您的请求将失败,唯一的解决方法是不要将'customHeader':'token'部分添加到您的请求中,否则以任何触发浏览器执行CORS预检的方式构建您的请求。

+0

我有其他终端可以正常工作(GET,POST,DELETE,PUT和OPTION)以及CORS预检选项请求,除了端点返回302响应。我不太清楚“以任何触发浏览器执行CORS预检的方式构建请求”的含义,这是否意味着我必须将位置标题添加到我的请求中? – diepjy