web-dev-qa-db-fra.com

Comment créer une demande Volley JSONObject avec un objet personnalisé en tant que paramètre?

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);
10
Aido

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

17
wbelarmino
 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);
}
0