尝试在 Axios GET 的正文中发送数据以在 Django 后端使用,但 request.body 的打印为空
Posted
技术标签:
【中文标题】尝试在 Axios GET 的正文中发送数据以在 Django 后端使用,但 request.body 的打印为空【英文标题】:Trying to send data in the body of a Axios GET to use in Django backend, but print of request.body is empty 【发布时间】: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。
是的,来自浏览器。我想我应该继续阅读,因为它确实会继续解释这一点。
【参考方案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']
【讨论】:
以上是关于尝试在 Axios GET 的正文中发送数据以在 Django 后端使用,但 request.body 的打印为空的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 Axios 中发送带有 JSON 正文的 get 请求?
无法在 php if 语句中处理 axios.post vuejs 正文数据