Попытка отправить данные в теле 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.