Axios请求Django接口提示未提供认证凭证但Postman正常调用如何解决
后端对应的Django视图代码如下:
@api_view(['POST']) @csrf_exempt @permission_classes([IsAuthenticated]) def add_to_wishlist(request, id): product = get_object_or_404(Product, _id=id) if product.users_wishlist.filter(id=request.user.id).exists(): product.users_wishlist.remove(request.user) else: product.users_wishlist.add(request.user) return Response('your item is add to the wishlist ')
请问这个问题该如何解决?
解决方案
问题根因
你的axios.post调用传参顺序错误,导致请求头配置没有生效。axios发送POST请求的语法是axios.post(url, 请求体数据, 配置项),你目前将配置项直接作为第二个参数传入,axios会把它识别为请求体,你配置的Authorization请求头根本没有被发送到后端,所以才会返回认证凭证未提供的错误。
修正代码
调整axios.post的参数顺序,给第二个参数传入空对象作为请求体,将config放在第三个参数位置即可:
export const addToWishlist = (id) => async (dispatch, getState) => { try { const { userLogin: { userInfo }, } = getState() const config = { headers: { 'Authorization': `JWT ${userInfo.token}` } } // 修正传参顺序,第二个参数为请求体,无数据时传空对象 const { data } = await axios.post(`/api/wishlist/add_to_wishlist/${id}/`, {}, config) dispatch({ type: WISHLIST_ADD_ITEM, payload: data }) localStorage.setItem('wishlistItems', JSON.stringify(getState().wishlist.wishlistItemsFromStorage)) } catch (error) { dispatch({ type: WISHLIST_ADD_ITEM_FAIL, payload: error.response && error.response.data.detail ? error.response.data.detail : error.message, }) } }
验证
修改后打开浏览器开发者工具的「网络」面板,找到对应POST请求,检查请求头中是否已经携带Authorization字段,确认后请求即可正常通过认证。
内容的提问来源于stack exchange,提问作者Hasnain Sikander
相关产品推荐
相关产品推荐

