web-dev-qa-db-de.com

Volley Server-Fehler mit null Netzwerkantwort

Jedes Mal, wenn ich versuche, die POST - Methode mit Volley zu verwenden, erhalte ich einen schwerwiegenden Fehler. Ich erhalte in getCause einen Nullwert und in getNetworkResponse.toString () einen Standardwert.

Wenn ich die GET-Methode verwende, funktioniert das gut (ich bekomme eine Antwort von meiner URL).

Kann jemand helfen, was kann ich tun?

    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);

Fehlerprotokoll:

Error: Fehler: com.Android.volley.ServerError >> 404 >> [B @ 42b1e0d0 >> null >> null

UPDATE: networkResponse.statusCode kommt als 404, obwohl auf die URL zugegriffen werden kann (und wenn ich nur die GET-Methode verwende, Daten zurückgeben). Wenn ich den Header-Teil in der POST -Methode entferne, bleibt derselbe.

die URL:

<?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);
?>
9
abdfahim

Stellen Sie zunächst sicher, dass Ihr Server einwandfrei funktioniert. Sie können Postman (Chrome-Plug-In) oder eine andere Möglichkeit verwenden, um eine Post-Anfrage an die URL zu senden und zu sehen, was er antwortet.

Nachdem Sie sichergestellt haben, dass kein Problem mit Ihrem Server vorliegt, lösen Sie das Problem mit Volley.

Es gibt ein Problem mit JsonObjectRequest, wenn Sie POST Methode . Wie folgt verwenden Volley JsonObjectRequest Post-Anforderung funktioniert nicht .

Ich schlage vor, dass Sie zuerst StringRequest verwenden und die getParams-Methode wie zuvor überschreiben. Nachdem Sie diese Aufgabe überlebt haben, können Sie versuchen, Ihre eigene Anfrage zu schreiben, nicht sehr schwierig, aber sehr nützlich.

Ich empfehle außerdem, request.setShouldCache(false) vor requestQueue.add(request); hinzuzufügen. Volley speichert die Antwort standardmäßig in seinem Cache, und dieses Verhalten kann zu merkwürdigen Problemen führen.

6
Kay Wu

problem ist Ihre Queue . Ändern Sie Ihren Volley-Code folgendermaßen:

 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);  

und dein ph (laravel) code dazu:

    $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);
2
hadi.ghasemian

Fügen Sie diesen Code vor dem Hinzufügen zur Warteschlange hinzu

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

manchmal wird die Zeit abgelaufen, bevor der PHP-Vorgang vollständig ausgeführt wird. versuchen Sie es also mit diesem Code. vielleicht kann helfen

0
Bamz3r

Ich habe versucht, die Antwort als String anzuzeigen, und der Fehler ist aufgetreten.

Verwenden Sie response.toString(), wo immer Sie den Fehler anzeigen oder verwenden möchten.

0
SONU SOURAV

Volley verarbeitet eingebaute POST - Methodenparameter nicht perfekt, daher müssen Sie eine benutzerdefinierte Antwort erstellen.

Die Antwort wird von katwal-Dipak in einem ähnlichen Beitrag ähnlich angezeigt. https://stackoverflow.com/a/31532955/4969957

Welches funktioniert perfekt. Danke.

0
Saksham Khurana

Nun, ich denke, Sie können den ResponseCode zuerst in Ihrem Logcat ausdrucken 

0
shoxive

vielleicht hängt es mit Ihrem Operator zusammen ...

Ich habe das gleiche Problem beim Senden von JasonObject mit Volley.

Ich habe meine App auf 9-10 Geräten mit zwei verschiedenen Betreibern getestet.

Die Anfrage für einen Operator gibt einen Fehler mit allen leeren oder leeren Daten zurück, zum anderen funktioniert alles einwandfrei und ich bekomme meine Antwort von der API erfolgreich.

Ich habe keine Ahnung, was Operatoren tun, die dieses Problem verursachen ... Vielleicht verwenden sie eine Art Firewall, die das Senden von JsonObject blockiert.

0
S.Aslpour