当从Ajax发送到Django REST框架时发生“JSON解析错误”
问题描述:
我想发送一个JSON到我的restapi,使用Django Rest Framework进行构建,并且每当我发送此请求时都收到一条错误消息,因为其他ajax调用具有相同的结构。不管我接触什么样的观点,我都有同样的错误。当从Ajax发送到Django REST框架时发生“JSON解析错误”
我敢肯定,问题是Ajax的配置或创建JSON数据,因为当我使用Xamarin形式甚至可以通过一个应用程序构建发送至“高级REST客户端”或JSON,响应的JavaScript为200
function createJson(email, pass){
tmpObj = {"Email": email, "Pass": pass};
json_result = JSON.stringify(tmpObj);
return json_result;
}
function sendLogin(){
var jsonData = createJson(State.email, State.pass);
console.log(jsonData)
$.ajax({
type: 'POST',
dataType: 'json',
contentType: 'application/json',
url: '/restapi/usuarios/login/',
data: jsonData,
processData: false ,
success: function(json) {
console.log(json);
State = json;
first_name = getFirstName(State.Nome)
title = "Login";
msg_html = "Bemvindo, <b>" + first_name + "</b>.";
modal = createModal(title, msg_html);
},
// handle a non-successful response
error : function(xhr,errmsg,err) {
var msg = "Oops! We have encountered an error: "+errmsg;
console.log(msg);
console.log(xhr.status + ": " + xhr.responseText);
setState({sent: 'error', result: err, email: ''});
}
});
}
在服务器端:
@api_view(['POST'])
def UsuarioLogin(request):
data = JSONParser().parse(request)
if all(credencial in data for credencial in ('Email', 'Pass')):
q = User.objects.filter(email=data['Email'])
if q.count() == 1:
username = q.get().username
password = data['Pass']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
usuario = q.get()
payload = UserSerializer(usuario, many=False)
return JsonResponse(payload.data, status=status.HTTP_200_OK, safe=False)
else:
return JsonResponse({"Mensagem": "Senha ou email incorretos"}, status=status.HTTP_401_UNAUTHORIZED, safe=False)
else:
return JsonResponse({"Mensagem": "Usuário não cadastrado"}, status=status.HTTP_404_NOT_FOUND, safe=False)
else:
return JsonResponse({"Mensagem": "Nem todos os campos foram informados"}, status=status.HTTP_400_BAD_REQUEST,
safe=False)
错误消息,在浏览器上是:
400: {"detail":"JSON parse error - Expecting value: line 1 column 1 (char 0)"}
答
您应该只需访问request.data
即可访问数据。
您是否尝试过不将createJson函数中的数据字符串化? – JosephC
是的,我做过。相同的错误消息。我甚至试图不把processData设置为false,但没有改变。 –