这两天在做一个easyui datagrid 与服务器端数据交互时遇到了一个问题,
利用ajax上传json格式的数据,对于更改操作使用put方法,对于添加操作使用post方法,js代码如下:
onAfterEdit : function(rowIndex, rowData, changes) {
obj.editRow = undefined;
var type = "POST";
var url = "/umgr/user";
$("#save,#redo").hide();
var deny = true;
//下面可以处理要保存的数据,通过ajax与后台交互
if(rowData.deny == 'false') {
deny = false;
}
data = '{'+
"username:'"+rowData.username+"',"+
"password:'"+rowData.password+"',"+
"deny:"+deny+","+
"metadata:{}}";
//data = "{'username':'1234','password':'123','deny':false,'metadata':{}}";
if(!obj.addAction) {//更改操作
type = "PUT";
url = url+"/"+rowData.username;
}
else {
obj.addAction = false;
}
$.ajax({
type: type,
url: url,
data: data,//此处data为上传的数据
dataType: "json",
cache:false,
success: function (msg) {
console.log(data);
if(msg.status==0) {
$('#dg').datagrid('load');//删除后刷新
$('#dg').datagrid('unselectAll');//删除后原来选定的行仍处于选定状态
$.messager.show({//右下角显示删除结果提示
title:'提示',
msg:'数据操作成功',
});
}
else if(msg.status==1) {
$.messager.show({//右下角显示删除结果提示
title:'提示',
msg:'数据操作失败',
});
}
}
});
测试时当提交put请求时,没有任何问题,后台接收到的json数据正常,奇怪的事情发生在提交post请求,比如我在前端拼了一段json数据:
{username:'test',password:'test',deny:true,metadata:{}}
当用post请求时,后台接收到的内容为:
%7Busername%3A%27test%27%2Cpassword%3A%27test%27%2Cdeny%3Atrue%2Cmetadata%3A%7B%7D%7D=
仔细观察可发现冒号、单引号和大括号都被转码,后来在ajax中加入一段代码:
contentType: "application/json",
此时在进行测试,post发送请求,后台接收到的json格式正常了。
问题貌似解决了,但是为何put请求在没有设置contentType时能正常传输数据,post则不能呢?
有时间得研究下put和post的差异
-----------------------------------------无耻的分隔符-----------------------------------
简单来说put与post的差异就是:post是非幂等操作,put是幂等操作