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 当我想通了,因为我想 其他人 一定有同样的问题。

该错误清楚地表明该服务需要数字而不是 cpusmeminstances 字段的字符串。尝试 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 在预处理中处理所有表单数据。