java - 从 Android 获取带有 StringRequest 的 JSONArray

标签 java php android mysql json

我试图通过在 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 Tickets where user_id = ?],就像传统的 POST 方法... .

有人知道该怎么做吗?阅读一些您不能为此 @Override getParams() 方法的地方...

已解决:

我通过在 URL 中输入键值 (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

最佳答案

我无法打印任何内容,但我可以看到 Volley 库正在提示一些外部错误(没有任何内容引用我的代码)。 log.i("OnResponseLog", response) 不提供任何内容。

Picture of error from LogCat:

关于java - 从 Android 获取带有 StringRequest 的 JSONArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48996632/

相关文章:

与其他语言相比,Java BufferedImage 到字节数组的转换太慢

java - 如何从一个类获取另一个 Action 监听器类的变量信息?

php - 如何获取 simplexml 对象的所有元素

java - 按值对哈希表排序

java - Google Drive Api result.getStatus().isSuccess() 始终为真

php - OOP PHP 类从一行调用调用 function1()->function2()

php - 添加 Woocommerce 购物车费用不会持续存在于结帐中

android - distanceTo 返回的距离是多少?

android - 如何在android中改变开关的形状

android - 是否缓存了 SharedPreference 实例? (通过 PreferenceManager.getDefaultSharedPreferences())