Android Volley POST JsonObject 并获取 JsonArray 或 JsonObject 或其他响应

Android Volley POST JsonObject and get JsonArray or JsonObject or Other response

在 volley 中,我们有一些能力从服务器检索数据,例如 jsonObject、jsonArray 和 String。在下面的示例中,我们可以简单地从服务器获取 jsonObject 或 jsonArray 响应,

public static void POST(HashMap<String, String> params, final Listeners.ServerResponseListener listener) {
    JsonObjectRequest req1 = new JsonObjectRequest(ApplicationController.URL, new JSONObject(params),
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.e("Response:", response.toString());
                    if (listener != null)
                        listener.onResultJsonObject(response);
                    else
                        Log.e(TAG,"Error: SetServerResponse interface not set");
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e("Error: ", error.getMessage());
        }
    });
    ApplicationController.getInstance().addToRequestQueue(req1);
}

我的问题是我想通过此方法发送 jsonObject 并从服务器获取 jsonArray 或 jsonObject,但我无法使用此方法从服务器获取简单的数组。例如,我必须使用此 jsonObject 过滤服务器响应:

HashMap<String, String> params = new HashMap<String, String>();
params.put("token", "AbCdEfGh123456");
params.put("search_count", "10");
params.put("order_by", "id");

服务器 return jsonArray,我无法通过 Volley 响应获得它

正在查看 JsonArrayRequest 的源代码。有一个接受 JSONObject 的构造函数。你应该看看

public class RetreiveData {

    public static final String TAG = RetreiveData.class.getSimpleName();

    public static void POST(String localhost, final HashMap<String, String> params, final Listeners.ServerResponseListener listener) {
        StringRequest post = new StringRequest(Request.Method.POST, localhost, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                try {
                    if (listener != null)
                        listener.onResponse(response.toString());
                    else
                        Log.e(TAG, "Error: SetServerResponse interface not set");
                } catch (Exception e) {
                    e.printStackTrace();
                    Log.d("Error: ", e.getMessage());
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("Error: ", error.toString());
            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> map = params;
                return map;
            }

            @Override
            public RetryPolicy getRetryPolicy() {
                setRetryPolicy(new DefaultRetryPolicy(
                        5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
                return super.getRetryPolicy();
            }
        };
        ApplicationController.getInstance().addToRequestQueue(post);
    }
}