私は、JSONObject POSTリクエストを、Volleyライブラリを使用して、オブジェクト(アドレス)とさまざまなオブジェクト(テナント)のリストの2つのパラメーターを取得するサーバーに要求します。
リクエストを送信しようとすると、最初のパラメーター(Address)が送信される前にVolleyによってフォーマットされ、サーバーがリクエストを受け入れません。
私のリクエストは次のようになります:
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST, SERVER_URL,
postPropertyJSONObject, responseListener, errorListener)
私のpostPropertyJSONObjectは次のように作成されます:
JSONObject obj = new JSONObject();
obj.put("Address", convertAddressToJson(property.getAddress()).toString());
obj.put("Tenants", prop.getTenantList());
ConvertAddressToJson()メソッドは次のようになります。
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());
Addressオブジェクトを渡してみましたが、これはシリアル化されていなかったため、機能しませんでした。また、リクエストで使用したJSONObjectの「Address」フィールドにAddress.toString()を渡してみましたが、どちらも機能しませんでした。
プロパティオブジェクトのgetAddress()メソッドは、次のようなアドレスオブジェクトを返します。
public class Address {
private String Street;
private String Building;
private String Town;
private String ZipCode;
private String County;
private String Country;
// getters and setters
}
リクエストを渡す前にアドレスを記録すると、リクエストは次のようになります。
{"Town":"MyTown","Street":"MyStreet","County":"MyCounty","Country":"MyCountry",
"ZipCode":"MyZipCode","Building":"MyBuilding"}
しかし、サーバーが受信したものをログに記録すると、次のようになります。
{\"Town\":\"MyTown\",\"Street\":\"MyStreet\",\"County\":\"MyCounty\",
\"Country\":\"MyCountry\",\"ZipCode\":\"MyZipCode\",\"Building\":\"MyBuilding\"}"
Volleyによって適用されたこのフォーマットは、リクエストで渡す値を変更しているようです。そのため、このタスクにアプローチするための比較的簡単なより良い方法があるかどうかを誰かに教えてもらえますか? StringとIntegerの値を使用して同じサーバーにリクエストを送信しましたが、カスタムクラスをパラメーターとして渡そうとしたときにこの問題が発生しました。
[〜#〜]編集[〜#〜]
Wbelarminoのヒントを使用して、ハッシュマップを使用するように切り替えてカスタムオブジェクトを格納し、そこからJSONObjectを作成しました。
HashMap<String, Address> params = new HashMap<String, Address>();
params.put("Address", prop.getAddress());
requestObject = new JSONObject(params);
あなたはこれを試すことができます:
final String URL = "/volley/resource/12";
サーバーに送信される投稿パラメーター
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);
}