2016-03-07 3 views
2

J'envoie une requête http d'Android Java en utilisant la bibliothèque Volley à un backend C#. L'application principale répond avec un code d'erreur et une description comme prévu, ainsi qu'une StatusDescription. Je peux voir la description de l'état de la réponse via wireshark mais je ne sais pas comment obtenir la chaîne de description sur le côté android.Comment obtenir la description du message d'erreur en utilisant Volley

final JsonObjectRequest request = new JsonObjectRequest(JsonObjectRequest.Method.POST, 
           url,json, 
          new Response.Listener<JSONObject>() { 

           @Override 
           public void onResponse(JSONObject response) { 
            TextView mTextView = (TextView) findViewById(R.id.output); 
            print("Success"); 
           } 
          }, new Response.ErrorListener() { 

           @Override 
           public void onErrorResponse(VolleyError error) { 
            TextView mTextView = (TextView) findViewById(R.id.output); 
            print("Failure (" + error.networkResponse.statusCode + ")"); 
//Trying to get the error description/response phrase here 
          } 
         } 
        ); 

Ceci est le code C# traitement de la demande:

[WebInvoke (méthode = "POST", UriTemplate = "utilisateurs", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat .Json)] [OperationContract] void addUser (nom d'utilisateur chaîne, chaîne de caractères, nom de chaîne, adresse de chaîne, chaîne de hachage) { Console.WriteLine (DateTime.Now + "Packet receieved"); J'ai regardé les questions d'autres personnes, mais je n'arrive pas à trouver la réponse que je recherche. Quelqu'un sait-il comment faire ça? De nombreuses méthodes que j'ai essayées ont abouti à des accolades vides, indiquant JSON avec un corps vide. J'essaie spécifiquement d'obtenir la description du statut.

Répondre

4

Essayez avec cette méthode personnalisée:

public void parseVolleyError(VolleyError error) { 
     try { 
      String responseBody = new String(error.networkResponse.data, "utf-8"); 
      JSONObject data = new JSONObject(responseBody); 
      JSONArray errors = data.getJSONArray("errors"); 
      JSONObject jsonMessage = errors.getJSONObject(0); 
      String message = jsonMessage.getString("message"); 
      Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); 
     } catch (JSONException e) { 
     } catch (UnsupportedEncodingException errorr) { 
     } 
    } 

Il montrera pain grillé avec un message d'erreur de la demande. Appelez cette méthode dans onErrorResponse dans votre demande de volley:

new Response.ErrorListener() { 
         @Override 
         public void onErrorResponse(VolleyError error) { 
          parseVolleyError(error); 
         } 
        } 
+0

Cela a fonctionné, merci pour votre réponse! – GraphiteEdge

1

vous devez remplacer les méthodes parseNetworkError et deliverError et vous pouvez en recevoir des messages d'erreur.

+0

Pourriez-vous fournir du code à titre d'exemple? Pas trop sûr de savoir comment le faire. – GraphiteEdge

1

Exemple pour remplacer les méthodes:

final JsonObjectRequest request = new JsonObjectRequest(JsonObjectRequest.Method.POST, 
      url, json, 
      new Response.Listener<JSONObject>() { 

       @Override 
       public void onResponse(JSONObject response) { 
        TextView mTextView = (TextView) findViewById(R.id.output); 
        print("Success"); 
       } 
      }, new Response.ErrorListener() { 

     @Override 
     public void onErrorResponse(VolleyError error) { 
      TextView mTextView = (TextView) findViewById(R.id.output); 
      print("Failure (" + error.networkResponse.statusCode + ")"); 
     } 
    }){ 
     @Override 
     protected VolleyError parseNetworkError(VolleyError volleyError) { 
      return super.parseNetworkError(volleyError); 
     } 

     @Override 
     public void deliverError(VolleyError error) { 
      super.deliverError(error); 
     } 
    }; 
+0

Merci pour cela, ça a aidé :) – GraphiteEdge

0

OMI, vous devez remplacer parseNetworkError comme ci-dessous:

@Override 
protected VolleyError parseNetworkError(VolleyError volleyError) { 
    String json; 
    if (volleyError.networkResponse != null && volleyError.networkResponse.data != null) { 
     try { 
      json = new String(volleyError.networkResponse.data, 
        HttpHeaderParser.parseCharset(volleyError.networkResponse.headers)); 
     } catch (UnsupportedEncodingException e) { 
      return new VolleyError(e.getMessage()); 
     } 
     return new VolleyError(json); 
    } 
    return volleyError; 
} 

Puis, à l'intérieur onErrorResponse(VolleyError error), vous pouvez utiliser Log.e(LOG_TAG, error.toString()); par exemple. J'espère que cela aide!

+0

Merci pour votre réponse, cela a aidé! – GraphiteEdge