it-swarm.com.de

Wie erstelle ich eine Volley-JSONObject-Anforderung mit einem geänderten Objekt als Parameter?

Ich versuche, eine JSONObject POST -Anforderung mit der Volley-Bibliothek an einen Server zu senden, der 2 Parameter, ein Objekt (Adresse) und eine Liste verschiedener Objekte (Tenants) annimmt.

Wenn ich versuche, die Anfrage zu stellen, wird der erste Parameter (Adresse) von Volley formatiert, bevor er gesendet wird, und die Anfrage wird vom Server nicht akzeptiert.

Meine Anfrage sieht ungefähr so ​​aus:

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST, SERVER_URL,
    postPropertyJSONObject, responseListener, errorListener)

Mein postPropertyJSONObject wird folgendermaßen erstellt:

JSONObject obj = new JSONObject();
obj.put("Address", convertAddressToJson(property.getAddress()).toString());
obj.put("Tenants", prop.getTenantList());

Die convertAddressToJson () -Methode sieht folgendermaßen aus:

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

Ich habe nur versucht, das Address-Objekt zu übergeben, aber dieses wurde überhaupt nicht serialisiert, daher funktionierte es auch nicht. Ich habe auch versucht, einfach Address.toString () im Feld "Address" des JSONObjects zu übergeben, das in der Anfrage verwendet wurde, aber das hat auch nicht funktioniert.

Die getAddress () -Methode meines Property-Objekts gibt ein Address-Objekt zurück, das ungefähr wie folgt aussieht:

public class Address {

    private String Street;
    private String Building;
    private String Town;
    private String ZipCode;
    private String County;
    private String Country;
    // getters and setters
}

Wenn ich die Adresse protokolliere, bevor ich sie übergeben habe, sieht die Anforderung folgendermaßen aus:

{"Town":"MyTown","Street":"MyStreet","County":"MyCounty","Country":"MyCountry",
 "ZipCode":"MyZipCode","Building":"MyBuilding"}

Wenn der Server jedoch protokolliert, was er erhalten hat, sieht das so aus:

{\"Town\":\"MyTown\",\"Street\":\"MyStreet\",\"County\":\"MyCounty\",
 \"Country\":\"MyCountry\",\"ZipCode\":\"MyZipCode\",\"Building\":\"MyBuilding\"}"

Diese von Volley angewendete Formatierung scheint den Wert, den ich mit meiner Anfrage übergeben habe, zu ändern. Kann mir jemand sagen, ob es einen besseren Weg gibt, um diese Aufgabe zu lösen, die relativ einfach sein sollte? Ich habe mit denselben String- und Integer-Werten Anforderungen an denselben Server gesendet. Dieses Problem hatte ich jedoch beim Versuch, eine benutzerdefinierte Klasse als Parameter zu übergeben.

EDIT

Mit dem Tipp von wbelarmino wechselte ich zur Verwendung einer Hashmap zum Speichern meines benutzerdefinierten Objekts und erstellte daraus ein JSONObject:

HashMap<String, Address> params = new HashMap<String, Address>();
params.put("Address", prop.getAddress());
requestObject = new JSONObject(params);
10
Aido

Sie können dies versuchen:

final String URL = "/volley/resource/12";

Post-Params zum Senden an den Server

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

Weitere HTTP-Anfragen in 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