Axios POST 调用不适用于 JWT 令牌,而 GET 调用有效

Posted

技术标签:

【中文标题】Axios POST 调用不适用于 JWT 令牌,而 GET 调用有效【英文标题】:Axios POST call doesn't work with JWT token, while GET call works 【发布时间】:2021-05-31 06:51:23 【问题描述】:

我正在尝试在 Django 中构建 REST API,我通过使用 axios 库和 JWT 令牌身份验证在前端与 Vue.js 连接。

但是,当我进行 POST 时,Django 显示未经授权,而当我使用 GET 时,一切似乎都正常工作。

POST 和 GET 都被定义为同一个类的一部分,我使用 permission_classes = (IsAuthenticated,) 来检查权限。

后端类:

from django.shortcuts import render

# Generic API views
from rest_framework import generics, permissions, mixins
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated

from django.contrib.auth.models import User
from api.models import Movie
from api.models import WatchList

from api.serializers import WatchListSerializer
from api.add_movie import add_movie


class WatchListAPI(generics.GenericAPIView):
    """
    
    """
    permission_classes = (IsAuthenticated,)

    def get(self, request):
        "Returns all the movies in personal watch list"
        current_user = request.user
        current_watchlist = WatchList.objects.filter(user=current_user).prefetch_related('movie')

        serializer = WatchListSerializer(current_watchlist, many=True)
        return Response(serializer.data)
    
    def post(self, request):
        current_user = request.user
        new_movie_id = request.data['movie_id']

        # In case we don't have current movie in our database
        add_movie(new_movie_id) 

        current_movie = Movie.objects.get(movie_id=new_movie_id)

        new_watchlist_element = WatchList(
            user=current_user,
            movie=current_movie
        )

        if(WatchList.objects.filter(user=current_user, movie=current_movie).count() != 0):
            return Response("error": "that movie is already present in the watchlist")
        
        new_watchlist_element.save()
        return Response("message": "added new movie")

有效的前端调用:

axios.get('http://localhost:8000/watchlist/', 
          headers: 
            Authorization: "Bearer " + currentToken.access
          
        ).then(
          data => 
            this.watchList = [];
            for(let i=0;i<data.data.length;i++) 
              this.watchList.push(
                movieTitle: data.data[i]['movie']['movie_name'],
                shortSummary: data.data[i]['movie']['overview'],
                yearProduction: data.data[i]['movie']['production_year'],
                moviePoster: data.data[i]['movie']['poster_path'],
                rating: 5,
              );
            
          
        );

前端调用不起作用:

axios.post('http://localhost:8000/watchlist/', 
            headers: 
              Authorization: "Bearer " + currentToken.access
            ,
            movie_id: this.movieSearchQueue[i]['movieId'],
          ).then(data=>console.log(data));

【问题讨论】:

你需要给我们看一些代码 我刚刚添加了代码,axios.get 有效,而 axios.post 无效 我可以看看你的 REST_FRAMEWORK 设置吗? 我已经在那里配置了 CORS_HEADERS,我在 axios post call 中添加了这两件事,现在它似乎可以工作了:'Accept' : 'application/json', 'Content-Type': 'application /json' 很高兴听到这个消息,那么也许您可以用可行的解决方案回答您的问题并接受它,以便其他人可以轻松找到它 【参考方案1】:

似乎我应该在 Axios 后调用中添加更多细节,因为在我将这两件事添加到后调用的标题中后它开始工作:

'Accept' : 'application/json', 
'Content-Type': 'application/json'

【讨论】:

以上是关于Axios POST 调用不适用于 JWT 令牌,而 GET 调用有效的主要内容,如果未能解决你的问题,请参考以下文章

POST请求不适用于令牌验证检查

如何将我的 JWT 令牌附加到每个 axios 调用?

Axios - 防止在外部 api 调用上发送 JWT 令牌

使用带有 JWT 令牌的 Axios 对 Redux saga 产生调用的无限循环

JWT Auth 令牌适用于 Homestead,但不适用于生产服务器

如何使用 Node、Express、Axios 在 ReactJS 前端设置带有 JWT 令牌的 cookie