2016-07-31 49 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