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
'aber alle anderen zurückkommen als null'. Von Komm zurück, wo? Und wo sehen Sie sie null? – greenapps
wo diese params sind zugewiesen? – djodjo
'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