ajax 请求中的 json 无效
Invalid json in ajax request
目标是成功POST 一份新工作到马拉松 REST API。我正在使用 jQuery v1.12.4
以下代码从表单获取值并将有效的 json 打印到 console.log。我已经使用 JSONLint 验证了它。但它似乎并没有到达服务器。这是正在打印到日志中的 JSON,我在 firebug:
中看到
{"id":"basic-0","cpus":"0.1","mem":"32","instances":"1","cmd":"while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done"}
我收到 400 Bad Request,然后我看到了这个疯狂的响应(在 firebug 中):
{"message":"Invalid JSON","details":[{"path":"/instances","errors":["error.expected.jsnumber"]},{"path"
:"/cpus","errors":["error.expected.jsnumber"]},{"path":"/mem","errors":["error.expected.jsnumber"]}]
}
我不知道那个回复是什么意思。它来自 jQuery 还是服务器?有谁知道从 javascript 调用马拉松 REST API 的工作示例?
这是代码。是的,我知道在请求中传递用户名和密码是非常糟糕的做法,但我还没有想出如何使用基本身份验证,我还没有想出如何在马拉松网络服务器上启用 SSL。婴儿步骤...
var $form = $('#appsubmit1');
$form.submit(function() {
var form2json = JSON.stringify($('form').serializeObject());
console.log(form2json);
$.ajax({
type: 'POST',
url: 'https://user:pass@mesos-head.achillesv.net/marathon/v2/apps',
data: form2json,
dataType: 'json',
contentType: "application/json; charset=utf-8",
timeout: 10000
}).done(function(resp, status, xhr) {
console.log("ajax function done: ", status);
}).fail(function(xhr, status, errmsg) {
console.log("error: ", status);
console.log("error: ", errmsg);
});
return false;
});
下面是serializeObject函数的代码,不是我写的,是网上找的。它工作得很好,除了它双引号所有的值。我需要不引用数值。不幸的是,我看不到代码将双引号放在何处,因此我不知道如何将它们取出。我还在努力。
$.fn.serializeObject = function() {
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name] !== undefined) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
我正在考虑根据正则表达式检查每个 this.value,如果值完全是数字,即 0.1、3、200.5 等,则删除引号. 我会 post 当我想通了,因为我想 其他人 一定有同样的问题。
该错误清楚地表明该服务需要数字而不是 cpus
、mem
和 instances
字段的字符串。尝试 post 与此 json:
{
"id": "basic-0",
"cpus": 0.1,
"mem": 32,
"instances": 1,
"cmd": "while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done"
}
当您可以做到 data: $("form").serialize()
时,为什么还要付出 var form2json = JSON.stringify($('form').serializeObject()); ... data: form2json
的所有努力?这可能会解决您预期的整数问题,因为它不会 stringify
在预处理中处理所有表单数据。
目标是成功POST 一份新工作到马拉松 REST API。我正在使用 jQuery v1.12.4
以下代码从表单获取值并将有效的 json 打印到 console.log。我已经使用 JSONLint 验证了它。但它似乎并没有到达服务器。这是正在打印到日志中的 JSON,我在 firebug:
中看到{"id":"basic-0","cpus":"0.1","mem":"32","instances":"1","cmd":"while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done"}
我收到 400 Bad Request,然后我看到了这个疯狂的响应(在 firebug 中):
{"message":"Invalid JSON","details":[{"path":"/instances","errors":["error.expected.jsnumber"]},{"path"
:"/cpus","errors":["error.expected.jsnumber"]},{"path":"/mem","errors":["error.expected.jsnumber"]}]
}
我不知道那个回复是什么意思。它来自 jQuery 还是服务器?有谁知道从 javascript 调用马拉松 REST API 的工作示例?
这是代码。是的,我知道在请求中传递用户名和密码是非常糟糕的做法,但我还没有想出如何使用基本身份验证,我还没有想出如何在马拉松网络服务器上启用 SSL。婴儿步骤...
var $form = $('#appsubmit1');
$form.submit(function() {
var form2json = JSON.stringify($('form').serializeObject());
console.log(form2json);
$.ajax({
type: 'POST',
url: 'https://user:pass@mesos-head.achillesv.net/marathon/v2/apps',
data: form2json,
dataType: 'json',
contentType: "application/json; charset=utf-8",
timeout: 10000
}).done(function(resp, status, xhr) {
console.log("ajax function done: ", status);
}).fail(function(xhr, status, errmsg) {
console.log("error: ", status);
console.log("error: ", errmsg);
});
return false;
});
下面是serializeObject函数的代码,不是我写的,是网上找的。它工作得很好,除了它双引号所有的值。我需要不引用数值。不幸的是,我看不到代码将双引号放在何处,因此我不知道如何将它们取出。我还在努力。
$.fn.serializeObject = function() {
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name] !== undefined) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};
我正在考虑根据正则表达式检查每个 this.value,如果值完全是数字,即 0.1、3、200.5 等,则删除引号. 我会 post 当我想通了,因为我想 其他人 一定有同样的问题。
该错误清楚地表明该服务需要数字而不是 cpus
、mem
和 instances
字段的字符串。尝试 post 与此 json:
{
"id": "basic-0",
"cpus": 0.1,
"mem": 32,
"instances": 1,
"cmd": "while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done"
}
当您可以做到 data: $("form").serialize()
时,为什么还要付出 var form2json = JSON.stringify($('form').serializeObject()); ... data: form2json
的所有努力?这可能会解决您预期的整数问题,因为它不会 stringify
在预处理中处理所有表单数据。