我正在使用this和this在我的其他api上发布一些数据。但是我收到了一个错误的请求(400)。
我的一段代码
var dataTask = {};
var dataPeri = {};
var csrf;
var that = this;
var date = new Date();
var dateString;
dateString = date.toJSON().slice(0, 10);
dataPeri['date'] = dateString;
dataPeri['customer'] = customerId;
csrf = $('input[name="csrfmiddlewaretoken"]').val();
console.log('csrf:'+csrf);
console.log(dataPeri); //The objects seems fine with date at the right format and customerId a number
$.ajaxSetup({
beforeSend: function(xhr, settings){
if (!this.crossDomain){
xhr.setRequestHeader("X-CSRFToken", csrf);
}
}
});
$.ajax({
dataType:'json',
type: 'post',
url: '/crm/api/periodontogramms/',
data:JSON.stringify(dataPeri),
success: function (data, textStatus, jqXHR){
alert("New Periodontogramm saved successfully");
console.log("Periodontogramma "+ data);
that.periodontogramms.push(data);
},
error: function (jqXHR, textStatus, errorThrown){
alert(errorThrown);
}
});
我无法得到错误,因为错误没有其他消息。我正在发送Json。(使用JSON.stringify)。我应该发送别的东西吗?可能是dateString招致问题吗?在我可浏览的Api发布的内容中,我使用以下格式的日期:YYY-MM-DD
。这就是我从date.toJSON.slice(0, 10)
得到的。如果是csrf问题,我不应该收到禁止的消息(403)
答案 0 :(得分:1)
最初在@Apostolos
的问题中回答了这个问题我删除了JSON.stringify并发送了简单的javascript ojbect。
但是没有解释原因。问题是您将JSON数据(使用JSON.stringify
编码)作为字符串发送到API,但API的印象是您发送了表单编码数据。
你在$.ajax()
call中使用了一些参数,但是你遗漏了一些重要参数。
dataType
参数根据正在发送的Accept
标头告诉jQuery要返回的数据类型。在大多数情况下,这是json
,默认情况下,jQuery将根据响应的内容进行智能猜测。它通常是对的,但帮助它并没有什么坏处。
contentType
参数告诉jQuery将哪种数据类型发送到服务器。默认情况下,这是application/x-www-form-urlencoded; charset=UTF-8
,在发送JSON数据时,您必须将其设置为application/json
。这很重要,因为否则jQuery不知道如何处理你给它的JSON字符串,并且API将不知道如何处理格式错误的表单编码数据。
data
参数告诉jQuery要发送给服务器的数据。使用默认contentType
,这将接受表单编码的字符串或包含键的字典 - >应该进行表单编码的值对。当覆盖contentType
时,jQuery期望这里发送的数据应该与发送到服务器的数据完全匹配,在您的情况下是JSON字符串。
我还建议您使用浏览器的开发者工具来阅读回复正文,因为这应该告诉您发送的请求存在问题。