【问题标题】:Volley Server Error with null Network responseVolley 服务器错误,网络响应为空
【发布时间】:2015-07-25 12:13:22
【问题描述】:

每次我尝试对 Volley 使用 POST 方法时,都会出现服务器错误。我在 getCause 中得到空值,在 getNetworkResponse.toString() 中得到一些默认值。

如果我使用 GET 方法,这可以正常工作(我从我的 url 获得响应)。

谁能帮我做点什么?

    Map<String, String> jsonParams = new HashMap<String, String>();
    jsonParams.put("teststr", "abd");

    RequestQueue requestQueue = VolleySingleton.getInstance().getRequestQueue();
    JsonObjectRequest request = new JsonObjectRequest(
            Request.Method.POST,
            url,
            new JSONObject(jsonParams),
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {

                    try {
                        Toast.makeText(getApplicationContext(), "Success"+response.toString(), Toast.LENGTH_LONG).show();
                    }catch(Exception e){
                        Toast.makeText(getApplicationContext(), "JSON ERROR", Toast.LENGTH_LONG).show();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("abd", "Error: " + error
                                    + ">>" + error.networkResponse.statusCode
                                    + ">>" + error.networkResponse.data
                                    + ">>" + error.getCause()
                                    + ">>" + error.getMessage());
                }
            }) {

                @Override
                protected Map<String,String> getParams() {
                    HashMap<String, String> params = new HashMap<String, String>();
                    params.put("key", "value");
                    return params;
                }

                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    HashMap<String, String> headers = new HashMap<String, String>();
                    headers.put("Content-Type", "application/json; charset=utf-8");
                    return headers;
                }
    };
    requestQueue.add(request);

错误日志:

