2015-05-14 3 views
8

Jedes Mal, wenn ich versuche, POST-Methode mit Volley zu verwenden, erhalte ich einen schweren Fehler. Ich bekomme null Wert in getCause und einige Standardwerte in getNetworkResponse.toString().Volley Server Fehler mit Null Netzwerkantwort

Wenn ich GET-Methode verwenden, funktioniert das gut (ich bekomme 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: Error: com.android.volley.ServerError>>404>>[[email protected]>>null>>null

UPDATE: networkResponse.statusCode kommt als 404, obwohl die URL zugänglich ist (und Daten zurück, wenn ich GET-Methode nur verwenden). Wenn ich Header-Teil in der POST-Methode entfernen, immer noch dasselbe.

der 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); 
?> 
+0

Haben Sie error.getMessage() überprüft? ? – theapache64

+0

Yup, das ist null auch – abdfahim

+0

haben Sie eine Lösung, bin mit dem gleichen Fehler verloren und der Server reagiert normal beim Test mit Postboten –

Antwort

0

Nun, ich glaube, Sie zuerst die Response in Ihrem logcat

+0

Danke ... Nur aktualisiert mein Beitrag .. networkResponse.statusCode = 404 ... scheint meine php-Datei hat ein strukturelles Problem (die URL ist sicher gültig) – abdfahim

5

Zuerst drucken können, versuchen Sie sicher funktioniert gut Ihre Server zu machen. 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 es antwortet.

Nachdem sicherstellen, dass es kein Problem mit Ihrem Server gibt, lassen Sie uns das Problem mit Volley lösen.

Es gibt ein Problem mit JsonObjectRequest, wenn Sie die POST-Methode verwenden. so Volley JsonObjectRequest Post request not working.

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

Ich empfehle auch hinzufügen request.setShouldCache(false) vor requestQueue.add(request);. Standardmäßig speichert Volley die Antwort in ihrem Cache und dieses Verhalten kann zu seltsamen Problemen führen.

+0

Danke, ich werde versuchen, dass .. Btw, habe ich gerade herausgefunden, dass, wenn ich die PHP-Datei durch eine einfache Textdatei mit JSON-Daten (xxx ersetzen .json), der gleiche Code funktioniert gut. Bedeutet das etwas Besonderes? – abdfahim

+0

BTW, POST funktioniert, wenn ich nur mit einem einfachen HTML-Formular testen und versuchen, $ _POST Variable beim Senden zu erhalten. – abdfahim

+0

Was ich über die JsonObjectRequest weiß, ist, dass es gut mit GET-Methode funktioniert, aber wenn Sie die POST-Methode verwenden, getParams einfach nicht aufgerufen. Also versuche ich meine eigene Anfrage zu schreiben, um das zu lösen. –

0

dieser Code hinzufügen, bevor

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

manchmal Warteschlange hinzufügen, ist Anforderung Timeout vor Ihrer PHP vollständig ausgeführt. also probiere diesen Code. vielleicht kann helfen

0

Volley behandelt nicht eingebaute POST-Methode Parameter perfekt, so dass Sie eine benutzerdefinierte Antwort erstellen müssen.

Die Antwort wird von katwal-Dipak auf anderen Beitrag ähnlich geschrieben. https://stackoverflow.com/a/31532955/4969957

Was funktioniert perfekt.Vielen Dank.

0

vielleicht ist es im Zusammenhang mit Ihrem Operator ...

Ich habe das gleiche Problem zu senden JasonObject mit Volley.

Ich testete meine App auf 9-10 Geräte mit zwei verschiedenen Betreibern.

Die Anfrage auf einen Operator gibt einen Fehler mit allem Null oder leere Daten in, auf der anderen alles funktioniert gut und ich bekomme meine Antwort von API erfolgreich.

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