Fetch 请求 500 错误;请求的资源上不存在 'Access-Control-Allow-Origin' header
500 error for Fetch request; No 'Access-Control-Allow-Origin' header is present on the requested resource
我正在使用 create-react-app 构建一个 front-end 网络应用程序并调用 ProPublica API。提取调用如下:
export const fetchSenators = () => dispatch => {
fetch('https://api.propublica.org/congress/v1/115/senate/members.json', {
method: 'GET',
headers: {
'X-API-Key': process.env.REACT_APP_PROPUBLICA_API_KEY,
'Access-Control-Request-Headers': '*'
}
}).then(response => response.json())
.then(data => dispatch({ type: FETCH_SENATORS, payload: data.results[0].members }));
}
我收到此错误:
“请求的资源上不存在 'Access-Control-Allow-Origin' header。因此不允许访问来源 'https://anaxagoras.herokuapp.com'。响应的 HTTP 状态代码为 500。如果响应不透明满足您的需求,将请求的模式设置为 'no-cors' 以在禁用 CORS 的情况下获取资源。
:1 未捕获(承诺)类型错误:获取失败
我确实需要响应数据,所以我不能使用{mode: 'no-cors'}。我是否需要包含其他 header 以允许此请求不 return 500 错误?
我大体上理解这里发生的事情以及为什么存在安全问题,但如果您能简单解释为什么会发生这种情况(并希望如何解决),我将不胜感激。谢谢!
我注册了 ProPublica API 密钥,并使用以下代码成功实现了 GET 提取请求:
let fetchSenators = () => {
fetch('https://api.propublica.org/congress/v1/115/senate/members.json', {
mode: 'cors',
headers: {
'X-API-Key': 'Q82EAnyHuygomXxK2mNDfcHkvOQ17EmsBPvOc1eq'
}
}).then(response => response.json())
.then(response => {
renderResults(response.results[0].members)
})}
你可以看到它在这里工作:
https://codepen.io/BenSmith/pen/xPVyqp
请注意,我已经删除了您代码的调度方面。
注意事项:
- 进行跨域调用时,您希望在提取选项中指定 CORS 模式。
- 您不需要使用 'Access-Control-Request-Headers' header,因为设置 CORS 模式看起来会处理这方面的请求。
- 在您的代码中,您应该使用 FETCH_SENATORS_SUCCESS 以便操作明确,即 FETCH_SENATORS 暗示该操作正在获取参议员数据,而在这种情况下它不是,它在请求成功。
我正在使用 create-react-app 构建一个 front-end 网络应用程序并调用 ProPublica API。提取调用如下:
export const fetchSenators = () => dispatch => {
fetch('https://api.propublica.org/congress/v1/115/senate/members.json', {
method: 'GET',
headers: {
'X-API-Key': process.env.REACT_APP_PROPUBLICA_API_KEY,
'Access-Control-Request-Headers': '*'
}
}).then(response => response.json())
.then(data => dispatch({ type: FETCH_SENATORS, payload: data.results[0].members }));
}
我收到此错误:
“请求的资源上不存在 'Access-Control-Allow-Origin' header。因此不允许访问来源 'https://anaxagoras.herokuapp.com'。响应的 HTTP 状态代码为 500。如果响应不透明满足您的需求,将请求的模式设置为 'no-cors' 以在禁用 CORS 的情况下获取资源。 :1 未捕获(承诺)类型错误:获取失败
我确实需要响应数据,所以我不能使用{mode: 'no-cors'}。我是否需要包含其他 header 以允许此请求不 return 500 错误?
我大体上理解这里发生的事情以及为什么存在安全问题,但如果您能简单解释为什么会发生这种情况(并希望如何解决),我将不胜感激。谢谢!
我注册了 ProPublica API 密钥,并使用以下代码成功实现了 GET 提取请求:
let fetchSenators = () => {
fetch('https://api.propublica.org/congress/v1/115/senate/members.json', {
mode: 'cors',
headers: {
'X-API-Key': 'Q82EAnyHuygomXxK2mNDfcHkvOQ17EmsBPvOc1eq'
}
}).then(response => response.json())
.then(response => {
renderResults(response.results[0].members)
})}
你可以看到它在这里工作:
https://codepen.io/BenSmith/pen/xPVyqp
请注意,我已经删除了您代码的调度方面。
注意事项:
- 进行跨域调用时,您希望在提取选项中指定 CORS 模式。
- 您不需要使用 'Access-Control-Request-Headers' header,因为设置 CORS 模式看起来会处理这方面的请求。
- 在您的代码中,您应该使用 FETCH_SENATORS_SUCCESS 以便操作明确,即 FETCH_SENATORS 暗示该操作正在获取参议员数据,而在这种情况下它不是,它在请求成功。