在axios中设置授权标头

jca*_*pia 5 get http http-status-code-401 reactjs axios

我一直在尝试使用axios向国家公园服务API发出GET请求,并尝试了几种方法在请求标头中设置我的API密钥无济于事.任何帮助将不胜感激.

我试过了:

axios.defaults.headers.common['Authorization'] = "MY-API-KEY";
axios.get('https://developer.nps.gov/api/v0/parks?parkCode=yell')
.then((resp) => {
    console.dir(resp);
});
Run Code Online (Sandbox Code Playgroud)

let config = {'Authorization': 'MY-API-KEY'};
axios.get('https://developer.nps.gov/api/v0/parks?parkCode=yell', config)
.then((resp) => {
    console.dir(resp);
});
Run Code Online (Sandbox Code Playgroud)

当我在Postman中发送GET请求时,它会返回401.它在密钥字段中输入Authorization,在值字段中输入我的API密钥.

谢谢.

sha*_*ncs 7

此问题是浏览器中的CORS OPTIONS请求引起的,与axios无关。https://developer.nps.govAuthorization在所有 HTTP 请求中都需要标头,包括 OPTIONS。但是,所有自定义 HTTP 标头都将从 OPTIONS 中排除,请参阅https://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0

National Park Service API 不应该要求AuthorizationOPTIONS 请求的标头,但确实如此。无论如何,有一个解决方法:在您自己的后端进行转发,接受来自浏览器的 HTTP 请求,在后端从https://developer.nps.gov检索数据,最后将其返回给浏览器。

实际上,从浏览器发送带有第三方授权密钥的 HTTP 请求绝对不是一个好主意——这种设计会将您的 National Park Service API 密钥暴露给访问该页面的每个人,这当然是一件危险的事情。


您的第一个解决方案(配置 axios 默认标头的 API 密钥)没问题。我尝试使用我自己的 API 密钥和您的 URL,响应代码是 200 OK。

对于第二种解决方案,该config对象应用作headersaxios 语句中的字段。代码将是:

axios.get('https://developer.nps.gov/api/v0/parks?parkCode=yell', {headers: config})
Run Code Online (Sandbox Code Playgroud)