Попытка отправить данные в теле Axios GET для использования в бэкэнде Django, но печать request.body пуста

Согласно Axios, это должно быть возможно:

https://github.com/axios/axios/issues/462

У меня есть следующее и 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)

3 ответа

Решение

Как и Кит Брюстер, Axios использует XMLHttpRequest, который не поддерживает отправку данных в теле запроса. Одним из решений было бы сделать то, что предложил Дэвид Райан, и добавить pos_title на часть URL. Это создает некоторые головные боли, хотя, если есть места в pos_title которые есть в моем случае.

Однако в моем случае я решил выполнить фильтрацию на стороне клиента, поэтому для решения моей проблемы было достаточно оставить все как есть и отфильтровать ответ.

Для тех, кто задает тот же вопрос, я отправляю ответ, используя ваш код:

Вы должны предоставить params с запросом на получение, например.

      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 можно получить query_params, как показано ниже:

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

Если возможно изменить URL вашего API, добавьте pos_title в качестве параметра запроса. Это позволит обойти любые проблемы, которые могут возникнуть при отправке тела запроса в запросе GET. Если вы должны отправить тело запроса, похоже, вы должны использовать запрос PUT.

Другие вопросы по тегам