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); } }
核心错误点分析
URL拼接格式错误
WordPress REST API的参数需要用?或&正确分隔,你直接将page值拼在URL末尾,会导致请求地址无效。比如原URL是https://xxx/wp-json/wp/v2/posts,拼接后会变成https://xxx/wp-json/wp/v2/posts1&categories=xx,这种格式的请求会被API识别为错误路径,返回空数组。缺少
_embed参数
要获取文章的_embedded(含特色图片)字段,必须在请求URL中添加_embed参数,WordPress API默认不会返回该字段。你在浏览器中可能手动补充了该参数,所以能拿到数据,但Volley请求里没加,不仅会导致解析异常,还可能影响数据返回。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
相关产品推荐
相关产品推荐

