Volley JSONArrayRequest - 没有正确发送params?

时间:2015-11-28 23:02:04

标签: java android post android-volley

我已经尝试了正常的JSONArrayRequestsStringRequests,一切都很好,直到现在。我想发送一个带有POST参数的JSONArrayRequest来从脚本中获取JSON格式的MySQL结果。不幸的是,我每次都会得到[]作为回应。我已经使用_GET方法检查了.php文件和查询,并且该脚本完美地返回了Json格式的所需行。 我在这里阅读(https://stackoverflow.com/a/18052417/4959185)Volley团队已将JSONArrayRequest _POST参数添加到他们的班级。但是它在我的情况下不起作用。你能不能看看这个功能有什么问题:

    private void getFavouriteRecipes(final String userUniqueId, final int offset) {

    JsonArrayRequest favouriteRecipesReq = new JsonArrayRequest(Request.Method.POST,
            AppConfig.URL_GETFAVOURITERECIPES, new Response.Listener<JSONArray>() {

                @Override
                public void onResponse(JSONArray response) {
                    Log.d("odpowiedz", "Odpowiedź ulubionych: " + response);

                    for (int i = 0; i < response.length(); i++) {
                        try {
                            JSONObject jObj = response.getJSONObject(i);
                            RecipeItem recipeItem = new RecipeItem();
                            recipeItem.setRecipeUniqueID(jObj.getString("unique_id"));
                            recipeItem.setRecipeTitle(jObj.getString("title"));
                            recipeItem.setRecipeImgThumbnailLink(jObj.getString(
                                    "img_tumbnail_link"));
                            recipeItem.setRecipeAddAte(jObj.getString("add_date"));
                            recipeItem.setRecipeKitchenType(jObj.getString("kitchen_type"));
                            recipeItem.setRecipeMealType(jObj.getString("meal_type"));
                            recipeItem.setRecipeName(jObj.getString("name"));
                            recipeItem.setRecipeSurname(jObj.getString("surname"));
                            recipeItem.setRecipeLikeCount(jObj.getString("like_count"));
                            recipeFavouriteItems.add(recipeItem);
                        } catch (JSONException e) {
                            e.printStackTrace();
                            showSnackbarInfo("Błąd Json: " + e.getMessage(),
                                    R.color.snackbar_error_msg);
                        }
                    }
                    recipeFavouriteItemsAdapter.notifyDataSetChanged();
                }

            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("odpowiedz", "Błąd pobierania ulubionych: " +
                            Integer.toString(error.networkResponse.statusCode));

                    showSnackbarInfo(Integer.toString(error.networkResponse.statusCode),
                            R.color.snackbar_error_msg);
                }

            }) {

        @Override
        protected Map<String, String> getParams() {
            // Posting Parameters to Login URL
            Map<String, String> params = new HashMap<>();
            params.put("user_unique_id", userUniqueId);
            params.put("offset", Integer.toString(offset));

            Log.d(TAG, "wysylam parametry: " + userUniqueId + ", " + Integer.toString(offset));
            return params;
        }
    };

    // Adding Request to Request Queue
    AppController.getInstance().addToRequestQueue(favouriteRecipesReq);
}

我的PHP脚本: https://ideone.com/ZxYzHr

1 个答案:

答案 0 :(得分:1)

我找到了另一种通过发送参数获取JSONArrayResponse的方法。我认为这会对某人有所帮助。

你只需写下标准的JSONArrayRequest:

JsonArrayRequest favouriteRecipesReq = new JsonArrayRequest(prepareGetMethodUrl(),
                new Response.Listener<JSONArray>() {

                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d("odpowiedz", "Odpowiedź ulubionych: " + response.toString());

                        for (int i = 0; i < response.length(); i++) {
                            try {
                                JSONObject jObj = response.getJSONObject(i);
                                RecipeItem recipeItem = new RecipeItem();
                                recipeItem.setRecipeUniqueID(jObj.getString("unique_id"));
                                recipeItem.setRecipeTitle(jObj.getString("title"));
                                recipeItem.setRecipeImgThumbnailLink(jObj.getString(
                                        "img_tumbnail_link"));
                                recipeItem.setRecipeAddAte(jObj.getString("add_date"));
                                recipeItem.setRecipeKitchenType(jObj.getString("kitchen_type"));
                                recipeItem.setRecipeMealType(jObj.getString("meal_type"));
                                recipeItem.setRecipeName(jObj.getString("name"));
                                recipeItem.setRecipeSurname(jObj.getString("surname"));
                                recipeItem.setRecipeLikeCount(jObj.getString("like_count"));
                                recipeFavouriteItems.add(recipeItem);
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        }
                        recipeFavouriteItemsAdapter.notifyDataSetChanged();
                    }

                }, new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.e("odpowiedz", "Błąd pobierania ulubionych: " +
                                Integer.toString(error.networkResponse.statusCode));

                        showSnackbarInfo(Integer.toString(error.networkResponse.statusCode),
                                R.color.snackbar_error_msg);
                    }

                });

        // Adding Request to Request Queue
        AppController.getInstance().addToRequestQueue(favouriteRecipesReq);

而不是PHP脚本的标准URL,我插入的函数返回名为String的{​​{1}}。

让我们看看它内部:

prepareGetMethodUrl()

你可以看到它非常简单。我得到标准的private String prepareGetMethodUrl() { return AppConfig.URL_GETFAVOURITERECIPES + "?user_unique_id=" + userUniqueId + "&offset=" + Integer.toString(offset); } ,它是AppConfig类中的静态字段,用于直接链接到我的serwer AppConfig.URL_GETFAVOURITERECIPES上的PHP脚本,并将其与我需要发送到脚本的参数值相结合:http://www.someserversite.com/my_api/gmy_php_script.php它的内容user_unique_iduserUniqueId内容offset已从offset解析为int

在我的脚本中,我只是打电话:

String