如何在不修改现有PHP及JS的情况下从Android Java应用向PHP传数组
问题解决:Android向PHP传递数组无需修改原有代码
现有PHP服务端代码已支持接收数组类型参数,此前一直由JavaScript通过AJAX调用传递数组。现在需要从Android Java应用向该PHP接口传递数组,但要求不修改现有PHP及JavaScript代码。
之前尝试将JSON数组转为字符串传递,但PHP无法识别为数组。最终参考jQuery AJAX的参数编码规则,将数组编码为key%5B%5D=value1&key%5B%5D=value2格式(%5B%5D是[]的URL编码),通过修改Android端的buildParameterString方法,使用android.util.Pair存储参数,实现了数组的正确传递,无需改动原有服务端和前端代码。
原有PHP处理代码
foreach($_POST as $key => $value) { if (is_array($_POST[$key])){ for ($index = 0; $index < count($_POST[$key]); $index++){ if(ini_get('magic_quotes_gpc')) $_POST[$key][$index] = stripslashes($_POST[$key][$index]); $_POST[$key][$index] = htmlspecialchars(strip_tags($_POST[$key][$index])); } } else { if(ini_get('magic_quotes_gpc')) $_POST[$key] = stripslashes($_POST[$key]); $_POST[$key] = htmlspecialchars(strip_tags($_POST[$key])); } }
原有JavaScript AJAX代码片段
$.ajax({ type: "POST", url: 'php/getLibraryPatterns.php', dataType: 'json', data: data, })
修改后的Android Java参数构建方法
private String buildParameterString() throws UnsupportedEncodingException { if (m_parameterMap == null || m_parameterMap.size() == 0) return ""; StringBuilder result = new StringBuilder(); for (int iPair = 0; iPair < m_parameterMap.size(); iPair++) { Pair<String, Object> param = m_parameterMap.get(iPair); if (iPair > 0) result.append("&"); Object value = param.second; if (value instanceof ArrayList){ for (int i = 0; i < ((ArrayList)value).size(); i++){ Object nextValue = ((ArrayList)value).get(i); String nextValueStr = ""; if (nextValue instanceof String){ nextValueStr = (String)nextValue; } else { nextValueStr = Integer.toString((Integer)nextValue); } if (i > 0) result.append("&"); result.append(URLEncoder.encode(param.first, "UTF-8")); result.append("%5B%5D="); result.append(URLEncoder.encode(nextValueStr, "UTF-8")); } } else { result.append(URLEncoder.encode(param.first, "UTF-8")); result.append("="); result.append(URLEncoder.encode((String)value, "UTF-8")); } } return result.toString(); }
内容的提问来源于stack exchange,提问作者aff
相关产品推荐
相关产品推荐

