【问题标题】:Volley Post request returns no response inside onResponseVolley Post 请求在 onResponse 内没有返回响应
【发布时间】:2018-01-01 17:26:55
【问题描述】:

所以我想打印响应的结果,然后使用 gson 为模型生成数据,但是响应永远不会返回,还调用了 onResponse。!

如果您注意到 Logcat,onResponse 中的 log.i 没有显示..!?但是在使用这个请求的Activity的onSuccess里面,它正常显示日志,但是如果日志包含响应对象,它不会显示很奇怪,没有任何意义..!?

Logcat

I/getUrl:: http://1925.232.55/login.php
I/getParams:: {username =samy, password=123456}
D/libc: [NET] android_getaddrinfofornetcontext+,hn 20(0x6),sn(),hints(known),family 0,flags 1024, proc=com...
D/libc: [NET] android_getaddrinfo_proxy get netid:0
D/libc: [NET] android_getaddrinfo_proxy-, success
I/onSuccess:: check /* this log inside the Activity which uses this request */

我尝试使用具有相同 url 和参数的 PostMan 测试请求 它正常返回json响应..?

邮递员回复

{
    "status": "success",
    "user_id": "10",
    "user_name": "samy",
    "full_name": "samy samy",
    "picture": "st_pictures/IMG_085207.jpg",
    "level": "1",
    "school": "NY School",
    "city": "NY",
    "class": "6",
    "age": "22",
    "teacher": "2",
    "token": "f808e758sdfsdfsf162dbdfcf88e3dc8a96"
}

请求代码

 final RequestQueue queue = Volley.newRequestQueue(context);

      final StringRequest sr = new StringRequest(Request.Method.POST, getLoginURL(), new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
          Log.i("onResponse: ", response + "");
      requestResult.onSuccess(response);


      }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
      requestResult.onFail(error);

           VolleyLog.e("Error: ", error.getMessage());
          error.printStackTrace();
        }
      })
      {
        @Override
        protected Map<String, String> getParams() {
          Map<String, String> params = new HashMap<String, String>();
          params.put("username ", un);
          params.put("password", pass);
          Log.i( "getParams: ", params.toString());
          return params;
        }

        @Override
        public byte[] getBody() throws AuthFailureError {
          Log.i( "getUrl: ",getUrl());
          return super.getBody();

        }
      }
      ;

      queue.add(sr);

更新 #1

网址http://clients.intertech.ps/raz/std.php

 E/Volley: [1] 2.onErrorResponse: Error: 
 W/System.err: com.android.volley.ParseError: org.json.JSONException: End of input at character 0 of 
 W/System.err:     at com.android.volley.toolbox.JsonObjectRequest.parseNetworkResponse(JsonObjectRequest.java:73)
 W/System.err:     at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:123)
 W/System.err: Caused by: org.json.JSONException: End of input at character 0 of 
 W/System.err:     at org.json.JSONTokener.syntaxError(JSONTokener.java:449)
 W/System.err:     at org.json.JSONTokener.nextValue(JSONTokener.java:97)
 W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:156)
 W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:173)
W/System.err:     at com.android.volley.toolbox.JsonObjectRequest.parseNetworkResponse(JsonObjectRequest.java:68)
 W/System.err:  ... 1 more

【问题讨论】:

  • 第一个日志是`1925.232.55/login.php`我认为你的网址是错误的
  • @OussemaAroua 这个是假的,要我换成真的吗?
  • 没必要我只是在检查它是否真实
  • 如果我添加来自 Postman 的回复对您有帮助吗..!
  • 如果可以的话请同意

标签: java android json post android-volley


【解决方案1】:

很久以前有人问过这个问题,但我也遇到了同样的问题,几个小时后我才用 Volley 解决了这个问题

使用 StringRequest 而不是 JsonObjectRequest,出于任何原因,我在 JOR 上遇到了很多问题,我使用了 @Oussema ArouagetHeaders 函数

final Response.Listener<String> responseListener = new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            Log.d("RESPONSE", String.valueOf(response));
        }
    };

final Response.ErrorListener errorListener = new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

            //Handle your errors
        }
    };

StringRequest request = new StringRequest(Request.Method.POST, url,
            responseListener, errorListener) {
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> params = new HashMap<>();
            //Put your params for post
            return params;
        }

        @Override
        public Map<String, String> getHeaders() {
            Map<String,String> params = new HashMap<>();
            params.put("Content-Type","application/x-www-form-urlencoded"); //-> this is the key
            return params;
        }
    };

.. 你会在onResponse中得到来自服务器的json响应

【讨论】:

    【解决方案2】:

    你必须使用JsonObjectRequest,像这样:

    HashMap<String, String> params = new HashMap<String, String>();
    params.put("username","samy");
    params.put("password","123456");
    
    JsonObjectRequest req = new JsonObjectRequest(URL, new JSONObject(params),
     new Response.Listener<JSONObject>() {
           @Override
           public void onResponse(JSONObject response) {
               Gson gson = new Gson();
               YourClass yourClass = gson.fromJson(response.toString(), yourClass.class);
           }
       }, new Response.ErrorListener() {
           @Override
           public void onErrorResponse(VolleyError error) {
                //error
           }
       });
    

    【讨论】:

    • 它不起作用,它给了我与@OussemaAroua 答案相同的错误,请参阅更新 #1 以获得完整的 logcat
    • 你能仔细检查你的 json 响应吗,可能格式不正确
    • 再次查看更新#1,我将发布真正的url,在邮递员中使用它和婴儿车,自己看看。!
    • 我收到空白回复
    • 对不起,请使用这个用户名“layal”而不是 samy
    【解决方案3】:

    这不是StringRequest,您需要使用JsonObjectRequest,因为您的回复以{开头

    JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.GET,
                    url, null,
                    new Response.Listener<JSONObject>() {
    
                        @Override
                        public void onResponse(JSONObject response) {
                            Log.d(TAG, response.toString());
                           requestResult.onSuccess(response);
                        }
                    }, new Response.ErrorListener() {
    
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            VolleyLog.d(TAG, "Error: " + error.getMessage());
                            requestResult.onFail(error);
                        }
                    });
    

    尝试在getParams下添加:

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String,String> params = new HashMap<String, String>();
        params.put("Content-Type","application/x-www-form-urlencoded");
        return params;
    }
    

    [更新]:

    我不知道为什么 volley 不起作用,但我更改为 ion link 并且它起作用了:

    Ion.with(this)
                    .load("http://clients.intertech.ps/raz/std.php")
                    .setBodyParameter("username", "layal")
                    .setBodyParameter("password", "123456")
                    .asJsonObject()
                    .setCallback(new FutureCallback<JsonObject>() {
                        @Override
                        public void onCompleted(Exception e, JsonObject jsonObject) {
                            Log.e("TAG", "onCompleted: " + jsonObject.toString());
                        }
                    });
    

    【讨论】:

    • 我将其更改为 JsonObjectRequest 并且此错误显示:` E/Volley: [1] 2.onErrorResponse: Error: org.json.JSONException: End of input at character 0 of `
    • 服务器的响应为空,不返回任何内容
    • 我遇到了,同样的问题,再次查看更新#1,我将发布真正的url,在邮递员中使用它和婴儿车,自己看看。!
    • 好像php文件没有获取用户名和密码,尝试添加if (!isset($_POST["username"]) echo "empty username"
    • web端逻辑不是我写的,就是这样给我的,不知道web api是谁做的!
    猜你喜欢
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多