2013-01-25 46 views
2

蟒我有以下代碼從一個簡單的3輸入表格檢索值:解碼JSON使用應用服務引擎

//retrieves data from a form 
var $form = $(this), 
    prgname= $form.find('input[name="prg"]').val(), 
    startDate = $("#startdate").datepicker({ dateFormat: 'yy-mm-dd' }).val(), 
    endDate = $("#enddate").datepicker({ dateFormat: 'yy-mm-dd' }).val(); 

下面的代碼將請求發送到服務器:

var request = $.ajax({ 
     url: "/prg/", 
     type: "post", 
    data: JSON.stringify({prg: prgname, start:startDate, end:endDate}), 
    contentType: 'application/json', 
    dataType: 'json', 
     success: function() {}, 
     error: function (jqXHR, textStatus, errorThrown){}; 

在服務器端使用python和webapp2進行以下操作,(這裏是我不確定的事情)

import json 

class PrgHandler(webapp2.RequestHandler): 
    def post(self): 
     prg= cgi.escape(self.request.POST['prg']) 
     start_date = cgi.escape(self.request.POST['start']) 
     end_date = cgi.escape(self.request.POST['end']) 

     #some code to write to db here 
     .... 
     #if successful return a success message 
     if success: 
      success_msg = [{'class': 'success', 'msg': 'Successfully saved to the database'}] 
     else: 
      success_msg = [{'class': 'error', 'msg': 'Could not saved to the database'}] 

     data_string = json.dumps(success_msg) 
     self.response.headers.add_header('content-type', 'application/json', charset='utf-8') 
     self.response.write(data_string) 

當我得到響應時,它正在跳過成功功能並直接進入錯誤。

記錄錯誤值即時通訊沒有得到有意義的任何事情:

the error is: 
The text status is:error 
The jqXHR is:[object Object] 

Chrome的控制檯是給我的錯誤:

Resource interpreted as Document but transferred with MIME type application/json: 

我指望起來,在這樣的解決方案沒有奏效,我認爲這是與服務器端代碼錯誤:

self.response.headers.add_header('content-type', 'application/json', charset='utf-8') 

如果我註釋掉上述行我沒有錯誤鉻,我只是得到一個空白頁上用正確的值按以下格式的響應:

[{"msg": "Successfully saved to the database", "class": "success"}] 

在上述情況下,它不會保存到數據庫中,所以我似乎無法到發現任何錯誤,除了標題,只是不知道如何繼續!

EDIT 似乎該錯誤是從我已經刪除以下行服務器側: event.preventDefault();

從我的腳本,它造成了所有的問題,現在至少我得到一個明確的問題在哪裏指出。這是由於錯誤地獲取發佈的數據,我如何以正確的方式做到這一點?我試過如下:

​​

但是我得到一個類型錯誤:預期的字符串或緩衝區上以下行: json_data = self.request.GET.items()

回答

3

行,所以我設法弄清楚這一點,我想我會張貼工作對我來說,幫助的人的答案尋找,因爲此信息webapp2文檔對於「獲取」發佈的json數據並沒有什麼幫助。

在客戶端

我做了以下內容:

var request = $.ajax({ 
    url: "/some/url/", 
    type: "POST", 
    data: JSON.stringify([{someval: val1, someval2:val2, someval3:val3}]), 
    contentType: "application/json", 
    dataType: 'json', 
    beforeSend: function() { 
     $('#loading-div').show(); 
    }, 
    complete: function(){ 
     $('#loading-div').hide(); 
    }, 
    success: function(response, textStatus, jqXHR){} 
}); 

我不能找出問題馬上是以下行,我有一些註釋掉線,從防止頁一併刪除,因爲原因發佈後重定向。這是所有的怪異,不相關的和無益的錯誤消息的來源:在服務器端

event.preventDefault(); 

得到被張貼JSON數據到AppEngine上做到以下幾點:

jdata = json.loads(cgi.escape(self.request.body)) 
    for vals in jdata: 
     val1 = vals['someval'] 
     val2 = vals['someval2'] 
     val3 = vals['someval3'] 

以上是問題的根源我沒有做到這一點,如果沒有客戶端的上一行,就沒有辦法弄清楚。

反正一旦你的數據你需要用它做的,一旦你完成,需要發回一個JSON響應添加下列行任何處理:

//the data would look something like this 
data = {'return_value': val1, 'return_value2': val2, 
     'return_value3': val3, 'return_value4': val4} 

     return_data = json.dumps(data) 
     self.response.headers.add_header('content-type', 'application/json', charset='utf-8') 
     self.response.write(return_data) 

差點忘了在客戶端再次訪問從服務器使用jQuery發回的變量,它非常簡單...做這樣的事情:

success: function(response, textStatus, jqXHR){ 
     console.log(response.return_value); 
     console.log(response.return_value2); 
     console.log(response.return_value3); 
} 

希望這會幫助別人尋找這些信息。

+0

是的,這並沒有很好地記錄在案在webapp2文檔中。你會期望json內容在request.POST變量中。 – ericso

4

在有你的調試器看看。您在帖子中收到JSON字符串(webapp2 multidict)。你必須使用json.loads解碼這個字符串,產生一個python對象。

這裏是我的jQuery代碼來發送和接收JSON:

function gaeQuery(request) { 
    var url = "/query"; 
    var payload = {'jsondata' : JSON.stringify(request)}; 
    $.post(
    url, 
    payload, 
    function(response) { 
     procesResponse(response); 
    }, // succes response callback 
    'json', // response contains JSON content, and will be decoded in a js object 
    { 
     contentType: "application/json;charset=utf-8", // send JSON content 
     timeout: 20000, 
     tryCount: 0, 
     retryLimit: 3, // max 3 retries    
     error: function(xhr, textStatus, errorThrown) { // error handling callback 
      if (textStatus === 'timeout') { 
       this.tryCount++; 
       if (this.tryCount <= this.retryLimit) { //try again until retryLimit 
        $.ajax(this); 
        return; 
       } 
       alert('We have tried ' + this.retryLimit + ' times and it is still not working. We give in. Sorry.'); 
       return; 
      } 
      if (xhr.status === 500) { // internal server error 
       alert('Oops! There seems to be a server problem, please try again later.'); 
      } 
      else { 
       alert('Oops! There was a problem, sorry.'); // something went wrong 
      } 
     } 
    } 
    ); 
} 
+0

好吧,看起來像是在服務器端獲取發佈的數據的錯誤,你知道什麼是正確的方式嗎? – Tkingovr

+1

查看文檔:http://webapp-improved.appspot.com/guide/request.html#post-data:jsondata = self.request.POST ['jsondata'] – voscausa