web-dev-qa-db-fra.com

Volley Server Error avec une réponse réseau nulle

Chaque fois que j'essaie d'utiliser la méthode POST avec Volley, j'obtiens une erreur grave. J'obtiens une valeur nulle dans getCause et une valeur par défaut dans getNetworkResponse.toString ().

Si j'utilise la méthode GET, cela fonctionne bien (je reçois une réponse de mon URL).

Quelqu'un peut-il aider que puis-je faire?

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

Journal des erreurs:

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

UPDATE: networkResponse.statusCode vient en tant que 404, bien que l'URL soit accessible (et renvoie des données si je viens d'utiliser la méthode GET). Si je supprime la partie d'en-tête dans la méthode POST, toujours le même.

l'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

Commencez par vérifier que votre serveur fonctionne correctement .. Vous pouvez utiliser Postman (plug-in chrome) ou tout autre moyen d’envoyer une demande de publication à l’URL et de voir ce qu’il répond.

Après vous être assuré qu’il n’ya pas de problème avec votre serveur, laissez-nous résoudre le problème avec volley.

Il y a un problème avec JsonObjectRequest lorsque vous utilisez la méthode POST . Comme ceci Volley JsonObjectRequest La requête de publication ne fonctionne pas .

Je vous suggère d'utiliser StringRequest en premier et d'écraser la méthode getParams comme vous l'avez fait auparavant. Après avoir survécu à cette tâche, vous pouvez essayer d’écrire votre propre demande, pas très difficile, mais très utile.

Je suggère également d'ajouter request.setShouldCache(false) avant requestQueue.add(request);. Par défaut, volley enregistre la réponse dans son cache et ce comportement peut entraîner un problème étrange.

6
Kay Wu

le problème est votre file d'attente . changez votre code de volée en ceci:

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

et votre code php (laravel) à ceci:

    $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

Ajouter ce code avant d'ajouter à la file d'attente

request.setRetryPolicy (nouvelle règle par défaut (0, -1, par défaut).

parfois, la demande est expirée avant que votre php ne soit complètement exécuté. alors essayez ce code. peut peut-être aider

0
Bamz3r

Volley ne gère pas parfaitement les paramètres de la méthode POST intégrée; vous devez donc créer une réponse personnalisée.

La réponse est publiée par Katwal-Dipak sur un autre message similaire à celui-ci. https://stackoverflow.com/a/31532955/4969957

Ce qui fonctionne parfaitement. Merci.

0
Saksham Khurana

Eh bien, je pense que vous pouvez d’abord imprimer le responseCode dans votre logcat 

0
shoxive

c'est peut-être lié à votre opérateur ...

J'ai le même problème en envoyant JasonObject avec Volley.

J'ai testé mon application sur 9 à 10 appareils avec deux opérateurs différents.

La demande sur un opérateur renvoie une erreur contenant toutes les données vides ou vides, sur l’autre tout fonctionne correctement et j’obtiens ma réponse à partir de l’API.

Je ne sais pas du tout ce que les opérateurs font ce qui cause ce problème ........ Ils utilisent peut-être un pare-feu qui empêche l'envoi de JsonObject.

0
S.Aslpour