Volley Post 请求在 onResponse 内没有返回响应

Posted

技术标签:

【中文标题】Volley Post 请求在 onResponse 内没有返回响应【英文标题】:Volley Post request returns no response inside 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 的回复对您有帮助吗..! 如果可以的话请同意 【参考方案1】:

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

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

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是谁做的!

以上是关于Volley Post 请求在 onResponse 内没有返回响应的主要内容,如果未能解决你的问题,请参考以下文章

在 volley post 请求中发送表单数据

Volley 使用 StringRequest 在第一次后不调用 getParams 发送 POST 请求参数

如何在 Volley 的 POST 请求中将整数作为参数传递?

Android Volley框架的几种post提交请求方式

Volley JsonObjectRequest Post 请求忽略参数

在 Volley 中实现 POST 请求时出现错误代码 400,但在使用 OkHttp 时却没有