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
'mais tous les autres reviennent comme null'. Revenez d'où? Et où les voyez-vous nulle? – greenapps
où sont les params " – djodjo
" 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