2016-05-17 1 views
2

J'ai implémenté une requête personnalisée en utilisant volley afin de me connecter à un serveur web.Android volley demande personnalisée

C'est la fonction im en utilisant:

private void volleyTest2(String username, String password, String deviceid) { 

    Map<String, String> params; 
    params = new HashMap<>(); 

    params.put("username", username); 
    params.put("password", password); 
    //params.put("device_id", deviceid); 
    params.put("device_id", "H767A76S7D6D"); 

    Volley.newRequestQueue(MainActivity.this).add(
     new CustomJsonRequest(Request.Method.POST, URL, params, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 
        String output=""; 
        // Parsing json 
        for (int i = 0; i < response.length(); i++) { 
         try { 

          JSONObject obj = response.getJSONObject(i); 
          output+=obj.getString("name") + " "+ obj.getString("surname"); 

         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 

        } 
        Toast.makeText(getApplicationContext(), "Benvenuto, " + output, Toast.LENGTH_LONG).show(); 
        showProgress(false); 
       } 
      }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         VolleyLog.d("Error: " + error.getMessage()); 
         Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show(); 
         showProgress(false); 
        } 
       } 

     ) 

     { 
      @Override 
      protected Response parseNetworkResponse(NetworkResponse response) { 
       try { 

        String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 
        return Response.success(new JSONArray(jsonString), HttpHeaderParser.parseCacheHeaders(response)); 

       } catch (UnsupportedEncodingException e) { 
        return Response.error(new ParseError(e)); 
       } catch (JSONException je) { 
        return Response.error(new ParseError(je)); 
       } 
      } 

     } 

    ); 

} 

Et ceci est mon CustomJsonRequest:

public class CustomJsonRequest extends Request { 

Map<String, String> params; 
private Response.Listener listener; 

public CustomJsonRequest(int requestMethod, String url, Map<String, String> params, Response.Listener responseListener, Response.ErrorListener errorListener) { 
    super(requestMethod, url, errorListener); 
    this.params = params; 
    this.listener = responseListener; 
} 

@Override 
protected void deliverResponse(Object response) { 
    listener.onResponse(response); 
} 

@Override 
public Map<String, String> getParams() throws AuthFailureError { 
    return params; 
} 

@Override 
protected Response parseNetworkResponse(NetworkResponse response) { 
    try { 
     String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 
     return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response)); 
    } catch (UnsupportedEncodingException e) { 
     return Response.error(new ParseError(e)); 
    } catch (JSONException je) { 
     return Response.error(new ParseError(je)); 
    } 
} 

}

Puisque je ne peux pas modifier le côté php ceci est le scénario: - Si la connexion est correcte, je reçois un JSONArray - si la connexion n'est pas correcte je reçois un objet JSONObject comme ceci: Mon seul problème est que si la connexion est incorrecte je reçois cette erreur: Error: org.json.JSONException: Value {"error":"Username\/password non trovati"} of type org.json.JSONObject cannot be converted to JSONArray

Alors, comment puis-je gérer la connexion incorrecte si je reçois un JSONObject au lieu d'un JSONArray? Je voudrais montrer que le contenu intérieur de l'objet, donc: "Username\/password non trovati"

Update1:

private void volleyTest2(String username, String password, String deviceid) { 

    Map<String, String> params; 
    params = new HashMap<>(); 

    params.put("username", username); 
    params.put("password", password); 
    //params.put("device_id", deviceid); 
    params.put("device_id", "H767A76S7D6D"); 

    Volley.newRequestQueue(MainActivity.this).add(
     new CustomJsonRequest(Request.Method.POST, URL, params, 
      new Response.Listener<JsonElement>() { 
       @Override 
       public void onResponse(JsonElement element) { 
        String output=""; 
        // Parsing json 

        if(element.isJsonArray()){ 
         JsonArray array=element.getAsJsonArray(); 
         //read response here 
         Log.d(TAG,"array.toString(): " + array.toString()); 

        }else if(element.isJsonObject()){ 
         JsonObject object=element.getAsJsonObject(); 
         //read response here 
         Log.d(TAG,"object.toString(): " + object.toString()); 

        } 


        Toast.makeText(getApplicationContext(), "Benvenuto, " + output, Toast.LENGTH_LONG).show(); 
        showProgress(false); 
       } 
      }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         VolleyLog.d("Error: " + error.getMessage()); 
         Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show(); 
         showProgress(false); 
        } 
       } 

     ) 

     { 
      @Override 
      protected Response parseNetworkResponse(NetworkResponse response) { 
       try { 

        String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 
        return Response.success(new JSONArray(jsonString), HttpHeaderParser.parseCacheHeaders(response)); 

       } catch (UnsupportedEncodingException e) { 
        return Response.error(new ParseError(e)); 
       } catch (JSONException je) { 
        return Response.error(new ParseError(je)); 
       } 
      } 

     } 

    ); 

} 

Répondre

0

Possiblités
1. type Marque de retour de la demande comme com.google.gson.JsonElement.class et contrôleront comme celui-ci

 @Override 
     public void onResponse(JsonElement element) { 
      if(element.isJsonArray()){ 
       JsonArray array=element.getAsJsonArray(); 
       //read response here 
      }else if(element.isJsonObject()){ 
       JsonObject object=element.getAsJsonObject(); 
       //read response here 
      } 
     } 

2. Faire une requête de chaîne essayer de le convertir JSONArray ou JSONObject. tout en convertissant attraper ces exceptions si s'est produite (JSONException: JSONObject ne peut pas être converti en JSONArray).

. Faire StringRequest et analyser la réponse à JsonElement et vérifier si son JsonObject ou JsonArray

 @Override 
     public void onResponse(String s) { 
      JsonParser parser = new JsonParser(); 
      JsonElement element = parser.parse(s); 

      if (element.isJsonArray()) { 
       JsonArray array = element.getAsJsonArray(); 
       //read response here 
      } else if (element.isJsonObject()) { 
       JsonObject object = element.getAsJsonObject(); 
       //read response here 
      } 

     } 

4. La meilleure façon: Modifier le code du serveur :)

happyCoding;

+0

Dem, toujours le même. Il est correct que cela fonctionne, sinon, cette chaîne est retournée quand même: Erreur: org.json.JSONException: Valeur {"erreur": "Nom d'utilisateur \/mot de passe non trovati"} de type org.json.JSONObject ne peut être converti en JSONArray – Vesco

+0

lequel vous avez essayé? – Bharatesh

+0

ça marche ou pas ... **:) ** – Bharatesh