首页 > 解决方案 > 如何向 Django rest api 发出 thunk HTTP POST 请求

问题描述

我对此很陌生,所以我会先向您展示错误,然后再展示我的思考过程。

我正在尝试使用 thunk(redux 中的 Http 请求)向我在 django 中的个人 rest api 发出 post 请求。(因此它可以运行 cURL 命令并使用授权代码来获取访问令牌并从 API 获取用户数据)当我发出此请求时,网络返回 201 状态以保持其正常工作,而我的控制台将调度记录为被拒绝,并给出错误“消息:“JSON 输入意外结束”。在此消息中,有效负载未定义,我的有效负载位于 arg 下的元中。

经过大量研究,看起来我要么需要在前端 JSON.strigify 一些东西,要么 django 正在接收一个空对象并且不知道如何处理它。我相信是后者,不知道如何进行。这是我的代码:

前端:slice.py

    import {createAsyncThunk} from '@reduxjs/toolkit'
        
    export const postRequest= createAsyncThunk('slice/postRequest',
          async postData => {
            const response=
            await client.post('url', {slice:postData})
            return response.slice
          }
        )

组件.py

  import {useDispatch} from 'react-redux'
  import {postRequest} from './slice'

  const Component = () => {
      const dispatch=useDispatch()
      const authCode= 'samplecode'
      const data={authCode:`${authCode}`, userData:{}}
      dispatch(postRequest(JSON.stringify(data))

     return(null)
 }

export default Component

后端:

models.py 从 django.db 导入模型

    class UserData(models.Model):
      authCode=models.CharField(max_length=100, default='')
      userData= models.JSONField

序列化程序.py

from rest_framework import serializers
from .models import *

class UserDataSerializer(serializers.ModelSerializer):
  class meta:
    model=UserData
    fields= ('authCode', 'userData')

视图.py

from .models import *
from .serializers import *
from django.views.decorators.csrf import csrf_excempt
from rest_framework.decorators import api.view
from rest_framework.resposne import Response
from rest_framework import status

@api_view(['POST'])
@csrf_excempt
define restapi(request)
  if request.method == "POST":
    serializer = UserDataSerializer(data = request.data
    if serializer.is_valid():
      serializer.save
      return Response(status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_Request

我也尝试过它会返回 204 的状态,并且没有 JSON.stringify。我注意到,当我向 json 服务器发出成功的 post 请求时,它会使用 args 中的有效负载发出请求,如果成功,有效负载将移动到有效负载,但我猜测我当前的错误正在发生因为在 thunk 调度开始时有效负载是空白的。真的我不确定

标签: djangoajaxdjango-rest-frameworkbackendthunk

解决方案


我解决了这个问题,这很愚蠢。

我使用的是自制客户端,但我没有足够的经验来做到这一点。我刚拿到 axios 并将其用作客户端,它运行良好。我还将组件中的请求简化为没有 JSON.stringify 并且没有反引号。


推荐阅读