java - Volley 没有收到 http 响应,但 postman 收到了

标签 java android node.js api android-volley

我将/getsms GET 请求发送到 API,并在 postman 上获得了预期结果。但是,当我尝试在 android studio 上通过 volley in java 发出相同的请求时,它只是没有得到响应,我一直在这样做等待,但什么也没发生。

我确信 API 确实会获取该请求,因为当我发送与获取请求相关的数据时,会发生预期的更改。

所以我不知道为什么它没有得到回应。

Java代码:

    final String url = "http://10.0.2.2:3000/myroute/getsms/"+frm;

    JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, url, null,
            new Response.Listener<JSONObject>()
            {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        String frm = response.getString("src_num");
                        String msg = response.getString("msg");
                        int id = response.getInt("id");
                        itemsAdapter.add(frm + ": " + msg);
                        Log.d("Response", response.toString());
                    }
                    catch (Exception err) {
                        Log.d("excpetion", err.toString());
                    }
                }
            },
            new Response.ErrorListener()
            {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("Error.Response", error.toString());
                }
            }
    );

API代码:

router.get('/getsms/:dest_num', function (req, res) {
  console.log("get oldest unsent sms from db"); 

  let sql = "SELECT * FROM " + table + " WHERE " + "dest_num=" + req.params.dest_num + " AND sent=FALSE " + "ORDER BY id " + "LIMIT 1;";
  console.log(sql);
  db.mycon.query(sql, function (err, result) {
    console.log("Result: " + JSON.stringify(result));
    if(err){
      res.send(err);
    } else {
      console.log("SENT!")
      res.json(result);
    }
  });
});

感谢任何帮助。

更新:因此,在筛选日志后,我发现了以下内容:

2020-01-15 22:07:23.481 11880-11880/com.example.sms D/Error.Response: com.android.volley.ParseError: org.json.JSONException: Value [{"id":4,"src_num":"321","dest_num":"1003435365","msg":"first message from server","time":100,"sent":0}] of type org.json.JSONArray cannot be converted to JSONObject

显然已收到响应,但在解析时 Volley 出现问题。我不明白为什么会发生这种情况。我没有发现 JSON 字符串有任何问题。这真的足以让它不进入 onResponse 函数吗?

UPDATE2:显然这确实是问题所在,发送的不是 JSONObject 而是 JSONArray.只需要相应地更改数据类型即可。

因此代码结束工作:

String url = "http://10.0.2.2:3000/myroute/getsms/" + frm;

JsonArrayRequest jsonObjectRequest = new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener<JSONArray>() {
    @Override
    public void onResponse(JSONArray response_arr) {
        try {
            JSONObject response = response_arr.getJSONObject(0);
            String frm = response.getString("src_num");
            String msg = response.getString("msg");
            int id = response.getInt("id");
            itemsAdapter.add(frm + ": " + msg);
        } catch (Exception err) {
            System.out.println(err.toString());
        }
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        Log.d("Error.Response", error.toString());
    }
});
requestQueue.add(jsonObjectRequest);

感谢评论的帮助:)

最佳答案

您可以尝试下面给出的代码,并将请求添加到 RequestHandler 新实例的请求队列中。

        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                        JSONArray array = new JSONArray(response);  //here is the mistake of parsing which will be removed after it is converted to the json object
                        JSONObject object = array.getJSONObject(0); //-----mistake
                        String frm = object.getString("src_num");
                        String msg = object.getString("msg");
                        int id = object.getInt("id");
                        itemsAdapter.add(frm + ": " + msg);
                        Log.d("Response", response.toString());
                        } catch (JSONException e) {
                           Log.d("excpetion", err.toString());
                        }

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
         Log.d("Error.response", err.toString());
            }
        });

        new RequestHandler().addToRequestQueue(stringRequest);

希望对你有帮助!!

关于java - Volley 没有收到 http 响应,但 postman 收到了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59758196/

相关文章:

android - JSON 解析在 Java 中无法按预期工作

java - 如何在android中创建我自己的com.google.android.gms.tasks.Task?

node.js - NodeJS、Mongoose - 插入数据时出现重复条目

javascript - 使用 casperjs 提交表单 - 新 url 不加载

java - 使上传的图像在布局/Activity 更改后保留

java - "Exception in thread "主要 "java.lang.ArrayIndexOutOfBoundsException: 178"错误,不知道为什么

java - 安卓 : Refresh ListView not working

javascript - 避免回调 hell 失去变量范围

Java Actionlistener 和 getSource()

java - 警告页面未找到 :No mapping found for HTTP request with URI