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