当前位置: 首页 > 知识库问答 >
问题:

截击服务器错误,网络响应为空

柯星辰
2023-03-14

每次我尝试用截击的POST方法时,我都会犯严重的错误。我在getCause中得到null值,在getNetworkResponse中得到一些默认值。toString()。

如果我使用GET方法,这工作正常(我从我的网址得到响应)。

有人能帮忙吗?我能做什么?

    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.服务器错误

更新: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);
?>

共有3个答案

孔俊捷
2023-03-14

我想你可以先在日志中打印响应代码

宇文良骏
2023-03-14

首先,请确保您的服务器工作正常。您可以使用Postman(chrome插件)或任何其他方式向url发送post请求,并查看其响应。

在确定你的服务器没有问题后,让我们用截击来解决这个问题。

当您使用POST方法时,JsonObjectRequest有一些问题。像这个Volley JsonObjectRequest Post请求不工作。

我建议您首先使用StringRequest,然后像以前一样覆盖getParams方法。在你熬过这个任务后,你可以试着写你自己的请求,不是很难,但很有用。

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

澹台建华
2023-03-14

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

 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);
 类似资料:
  • 我正在使用截击来管理我的应用程序。有时,当响应很大时,我会在没有太多RAM的设备上获得OOM。我不确定如何解决这个问题。我知道Volley会将其响应存储在内存中,但我的应用程序太多地围绕着Volley,切换起来会很痛苦。我在使用改装时也遇到了问题。我尝试过使用JsonReader,但它似乎仍在发生。我有一个用于截击的自定义请求。它返回一个Gson JsonObject。这是我目前的代码,当响应数据

  • 我想将表单数据发送到服务器。我正在使用volly库来实现这一点,但下面的代码显示了以下错误。 意外响应代码405 com。Android截击服务器错误 我的代码是: **logcat看起来像这样**

  • 我正在尝试使用Volley获取JSON对象以创建动态自动完成,但在使用Volley请求时,我在日志cat中看到: 截击:[486]基本网络。logSlowRequests:请求的HTTP响应= 这些答案并没有解决我的问题。 这里是初始化请求队列的Singleton类: 发出请求的方法: 下面是HTTP Connector类:

  • Twisted Twisted 是一个事件驱动的网络引擎。他可以被用来构建多种网络协议的应用程序,包括:HTTP 服务器和客户端;使用 SMTP、POP3、IMAP 或者 SSH 协议测应用程序和 IM (即时消息)等应用 更多。 PyZMQ PyZMQ 是 ZeroMQ 的 Python 绑定。ZeroMQ 是一个高性能的异步消息库,它的一个很大的优势在于其可以被用作一个消息队列而不需要消息代理

  • 我想在我的代码中使用Volley,我应该在下面的响应中使用哪种请求类型,我不明白。URL:::http://localhost/api/product/read.php

  • 当我的笔记本电脑仪表板上的二维码被我的Android中的Expo扫描仪扫描时,它会显示。 而当我打开错误日志文件时,它会显示。 我该怎么做?