【问题标题】:Trying to send data in the body of a Axios GET to use in Django backend, but print of request.body is empty尝试在 Axios GET 的正文中发送数据以在 Django 后端使用,但 request.body 的打印为空
【发布时间】:2019-04-13 07:55:20
【问题描述】:

根据 Axios,这应该是可能的:

https://github.com/axios/axios/issues/462#issuecomment-252075124

我有以下内容,pos_title 确实有一个值。

export function getQuery(pos_code, id) {
    if (id === 94) {
        var strArray = pos_code.split(' - ');
        pos_code = strArray[0];
        var pos_title = strArray[1];
    }
    return function(dispatch) {
        axios.get(
            `${URL}/api/survey/${(id)}/results/${(pos_code)}/`,
            { 
                headers: { 
                    'Content-Type': 'application/json',
                    'Authorization': 'JWT ' +  sessionStorage.getItem('token')
                },
                data: {
                    body: pos_title
                }
            }
        )
        .then(response => {
            dispatch({
                type: QUERY,
                payload: response.data
            })
        })
        .catch(error => {
            console.log(error);
        }) 
    }
}

在对应的views.py中,print(body_data)为空:

class GetQueryDataAPIView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request, *args, **kwargs):
        data = {'id': request.user.id}
        if kwargs:
            data['survey_id'] = kwargs.get('survey_id')
            data['pos_code'] = kwargs.get('pos_code')
        if data['survey_id'] == 94:
            body_unicode = request.body.decode('utf-8')
            body_data = json.loads(body_unicode)
            print(body_data)
        serializer = GetQueryDataSerializer(data=data)
        if serializer.is_valid(raise_exception=True):
            return Response(serializer.data, status=HTTP_200_OK)
        return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)

【问题讨论】:

  • 可能是您的 javascript 中的范围问题。仔细检查 pos_title 的 var 范围。
  • 你是从浏览器发出这个请求吗? Axios 可以使用带有 body 的 GET 请求,但是 Axios 使用的底层网络请求是一个不支持它的 XMLHttpRequest。
  • 是的,来自浏览器。我想我应该继续阅读,因为它确实会继续解释这一点。

标签: javascript django reactjs django-rest-framework axios


【解决方案1】:

与 Keith Brewster 一样,Axios 使用 XMLHttpRequest,它不支持在请求正文中发送数据。一种解决方案是按照 David Ryan 的建议进行操作,并将 pos_title 添加到 URL 的一部分。如果pos_title 中有空格(在我的情况下),这会让人有些头疼。

但是,就我而言,我决定在客户端进行过滤,因此保持原样并过滤响应足以解决我的问题。

【讨论】:

    【解决方案2】:

    如果可以修改您的 API URL,请将 pos_title 添加为查询参数。 这将解决您在 GET 请求中发送请求正文时可能遇到的任何问题。如果您必须发送请求正文,听起来您应该使用 PUT 请求。

    【讨论】:

      【解决方案3】:

      对于遇到相同问题的任何人,我将使用您的代码发布回复:

      您必须为获取请求提供参数,例如。

      export function getQuery(pos_code, id) {
      if (id === 94) {
          var strArray = pos_code.split(' - ');
          pos_code = strArray[0];
          var pos_title = strArray[1];
      }
      return function(dispatch) {
          axios.get(
              `${URL}/api/survey/${(id)}/results/${(pos_code)}/`,
              { 
                  headers: { 
                      'Content-Type': 'application/json',
                      'Authorization': 'JWT ' +  sessionStorage.getItem('token')
                  },
                  params: {
                      'title': pos_title
                  }
              }
          )
      }
      

      }

      在 django 第一部分中可以得到如下查询参数:

      def get(self, request, *args, **kwargs):
          title = request.query_params['pos_title']
      

      【讨论】:

        猜你喜欢
        • 2016-07-23
        • 2022-06-29
        • 2017-09-01
        • 1970-01-01
        • 2020-06-25
        • 2021-11-29
        • 1970-01-01
        • 2021-05-26
        • 2023-04-10
        相关资源
        最近更新 更多