2016-05-23 1 views
0

Ich mache eine grundlegende mobile App, um mit einer Nosql-Datenbank zu interagieren. Bis jetzt hatte ich keine Probleme mit Volley. Ich habe zwei Hauptelemente in meiner Datenbank, und beide speichern alle ihre Attribute als Zeichenfolgen. Mit einer Entität funktioniert Volleys GET und POST gut, aber mit der anderen Entität funktioniert die GET-Anfrage, aber nicht die POST-Anfrage (einige Parameter sind null).POST-Anfrage mit Volley

Die Seite, mit der ich Probleme habe, soll dem Benutzer erlauben, Daten zu bearbeiten, die er bereits eingegeben hat. Ich befülle es zuerst mit einer Volley GET-Anfrage. Das funktioniert einwandfrei und alle Parameter werden korrekt angezeigt. Wenn der Benutzer dann die Daten ändert und sie übermittelt, wird sie mit einer POST-Anforderung gesendet, was fehlschlägt, weil einige der Parameter null sind.

Ich habe den Fehler (ich denke) auf die Funktion getParams() eingegrenzt. Die Variablen generals und victors sind ausgefüllt, alle anderen sind jedoch null. Auch hier sind alle meine Variablen Zeichenfolgen, daher scheint es kein inkompatibler Datentyp zu sein.

Hier ist der Code, den ich habe:

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

Hier ist der Code für die API ist, die ich in Python tat. Ich kann mit curl Tests oder der Postbote App manuell Post, und alle Daten korrekt aufgefüllt und in der Datenbank gespeichert:

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

'aber alle anderen zurückkommen als null'. Von Komm zurück, wo? Und wo sehen Sie sie null? – greenapps

+0

wo diese params sind zugewiesen? – djodjo

+0

'Volley's GET und POST funktioniert gut." Ok. Sie funktionieren gut. ', aber mit der anderen Entität funktioniert die GET-Anfrage, aber nicht die POST-Anfrage (einige Parameter sind null)." Sudendy sie funktionieren nicht gut ? Welche andere Entität? – greenapps

Antwort

0

Versuchen Sie, eine andere Syntax und Art der Anfrage für Ihren Fall:

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

Ich habe den Fehler gefunden. Es hatte nichts mit dem Volley-Code selbst zu tun; Was ich hatte, arbeitete tatsächlich. Das Problem war, dass ich vergessen hatte, dass ich einen Teil des Eingabeverifizierungscodes auskommentierte und dabei den Text aus diesen beiden Feldern nicht abrief.

Zu einem früheren Zeitpunkt im Projekt hatte ich die Eingabeverifizierung so eingerichtet, dass Benutzer keine ungültigen Zeichen übermitteln konnten. Ich hatte das nicht für die Datumsfelder eingerichtet, also habe ich einen Teil dieses Codes kommentiert ... einschließlich der Zeilen, die die Methode getText(). ToString() für jedes Feld aufgerufen haben. Also hat es die Inputs von diesen Feldern buchstäblich nie eingezogen. Es ist so offensichtlich im Nachhinein ....... :(

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