2016-01-17 1 views
0

Je suis nouveau à l'aide de Volley sur Android. En utilisant l'ancien client http, je pourrais parfaitement faire mes requêtes web avec les différents en-têtes et paramètres, maintenant je suis incapable. Ma demande ressemble à ceci dans Facteur:Impossible de mimmick POSTMAN demande dans Volley

POST /token HTTP/1.1 
Host: my.api.co.za 
Accept: application/json 
Content-Type: application/x-www-form-urlencoded 
Cache-Control: no-cache 

username=test&password=1234&grant_type=password 

Pourtant, je suis incapable de recréer et exécuter cette demande dans Volley. J'ai essayé de faire une classe de requête Json personnalisée qui s'étend Request<JSONObject> mais en vain. S'il vous plaît voir mon code ci-dessous:

public class CustomJsonRequest extends Request<JSONObject> { 

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

    public CustomJsonRequest(int method, String url, Listener<JSONObject> responseListener, ErrorListener errorListener) { 
     super(method, url, errorListener); 
     this.listener = responseListener; 
    } 

    @Override 
    public Map getHeaders() throws AuthFailureError { 
     Map headers = new HashMap(); 
     headers.put("Accept", "application/json"); 
     headers.put("Content-Type", "application/x-www-form-urlencoded"); 
     return headers; 
    } 

    @Override 
    public byte[] getBody() throws AuthFailureError { 
     HashMap<String, String> params = new HashMap<String, String>(); 
     params.put("username", "test"); 
     params.put("password", "1234"); 
     params.put("grant_type", "password"); 
     if (params != null && params.size() > 0) { 
      return encodeParameters(params, getParamsEncoding()); 
     } 
     return null; 
    } 

    /** 
    * Converts <code>params</code> into an application/x-www-form-urlencoded encoded string. 
    */ 
    private byte[] encodeParameters(Map<String, String> params, String paramsEncoding) { 
     StringBuilder encodedParams = new StringBuilder(); 
     try { 
      for (Map.Entry<String, String> entry : params.entrySet()) { 
       encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding)); 
       encodedParams.append('='); 
       encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding)); 
       encodedParams.append('&'); 
      } 
      encodedParams.deleteCharAt(encodedParams.lastIndexOf("&")); 
      Log.e("params", encodedParams.toString()); 
      return encodedParams.toString().getBytes(paramsEncoding); 
     } catch (UnsupportedEncodingException uee) { 
      throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee); 
     } 
    } 

    @Override 
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { 
     try { 
      String jsonString = new String(response.data, 
        HttpHeaderParser.parseCharset(response.headers)); 
      Log.e("response", response.toString()); 
      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)); 
     } 
    } 

    @Override 
    protected void deliverResponse(JSONObject response) { 
     // TODO Auto-generated method stub 
     Log.e("response", response.toString()); 
     listener.onResponse(response); 
    } 

    private Priority mPriority; 

    public void setPriority(Priority priority) { 
     mPriority = priority; 
    } 

    @Override 
    public Priority getPriority() { 
     return mPriority == null ? Priority.NORMAL : mPriority; 
    } 
} 

Et j'appelle cela comme suit dans ma classe MainActivity:

CustomJsonRequest request = new CustomJsonRequest(Request.Method.POST, AUTH_URL, new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       //showJSON(response); 
       VolleyLog.v("Response:%n %s", response); 
      } 
     }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       txtError(error); 
      } 
     }); 

Quelqu'un peut-il me dire où je me trompe dans la création de cette demande?

+0

Je ne connais pas Volley mais voici ma conjecture: vous attendez un JSONObject mais envoyez des paramètres dans l'URL. Vous devriez probablement envoyer les paramètres en tant qu'objet JSON dans le corps de la requête. –

+0

Pour clarification, cette requête dans Postman fonctionne parfaitement avec un code de réponse 200. Je ne veux pas envoyer de paramètres dans l'URL, à moins que ce soit en fait ce que je fais dans Postman? –

Répondre

0

Vous pouvez essayer avec mon code exemple suivant:

String url = "http://server/token"; 
    Map<String, String> stringMap = new HashMap<>(); 
    stringMap.put("grant_type", "password"); 
    stringMap.put("username", "bnk"); 
    stringMap.put("password", "bnk123"); 
    Uri.Builder builder = new Uri.Builder(); 
    Iterator entries = stringMap.entrySet().iterator(); 
    while (entries.hasNext()) { 
     Map.Entry entry = (Map.Entry) entries.next(); 
     builder.appendQueryParameter(entry.getKey().toString(), entry.getValue().toString()); 
     entries.remove(); 
    } 
    String requestBody = builder.build().getEncodedQuery(); 

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, requestBody, new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      // do something... 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      // do something... 
     } 
    }){ 
     @Override 
     public String getBodyContentType() { 
      return "application/x-www-form-urlencoded"; 
     } 
    }; 

MISE À JOUR:

Si votre projet utilise volley officiel de Google en tant que module, vous devez ajouter ce qui suit dans JsonObjectRequest.java fichier:

public JsonObjectRequest(int method, String url, String requestBody, 
          Listener<JSONObject> listener, ErrorListener errorListener) { 
     super(method, url, requestBody, listener, errorListener); 
    } 

MISE À JOUR 2:

Si vous ne voulez pas modifier JsonObjectRequest.java fichier comme je l'ai mentionné ci-dessus, vous pouvez utiliser le code suivant:

 JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       // do something... 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       // do something... 
      } 
     }) { 
      @Override 
      public String getBodyContentType() { 
       return "application/x-www-form-urlencoded"; 
      } 

      @Override 
      public byte[] getBody() { 
       // init parameters 
       Map<String, String> params = new HashMap<>(); 
       params.put("grant_type", "password"); 
       params.put("username", "bnk"); 
       params.put("password", "bnk123"); 
       // encode parameters (can use Uri.Builder as above) 
       String paramsEncoding = "UTF-8"; 
       StringBuilder encodedParams = new StringBuilder(); 
       try { 
        for (Map.Entry<String, String> entry : params.entrySet()) { 
         encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding)); 
         encodedParams.append('='); 
         encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding)); 
         encodedParams.append('&'); 
        } 
        return encodedParams.toString().getBytes(paramsEncoding); 
       } catch (UnsupportedEncodingException uee) { 
        throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee); 
       } 
      } 
     }; 

Hope it helps!

+0

Ce code ne se compile pas pour moi, car vous ne pouvez pas passer requestBody en tant que paramètre de JsonObjectRequest, ce paramètre doit être de type JsonObject. –

+0

Comment avez-vous utilisé Volley lib dans votre projet? Si c'est la volée officielle de Google, l'avez-vous utilisée en tant que module ou fichier JAR? – BNK

+0

Pls lire ma mise à jour réponse – BNK