2016-05-23 186 views
0

我正在製作一個基本的移動應用程序來與nosql數據庫進行交互。到目前爲止,我沒有使用過Volley的問題。我的數據庫中有兩個主要實體,都將它們的所有屬性存儲爲字符串。對於一個實體,Volley的GET和POST可以正常工作,但對於另一個實體,GET請求可以工作,但不是POST請求(某些參數爲空)。Volley POST請求

我遇到麻煩的網頁是爲了讓用戶編輯他/她已經放入的數據。我首先使用Volley GET請求填充它。這工作正常,所有參數正確顯示。然後,如果用戶更改數據並提交數據,則會提交一個POST請求,該請求由於某些參數爲空而失敗。

我已經縮小了錯誤(我認爲)到getParams()函數。將軍和勝利者變量是填充的,但所有其他變量都返回爲空。再一次,我所有的變量都是字符串,所以它看起來不像一個不兼容的數據類型。

這裏是我的代碼:

RequestQueue queue = Volley.newRequestQueue(this); 

    StringRequest postRequest = new StringRequest(Request.Method.POST, url, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 

        if (response != null) { 
         try { 
          Toast.makeText(EditDeleteDetail.this, "Detail Updated", Toast.LENGTH_LONG).show(); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
        Log.e(TAG, response); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        error.printStackTrace(); 
       } 
      } 
    ) { 
     @Override 
     protected Map<String, String> getParams() { 
      Map<String, String> params = new HashMap<>(); 

      params.put("generals", generals); 
      Log.d("Params generals", generals); 
      params.put("victor", victor); 
      Log.d("Params victor", victor); 
      params.put("ramifications", ramifications); 
      Log.d("Params ramifications", ramifications); 
      params.put("casualties", casualties); 
      Log.d("Params casualties", casualties); 
      params.put("startdate", startdate); 
      Log.d("Params startdate", startdate); 
      params.put("enddate", enddate); 

      return params; 
     } 
    }; 
    queue.add(postRequest); 

    return true; 
} 

這裏的API,這是我在Python做的代碼。我可以手動POST使用curl測試或郵遞員的應用程序,所有的數據都是正確填充並保存在數據庫中:

import webapp2 
from google.appengine.ext import ndb 
import db_models 
import json 

class Detail(webapp2.RequestHandler): 
def post(self, **kwargs): 
    """Creates a Detail entity 

    POST Body Variables: 
    generals- String. List of commanding generals 
    victor - String. Winner (if any) of battle 
    ramifications - String. Results and implications of the battle 
    casualties - Stored as string, but also includes integers. Participating armies' casualties 
    startdate - Date property 
    enddate - Date property 
    """ 
    if 'application/json' not in self.request.accept: 
     self.response.status = 406 
     self.response.status_message = "Not Acceptable, API only supports application/json MIME type" 
     return 
    if 'did' in kwargs: 
     curr_det = ndb.Key(db_models.Details, int(kwargs['did'])).get() 
     generals = self.request.get('generals', default_value=None) 
     victor = self.request.get('victor', default_value=None) 
     ramifications = self.request.get('ramifications', default_value=None) 
     casualties = self.request.get('casualties', default_value=None) 
     startdate = self.request.get('startdate', default_value=None) 
     enddate = self.request.get('enddate', default_value=None) 
     if generals: 
      curr_det.generals = generals 
     if victor: 
      curr_det.victor = victor 
     if ramifications: 
      curr_det.ramifications = ramifications 
     if casualties: 
      curr_det.casualties = casualties 
     if startdate: 
      curr_det.startdate = startdate 
     if enddate: 
      curr_det.enddate = enddate 
     curr_det.put() 
     out = curr_det.to_dict() 
     self.response.write(json.dumps(out)) 

    else: 
     new_detail = db_models.Details() #making a new Detail 
     generals = self.request.get('generals', default_value=None) 
     victor = self.request.get('victor', default_value=None) 
     ramifications = self.request.get('ramifications', default_value=None) 
     casualties = self.request.get('casualties', default_value=None) 
     startdate = self.request.get('startdate', default_value=None) 
     enddate = self.request.get('enddate', default_value=None) 
     if generals: 
      new_detail.generals = generals 
     else: 
      self.response.status = 400 
      self.response.status_message = "Invalid request, Commanding generals are Required" 
      return 
     if victor:  
      new_detail.victor = victor 
     if ramifications: 
      new_detail.ramifications = ramifications 
     if casualties: 
      new_detail.casualties = casualties 
     if startdate: 
      new_detail.startdate = startdate 
     if enddate: 
      new_detail.enddate = enddate  
     key = new_detail.put() #this saves the new Detail in the database 
     out = new_detail.to_dict()  #then we return the thing we just made 
     self.response.write(json.dumps(out)) 
     return 
+0

',但所有其他的回來爲null'。從哪兒來了?而且,你在哪裏看到他們空? – greenapps

+0

那些人在那裏PARAMS分配? – djodjo

+0

'Volley的GET和POST工作正常'。好吧。它們工作正常。',但是對於另一個實體,GET請求可以工作,但不是POST請求(某些參數爲空).'。Suddendy它們不能正常工作?哪個其他實體? – greenapps

回答

0

嘗試爲你的情況不同的語法和請求類型:

Map<String, Object> jsonParams = new ArrayMap<>(); 
jsonParams.put("nodeId", null); 
jsonParams.put("userId", null); 
jsonParams.put("email", "[email protected]"); 
jsonParams.put("userProfile", null); 
jsonParams.put("region", null); 
jsonParams.put("password", 123); 
jsonParams.put("places", new ArrayList()); 

JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, new JSONObject(jsonParams), 
     new Response.Listener<JSONObject>() 
     { 
      @Override 
      public void onResponse(JSONObject response) 
      { 
       //print it here and check 
      } 
     }, 
     new Response.ErrorListener() 
     { 
      @Override 
      public void onErrorResponse(VolleyError error) 
      { 
       if (null != error.networkResponse) 
       { 
       //do whatever 
       } 
      } 
     }); 
0

我發現了錯誤。它最終與Volley代碼本身沒有任何關係;我所做的實際上是在工作。問題是我忘記了我註釋了一些輸入的驗證碼,並且這樣做並沒有從這兩個字段中提取文本。

在項目早期,我設置了輸入驗證,以便用戶無法提交無效字符。我沒有設置日期字段,所以我評論了一些代碼......包括爲每個字段調用getText()。toString()方法的行。所以它從來沒有從這些領域的投入拉動。這回想起來那麼明顯....... :(

  startdate = startDateEditText.getText().toString(); 
      System.out.println(startdate); 
      if (!isValidDate(startdate)) { 
       startDateEditText.setError("Invalid input."); 
       isValidInput = false; 
      } 

      enddate = endDateEditText.getText().toString(); 
      System.out.println(enddate); 
      if (!isValidDate(enddate)) { 
       endDateEditText.setError("Invalid input."); 
       isValidInput = false; 
      } 

      if (isValidInput) { 
       newPostRequest(); 
       finish(); 
      } 
     } 
    });