Django rest api使用JavaScript客户端导致post请求上的csrf问题
Django rest api using javascript client causing csrf issues on post requests
我正在使用这个和这个在我的休息 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.stringify(。我应该发送其他东西吗?可能是日期字符串导致了问题吗?在我的可浏览 API 上发布我使用以下格式使用日期的内容:YYY-MM-DD
.这就是我从date.toJSON.slice(0, 10)
得到的.如果是csrf问题,我不应该收到禁止的消息(403(
这最初是由@Apostolos回答
的问题在我删除JSON.stringify并发送普通javascript ojbect之后,它起作用了。
但是没有解释为什么。问题是您将 JSON 数据(用 JSON.stringify
编码(作为字符串发送到 API,但 API 的印象是您正在发送表单编码的数据。
您在$.ajax()
调用中使用了一些参数,但缺少一些重要的参数。
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字符串。
我还建议您使用浏览器的开发人员工具来阅读响应的正文,因为这应该告诉您发送的请求存在问题。
- 当我在form_for中的text_field_tag中点击Enter时,如何禁止发出POST请求
- 为什么 AJAX POST 请求不起作用
- Ajax POST请求没有'我不了解PHP
- 防止双击执行两次jQuery post请求
- Javascript XMLHttpRequest——只有第一个POST请求有效
- 如何使用Javascript获取POST请求填充的元素的值
- NodeJS中POST请求的请求体为null
- 在Fiddler JavaScript中识别POST请求
- DreamFactory REST API POST休息/用户/会话请求总是在IE9中返回错误
- 使用application/x-www-form-urlencoded使用node.js在post请求中发送数组
- 打开一个选项卡,并在firefox网络扩展中向其发出POST请求
- 通过AJAX向同一页面发送POST请求,并使用$_POST获取值
- Ajax Post请求不起作用
- 如何在cloud9中向server.js发送post请求
- mootools表单json post请求
- 可以'无法在CasperJS中复制POST请求
- node.js请求POST数组“;第一个参数必须是字符串或缓冲区;
- PythonBottle:访问请求POST数据中的数组变量
- NodeJS请求POST图标
- Yii框架2.0 AJAX请求POST方法