错误: 错误:com.android.volley.ServerError>>404>>[B@42b1e0d0>>null>>null

更新: networkResponse.statusCode 为 404,尽管 url 是可访问的(如果我只使用 GET 方法,则返回数据)。如果我在 POST 方法中删除标题部分,仍然一样。

网址:

<?php
    $response = array();

    $jsonString = file_get_contents('php://input');
    $jsonObj = json_decode($jsonString, true);

    if(!isset($jsonObj['teststr'])){
        $response["msg"] = "No data.";
    }else{
        $response["msg"] = "Success: ".$jsonObj['teststr'];
    }
    echo json_encode($response);
?>

【问题讨论】:

  • 你检查过error.getMessage(); ?
  • 是的,这也是空的
  • 你有解决办法吗,我迷路了,同样的错误,用邮递员测试时服务器响应正常

标签: android android-volley


【解决方案1】:

尝试增加超时。我有同样的问题,请求超时是问题。

【讨论】:

【解决方案2】:

就我而言,答案是重试策略设置。 我把超时值设置为 30 秒,应该是 30000,而不是 30。

【讨论】:

    【解决方案3】:

    我尝试将响应显示为字符串,但错误消失了。

    在要显示错误或使用它的任何地方使用response.toString()

    【讨论】:

      【解决方案4】:

      问题是您的队列。 将您的截击代码更改为:

       RequestQueue queue = Volley.newRequestQueue(this);
       String URL = EndPoints.BASE_URL + "/call";
       StringRequest request = new StringRequest(Request.Method.POST, URL,
        new Response.Listener<String>()
        {
          @Override
          public void onResponse(String response) {
      
            Log.d("onResponse", response);
      
          }
        },
        new Response.ErrorListener()
        {
          @Override
          public void onErrorResponse(VolleyError error) {
      
            NetworkResponse response = error.networkResponse;
            String errorMsg = "";
            if(response != null && response.data != null){
              String errorString = new String(response.data);
              Log.i("log error", errorString);
            }
          }
        }
      ) {
        @Override
        protected Map<String, String> getParams()
        {
      
          Map<String, String> params = new HashMap<String, String>();
          params.put("key_1","value_1");
          params.put("key_2", "value_2");
          Log.i("sending ", params.toString());
      
          return params;
        }
      
      };
      
      
       // Add the realibility on the connection.
       request.setRetryPolicy(new DefaultRetryPolicy(10000, 1, 1.0f));
      
        // Start the request immediately
          queue.add(request);  
      

      和你的 php (laravel) 代码:

          $response['success'] = true;
          $response['user']['tell'] = $user->tell;
          $response['user']['code'] = $user->code;
          $response['user']['time'] = $time;
          $response['user']['register_state'] = '1'
          return response()->json($response, 200);
      

      【讨论】:

      • // 在连接上添加真实性。 request.setRetryPolicy(new DefaultRetryPolicy(10000, 1, 1.0f));这条线就像一个魅力。谢谢你的好回答
      【解决方案5】:

      可能和你的运营商有关……

      我在使用 Volley 发送 JasonObject 时遇到同样的问题。

      我使用两个不同的运营商在 9-10 台设备上测试了我的应用。

      一个操作员的请求返回一个错误,其中包含所有 null 或空白数据,另一个操作员一切正常,我成功地从 API 获得响应。

      我不知道操作员做了什么导致这个问题...... 也许他们使用了某种防火墙来阻止发送 JsonObject。

      【讨论】:

        【解决方案6】:

        在添加到队列之前添加此代码

        request.setRetryPolicy(new DefaultRetryPolicy(0, -1, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        有时,在您的 php 完全执行之前,请求已超时。所以试试这段代码。也许可以帮助

        【讨论】:

          【解决方案7】:

          首先,请尝试确保您的服务器运行良好。 您可以使用 Postman(chrome 插件)或任何其他方式向 url 发送 post 请求并查看它的响应。

          确定你的服务器没有问题后,让我们用凌空解决问题。

          当您使用 POST 方法时,JsonObjectRequest 存在一些问题。 像这样Volley JsonObjectRequest Post request not working

          我建议您先使用StringRequest,然后像以前一样覆盖getParams 方法。完成此任务后,您可以尝试编写自己的请求,不是很困难但非常有用。

          我还建议在requestQueue.add(request); 之前添加request.setShouldCache(false)。默认情况下,volley 将响应保存在其缓存中,这种行为可能会导致一些奇怪的问题。

          【讨论】:

          • 谢谢,我会试试的。顺便说一句,我刚刚发现如果我用一个包含 JSON 数据 (xxx.json) 的简单文本文件替换 PHP 文件,同样的代码也能正常工作。这有什么特别的意义吗?
          • 顺便说一句,如果我只是用一个简单的 HTML 表单进行测试并尝试在提交时获取 $_POST 变量,那么 POST 就可以工作。
          • 我对 JsonObjectRequest 的了解是它适用于 GET 方法,但是当您使用 POST 方法时,根本不会调用 getParams。所以我尝试编写自己的请求来解决这个问题。
          • 好吧,我不关心获取参数..我只需要发送 JSONObject 并获得响应....但它只是显示 404 错误,这意味着它找不到页面...
          • 你能把网址给我测试一下吗?发送 JSONObject 是什么意思? volley 所做的是将带有参数的请求发送到您的服务器,您的服务器以响应作为响应,这是简单的字符串。然后 volley 尝试将 String 转换为 JSONObject。
          【解决方案8】:

          嗯,我想你可以先在你的 logcat 中打印 responseCode

          【讨论】:

          • 谢谢 ... 刚刚更新了我的帖子 .. networkResponse.statusCode = 404 ... 似乎我的 php 文件存在一些结构问题(网址肯定有效)
          猜你喜欢
          • 2016-07-23
          • 2018-03-08
          • 1970-01-01
          • 2020-07-16
          • 1970-01-01
          • 2018-06-23
          • 1970-01-01
          • 1970-01-01
          • 2018-02-19
          相关资源
          最近更新 更多