2016-07-31 52 views
4

目标是成功将新作业发布到马拉松REST API。我正在使用jQuery v1.12.4ajax请求中的json无效

以下代码是从窗体获取值并将有效的json打印到console.log。我已经使用JSONLint对其进行了验证。但它似乎没有进入服务器。这里是一个的被打印到日志中的JSON和我看到的萤火:

{"id":"basic-0","cpus":"0.1","mem":"32","instances":"1","cmd":"while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done"} 

我得到400错误的请求,然后我看到这个疯狂的响应(萤火虫):

{"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:[email protected].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,等我会后,当我弄明白,因为我的数字有人否则必须有这个相同的问题。

回答

2

该错误明确指出该服务需要一个数字而不是字符串cpus,meminstances字段。尝试发布此JSON:

{ 
    "id": "basic-0", 
    "cpus": 0.1, 
    "mem": 32, 
    "instances": 1, 
    "cmd": "while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done" 
} 
2

为什么你要去的var form2json = JSON.stringify($('form').serializeObject()); ... data: form2json所有的努力时,你可以做data: $("form").serialize()?这可能会解决您的预期整数问题,因为它不是在预处理中的所有表单数据。

+2

我自己发现了这个问题,并回来回答我自己的问题。但是,**谢谢** Akis和Jonathan。乔纳森,我会尝试serializeObject,但我读它(或serializeArray)没有处理所有各种形式的可能性,如复选框等,我希望你是对的。 –

+0

Akis的答案基本上是正确的,但没有给你一个特别的解决方案。 jQuery的'serialize()'最常用于获取AJAX的表单数据。你只想用当时知道的具体原因来使用替代品。无论如何感谢您的投票 – Jonathan

+0

请参阅[this fiddle](https://jsfiddle.net/ge2j4hk2/)。在jQuery中没有'serializeObject()',所以我假设你正在使用一些插件 – Jonathan