我试图通过在Android中使用StringRequest以及POST方法来获取JSONArray。
php脚本的编写如下:
$statement = mysqli_prepare($con, "SELECT * FROM tickets WHERE user_id > 5 AND completed = 1");
mysqli_stmt_bind_param($statement, "i", $UID);
mysqli_stmt_execute($statement);
mysqli_stmt_store_result($statement);
mysqli_stmt_bind_result($statement, $user_id, $beacon_id, $timeFrom, $timeTo, $completed);
$jsonObject = array();
$response = array();
while($status = mysqli_stmt_fetch($statement)){
$jsonObject = null;
$jsonObject["beacon_id"]= $beacon_id;
$jsonObject["timeFrom"]= $timeFrom;
$jsonObject["timeTo"]= $timeTo;
$response[] = $jsonObject;
}
echo json_encode($response);?>
使用php脚本访问网页,以下JSONArray被“回显”:
[{"beacon_id":10,"timeFrom":"2018-02-14 13:07:11","timeTo":"2018-02-14 14:32:53"},{"beacon_id":3,"timeFrom":"2018-02-24 13:33:37","timeTo":"2018-02-24 13:33:47"}]
据我所知,这是一个普通的JSONArray,方括号表示数组中的每个JSONObject的数组和花括号。
当我尝试通过Android Studio(Java)中的StringRequest访问此JSONArray时,我没有得到任何结果......
StringRequest代码:
public class HistoryRequest extends StringRequest {
private static final String HISTORY_REQUEST_URL = "http://myURL.../myPHPfile.php";
private Map<String, String> params;
public HistoryRequest(String user_id, String instanceID, Response.Listener<String> listener) {
super(Method.POST, HISTORY_REQUEST_URL, listener, null);
params = new HashMap<>();
params.put("user_id", user_id);
params.put("instanceID", instanceID);
}
@Override
public Map<String, String> getParams() {return params;}
}
MainActivity中的ResponseListener编写如下:
Response.Listener<String> responseListener = new Response.Listener<String>() {
@Override
public void onResponse(String response) {
JSONArray jsonArray = new JSONArray(response);
for(int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String timeFrom = jsonObject.getString("timeFrom");
String timeTo = jsonObject.getString("timeTo");
textviewFrom.append(timeFrom);
textviewTo.append(timeTo);
}
}
};
为什么我不能在网页URL中创建一个字符串的JSONArray看起来像一个漂亮的JSONArray?
提前致谢!
在切换到JSONArrayRequest而不是StringRequest之后,如果我将php脚本的MySQL部分更改为静态内容,我可以获取数据:
SELECT * FROM tickets;
然后我可以显示所有条目。但是我倾向于向服务器发送1个参数(user_id),这样我就可以根据登录的用户过滤条目。[SELECT * FROM ticket where user_id =?],就像传统的POST方法一样......
有谁知道该怎么办?阅读几个你不能@Override getParams()方法的地方......
我通过在网址中输入keyvalue(user_id)解决了这个问题。
//Instead of POST:
$user_id = $_POST["user_id"];
// I use SERVER to get the value after ? in the URL:
$user_id = $_SERVER['QUERY_STRING'];
使用以下java代码执行此操作:
public class HistoryRequest extends JsonArrayRequest {
private static final String HISTORY_REQUEST_URL = "http://myURLorIPaddress/getHistory.php?";
public HistoryRequest(String UID, Response.Listener<JSONArray> listener) throws JSONException {
super(Method.POST, HISTORY_REQUEST_URL + UID,null, listener, null);
}
}
这使得可以根据user_id过滤结果,并且像魅力一样工作:D
答案 0 :(得分:0)
我不打印任何东西,但我可以看到Volley库抱怨一些外部错误(没有提到我的代码)。 log.i(&#34; OnResponseLog&#34;,响应)没有提供任何内容。