You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中Volley调用WordPress接口返回空数组求助

问题分析与解决方案:Volley获取WordPress文章返回空数组

问题描述

我在Android应用中使用Volley从WordPress站点获取分类与文章数据,分类数据可正常返回并添加至列表,但获取文章时返回空数组。该请求URL在浏览器中可正常返回数据,请问我哪里操作有误?

原代码

public void extractCategories() { 
    String URL = getResources().getString(R.string.categories_url);

    JsonArrayRequest request = new JsonArrayRequest(Request.Method.GET, URL, null,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    Log.d(TAGC, "onResponse: " + response.toString());
                    for (int i = 0; i < response.length(); i++) {
                        try {
                            Category c = new Category();

                            JSONObject jsonObjectData = response.getJSONObject(i);

                            // 提取id
                            c.setId(jsonObjectData.getInt("id"));

                            // 提取名称
                            c.setName(jsonObjectData.getString("name"));

                            // 提取父分类id
                            c.setParent(jsonObjectData.getInt("parent"));

                            // 提取文章数量
                            c.setCount(jsonObjectData.getInt("count"));

                            cat_list.add(c);
                            extractPosts(i); // 调用获取文章的方法

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }
                    adapter.notifyDataSetChanged();

                }

            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

    MySingletonVolley.getInstance(getBaseContext()).addToRequestQueue(request);

}


public void extractPosts(int i) {
    int cont = 0;
    String URL = getResources().getString(R.string.posts_url);

        int cant_post_real = this.cat_list.get(i).getCount(); 
        int page = 0;
        while ( cant_post_real > 0) {
            page++;
            String complete_url = URL + page + "&categories=" + this.cat_list.get(i).getId(); 

            JsonArrayRequest request1 = new JsonArrayRequest(Request.Method.GET, complete_url, null,
                    new Response.Listener<JSONArray>() {
                        @Override
                        public void onResponse(JSONArray response) {
                            Log.d(TAG, "onResponse: " + response.toString());
                            for (int k = 0; k < response.length(); k++) {
                                try {
                                    Post p = new Post();

                                    JSONObject jsonObjectData = response.getJSONObject(k);

                                    // 提取标题
                                    JSONObject titleObject = jsonObjectData.getJSONObject("title");
                                    p.setTitle(titleObject.getString("rendered"));

                                    // 提取内容
                                    JSONObject contentObject = jsonObjectData.getJSONObject("content");
                                    p.setContent(contentObject.getString("rendered"));

                                    // 提取摘要
                                    JSONObject excerptObject = jsonObjectData.getJSONObject("excerpt");
                                    p.setExcerpt(excerptObject.getString("rendered"));

                                    // 提取特色图片
                                    JSONObject embeddedObject = jsonObjectData.getJSONObject("_embedded");
                                    JSONArray wpfeaturemediaArray = embeddedObject.getJSONArray("wp:featuredmedia");
                                    JSONObject firstElement = wpfeaturemediaArray.getJSONObject(0);
                                    p.setFeature_image(firstElement.getString("source_url"));

                                    posts.add(p);
                                    adapter.notifyDataSetChanged();

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }


                            }


                        }
                    }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
            cant_post_real = cant_post_real - 10;
            MySingletonVolley.getInstance(getBaseContext()).addToRequestQueue(request1);
        }
    }

核心错误点分析

  1. URL拼接格式错误
    WordPress REST API的参数需要用?或&正确分隔,你直接将page值拼在URL末尾,会导致请求地址无效。比如原URL是https://xxx/wp-json/wp/v2/posts,拼接后会变成https://xxx/wp-json/wp/v2/posts1&categories=xx,这种格式的请求会被API识别为错误路径,返回空数组。

  2. 缺少_embed参数
    要获取文章的_embedded(含特色图片)字段,必须在请求URL中添加_embed参数,WordPress API默认不会返回该字段。你在浏览器中可能手动补充了该参数,所以能拿到数据,但Volley请求里没加,不仅会导致解析异常,还可能影响数据返回。

  3. JSON解析容错性不足
    直接调用getJSONObject("_embedded")如果该字段不存在,会抛出JSON异常,中断后续的文章数据添加逻辑,导致看起来像返回空数组。

修复方案

1. 修正URL拼接逻辑

确保参数格式正确,同时添加_embed参数:

public void extractPosts(int i) {
    // ...其他代码
    while ( cant_post_real > 0) {
        page++;
        // 处理URL参数分隔符,兼容原URL已有参数的情况
        String separator = URL.contains("?") ? "&" : "?";
        String complete_url = URL + separator + "page=" + page + "&categories=" + this.cat_list.get(i).getId() + "&_embed";
        // ...后续请求代码
    }
}

2. 完善JSON解析的容错处理

在提取特色图片时先判断字段是否存在,避免异常中断:

// 提取特色图片
if (jsonObjectData.has("_embedded")) {
    JSONObject embeddedObject = jsonObjectData.getJSONObject("_embedded");
    if (embeddedObject.has("wp:featuredmedia")) {
        JSONArray wpfeaturemediaArray = embeddedObject.getJSONArray("wp:featuredmedia");
        if (wpfeaturemediaArray.length() > 0) {
            JSONObject firstElement = wpfeaturemediaArray.getJSONObject(0);
            p.setFeature_image(firstElement.getString("source_url"));
        }
    }
}

3. 增强错误日志排查

在错误回调中打印更详细的信息,方便定位问题:

@Override
public void onErrorResponse(VolleyError error) {
    String errorMsg = "获取文章失败";
    if (error.networkResponse != null) {
        errorMsg += ",状态码:" + error.networkResponse.statusCode;
        try {
            String responseBody = new String(error.networkResponse.data, "utf-8");
            errorMsg += ",响应内容:" + responseBody;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
    Toast.makeText(MainActivity.this, errorMsg, Toast.LENGTH_SHORT).show();
    Log.e(TAG, "文章请求错误详情:", error);
}

内容的提问来源于stack exchange,提问作者Alexeider Rodriguez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:45:39