J'essaie de faire une demande JSONObject POST à l'aide de la bibliothèque Volley à un serveur qui prend 2 paramètres, un objet (Address) et une liste de différents objets (Tenants).
Lorsque j'essaie de faire la demande, le premier paramètre (Address) est formaté par Volley avant son envoi et la demande n'est pas acceptée par le serveur.
Ma demande ressemble à ceci:
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST, SERVER_URL,
postPropertyJSONObject, responseListener, errorListener)
Mon postPropertyJSONObject est créé comme suit:
JSONObject obj = new JSONObject();
obj.put("Address", convertAddressToJson(property.getAddress()).toString());
obj.put("Tenants", prop.getTenantList());
La méthode convertAddressToJson () ressemble à ceci:
JSONObject jsonObject= new JSONObject();
jsonObject.put("Building", address.getBuilding());
jsonObject.put("Street", address.getStreet());
jsonObject.put("Town", address.getTown());
jsonObject.put("ZipCode", address.getZipCode());
jsonObject.put("County", address.getCounty());
jsonObject.put("Country", address.getCountry());
J'ai essayé de passer simplement dans l'objet Address, mais celui-ci n'était pas du tout sérialisé, donc cela ne fonctionnait pas non plus. J'ai aussi essayé de passer Address.toString () dans le champ "Address" du JSONObject utilisé dans la requête, mais cela ne fonctionnait pas non plus.
La méthode getAddress () de mon objet Property renvoie un objet Address qui ressemble à ceci:
public class Address {
private String Street;
private String Building;
private String Town;
private String ZipCode;
private String County;
private String Country;
// getters and setters
}
Lorsque je me connecte l'adresse avant de la transmettre, la requête ressemble à ceci:
{"Town":"MyTown","Street":"MyStreet","County":"MyCounty","Country":"MyCountry",
"ZipCode":"MyZipCode","Building":"MyBuilding"}
Mais lorsque le serveur enregistre ce qu'il a reçu, il se présente comme suit:
{\"Town\":\"MyTown\",\"Street\":\"MyStreet\",\"County\":\"MyCounty\",
\"Country\":\"MyCountry\",\"ZipCode\":\"MyZipCode\",\"Building\":\"MyBuilding\"}"
Ce formatage appliqué par Volley semble modifier la valeur que je transmets à ma demande. Quelqu'un peut-il me dire s'il existe une meilleure façon d'aborder cette tâche qui devrait être relativement simple? J'ai fait des demandes au même serveur en utilisant les valeurs String et Integer, mais j'ai eu ce problème en essayant de passer une classe personnalisée en paramètre.
MODIFIER
En utilisant le conseil de wbelarmino, je suis passé à l'aide d'une hashmap pour stocker mon objet personnalisé et j'ai créé un JSONObject à partir de celui-ci:
HashMap<String, Address> params = new HashMap<String, Address>();
params.put("Address", prop.getAddress());
requestObject = new JSONObject(params);
Vous pouvez essayer ceci:
final String URL = "/volley/resource/12";
Publier les paramètres à envoyer au serveur
HashMap<String, String> params = new HashMap<String, String>();
params.put("token", "AbCdEfGh123456");
JsonObjectRequest req = new JsonObjectRequest(URL, new JSONObject(params),
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
VolleyLog.v("Response:%n %s", response.toString(4));
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.e("Error: ", error.getMessage());
}
});
Voir plus Requêtes Http dans Android usingvolley
final RequestQueue requestQueue = Volley.newRequestQueue(this);
final String url ="http://mykulwstc000006.kul/Services/Customer/Register";
Map<String, String> params = new HashMap<String, String>();
params.put("MobileNumber", "+97333765439");
params.put("EmailAddress", "[email protected]");
params.put("FirstName", "Danish2");
params.put("LastName", "Hussain2");
params.put("Country", "BH");
params.put("Language", "EN");
JsonObjectRequest req = new JsonObjectRequest(url, new JSONObject(params),
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
VolleyLog.v("Response:%n %s", response.toString(4));
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.e("Error: ", error.getMessage());
}
}){
@Override
public String getBodyContentType() {
return "application/json; charset=utf-8";
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
String username ="[email protected]";
String password = "elie73";
String auth =new String(username + ":" + password);
byte[] data = auth.getBytes();
String base64 = Base64.encodeToString(data, Base64.NO_WRAP);
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Authorization","Basic "+base64);
return headers;
}
};
requestQueue.add(req);
}