2016-05-23 1 views
0

Je fais une application mobile de base pour interagir avec une base de données nosql. Jusqu'à présent, je n'ai eu aucun problème à utiliser Volley. J'ai deux entités principales dans ma base de données, et les deux stockent tous leurs attributs en tant que chaînes. Avec une entité, GET et POST de Volley fonctionnent bien, mais avec l'autre entité, la requête GET fonctionne mais pas la requête POST (certains paramètres sont NULL).demande POST avec Volley

La page qui me pose problème a pour but de permettre à l'utilisateur d'éditer les données qu'il a déjà saisies. Je les ai d'abord rempli avec une requête Volley GET. Cela fonctionne bien et tous les paramètres s'affichent correctement. Ensuite, si l'utilisateur modifie les données et les soumet, il est soumis avec une requête POST, qui échoue car certains des paramètres sont NULL.

J'ai réduit l'erreur (je pense) à la fonction getParams(). Les variables des généraux et des vainqueurs sont remplies, mais toutes les autres sont nulles. Encore une fois, toutes mes variables sont des chaînes, donc cela ne semble pas être un type de données incompatible.

Voici le code que j'ai:

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; 
} 

Voici le code pour l'API, que je l'ai fait en Python. Je peux manuellement POST en utilisant des tests papillotes ou l'application Postman, et toutes les données sont correctement rempli et enregistré dans la base de données:

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

'mais tous les autres reviennent comme null'. Revenez d'où? Et où les voyez-vous nulle? – greenapps

+0

où sont les params " – djodjo

+0

" Le GET et le POST de Volley fonctionnent bien. "Ok. Ils fonctionnent bien.", mais avec l'autre entité, la requête GET fonctionne mais pas la requête POST (certains paramètres sont NULL). »Soudain ils ne fonctionnent pas bien ? Quelle autre entité? – greenapps

Répondre

0

Essayez une syntaxe différente et le type de demande pour votre cas:

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

J'ai trouvé l'erreur. Il a fini par n'avoir rien à voir avec le code Volley lui-même; ce que j'ai eu fonctionnait réellement. Le problème était que j'avais oublié que j'avais commenté une partie du code de vérification d'entrée, et que, ce faisant, il ne prenait pas le texte de ces deux champs.

Plus tôt dans le projet, la vérification des entrées a été configurée pour que les utilisateurs ne puissent pas soumettre de caractères non valides. Je n'avais pas cette configuration pour les champs de date, donc j'ai commenté une partie de ce code ... y compris les lignes qui appelaient la méthode getText(). ToString() pour chaque champ. Donc, littéralement, cela n'entraînait jamais l'entrée de ces champs. Il est tellement évident rétrospectivement ....... :(

  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(); 
      } 
     } 
    });