Zay*_*ayn 6 http-headers reactjs axios
我正在为我的项目使用 reactjs,但我有一个问题,在 config.js 文件中,我在其中设置了全局 axios 配置,我正在为 axios 请求设置默认标头,但是当我发出 axios 请求时,它不会在请求中发送这些标头.
配置文件
import axios from 'axios';
const instance = axios.create({
baseURL: 'URL/api'
});
export const setAuthToken = (token) => {
if (token) {
// Apply to every request
instance.defaults.headers.common['Authorization'] = 'Bearer ' + token;
} else {
// Delete auth header
delete instance.defaults.headers.common['Authorization'];
}
};
export default instance;
Run Code Online (Sandbox Code Playgroud)
登录.js
import axios from '../../../config';
import { setAuthToken } from '../../../config';
axios
.post('/auth/signin', {
username: email,
password: password
})
.then((res) => {
setCurrentUser(res.data);
setAuthToken(res.data.accessToken);
setLoading(false);
})
.catch((err) => {
console.log(err);
setLoading(false);
setError(true);
});
Run Code Online (Sandbox Code Playgroud)
Sul*_*Sah 11
你可以使用 axios拦截器来完成这个任务。
1-) 在成功登录后,将检索到的令牌放入 localStorage。删除 setAuthToken 行。
.then((res) => {
setCurrentUser(res.data);
localStorage.setItem("token", res.data.accessToken);
setLoading(false);
})
Run Code Online (Sandbox Code Playgroud)
2-) 将此拦截器添加到您的 axios 实例。
const instance = axios.create({
baseURL: 'URL/api'
});
instance.interceptors.request.use(
function(config) {
const token = localStorage.getItem("token");
if (token) {
config.headers["Authorization"] = 'Bearer ' + token;
}
return config;
},
function(error) {
return Promise.reject(error);
}
);
Run Code Online (Sandbox Code Playgroud)
我必须在实例中创建标头对象结构才能使全局标头覆盖正常工作:
下面的代码片段不起作用(但不会引发任何错误);使用实例时使用全局标头:
// Index.js
axios.defaults.headers.common['Authorization'] = 'AUTH_TOKEN';
// myAxios.js
const instance = axios.create({
baseURL: 'https://jsonplaceholder.typicode.com'
});
instance.defaults.headers.common['Authorization'] = 'AUTH_TOKEN_FROM_INSTANCE';
Run Code Online (Sandbox Code Playgroud)
这确实有效,实例标头覆盖全局默认值:
// Index.js
axios.defaults.headers.common['Authorization'] = 'AUTH_TOKEN';
// myAxios.js
const instance = axios.create({
baseURL: 'https://jsonplaceholder.typicode.com',
headers: {
common: {
Authorization: 'AUTH_TOKEN_FROM_INSTANCE'
}
}
});
Run Code Online (Sandbox Code Playgroud)
在我看来,使用#create时应该默认创建这个对象结构。
=================================================== =========================
此外,如果您想取消设置标头,请不要使用delete. 这是一个测试:
it('should remove default headers when config indicates', function (done) {
var instance = axios.create();
instance.defaults.headers.common['Content-Type'] = 'application/json';
instance.post('/foo/bar/', {
firstName: 'foo',
lastName: 'bar'
}, {
headers: {
'Content-Type': null
}
});
getAjaxRequest().then(function (request) {
testHeaderValue(request.requestHeaders, 'Content-Type', null);
done();
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17718 次 |
| 最近记录: |