web-dev-qa-db-fra.com

Android Volley POST chaîne dans le corps)

J'essaie d'utiliser la bibliothèque Volley pour communiquer avec mon API RESTful.

Je dois POST chaîne dans le corps, quand je demande le porteur du jeton. La chaîne devrait ressembler à ceci: grant_type = mot de passe et nom d'utilisateur = Alice et mot de passe = mot de passe123 Et en-tête: Content-Type: application/x-www-form-urlencoded

Plus d'informations sur les comptes individuels WebApi: http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api

Malheureusement, je ne peux pas comprendre comment le résoudre.

J'essaie quelque chose comme ça:

StringRequest req = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        VolleyLog.v("Response:%n %s", response);
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        VolleyLog.e("Error: ", error.getMessage());
                    }
                }){
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        Map<String, String> params = new HashMap<String, String>();
                        params.put("grant_type", "password");
                        params.put("username", "User0");
                        params.put("password", "Password0");
                        return params;
                    }

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

Je reçois 400 mauvaises demandes tout le temps. Je pense qu'en fait, j'envoie une demande comme celle-ci:

grant_type:password, username:User0, password:Password0

au lieu de:

grant_type=password&username=Alice&password=password123

Je serais très reconnaissant si quelqu'un a des idées ou des conseils ..

13
Sandak

Tout d'abord, je vous conseille de voir exactement ce que vous envoyez en imprimant dans le journal ou en utilisant un renifleur de réseau comme Wirehark ou Fiddler.

Que diriez-vous d'essayer de mettre les paramètres dans le corps? Si vous voulez toujours un StringRequest, vous devrez l'étendre et remplacer la méthode getBody() (de la même manière que JsonObjectRequest)

7
Itai Hanski

Pour envoyer une POST normale (pas de JSON) avec des paramètres tels que nom d'utilisateur et mot de passe, vous devez généralement remplacer getParams () et transmettre une carte de paramètres:

public void HttpPOSTRequestWithParameters() {
    RequestQueue queue = Volley.newRequestQueue(this);
    String url = "http://www.somewebsite.com/login.asp";
    StringRequest postRequest = new StringRequest(Request.Method.POST, url, 
        new Response.Listener<String>() 
        {
            @Override
            public void onResponse(String response) {
                Log.d("Response", response);
            }
        }, 
        new Response.ErrorListener() 
        {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("ERROR","error => "+error.toString());
            }
        }
            ) {     
        // this is the relevant method
        @Override
        protected Map<String, String> getParams() 
        {  
            Map<String, String>  params = new HashMap<String, String>();
            params.put("grant_type", "password"); 
            // volley will escape this for you 
            params.put("randomFieldFilledWithAwkwardCharacters", "{{%stuffToBe Escaped/");
            params.put("username", "Alice");  
            params.put("password", "password123");

            return params;
        }
    };
    queue.add(postRequest);
}

Et pour envoyer une chaîne arbitraire comme POST données de corps dans une Volley StringRequest, vous remplacez getBody ()

public void HttpPOSTRequestWithArbitaryStringBody() {
    RequestQueue queue = Volley.newRequestQueue(this);
    String url = "http://www.somewebsite.com/login.asp";
    StringRequest postRequest = new StringRequest(Request.Method.POST, url, 
        new Response.Listener<String>() 
        {
            @Override
            public void onResponse(String response) {
                Log.d("Response", response);
            }
        }, 
        new Response.ErrorListener() 
        {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.d("ERROR","error => "+error.toString());
            }
        }
            ) {  
         // this is the relevant method   
        @Override
        public byte[] getBody() throws AuthFailureError {
            String httpPostBody="grant_type=password&username=Alice&password=password123";
            // usually you'd have a field with some values you'd want to escape, you need to do it yourself if overriding getBody. here's how you do it 
            try {
                httpPostBody=httpPostBody+"&randomFieldFilledWithAwkwardCharacters="+URLEncoder.encode("{{%stuffToBe Escaped/","UTF-8");
            } catch (UnsupportedEncodingException exception) {
                Log.e("ERROR", "exception", exception);
                // return null and don't pass any POST string if you encounter encoding error
                return null;
            }
            return httpPostBody.getBytes();
        }
    };
    queue.add(postRequest);
}

En passant, la documentation de Volley est inexistante et la qualité des réponses StackOverflow est assez mauvaise. Je ne peux pas croire qu'une réponse avec un exemple comme celui-ci n'était pas déjà là.

27
georgiecasey

Je sais que c'est vieux, mais j'ai rencontré ce même problème et il y a une solution beaucoup plus propre imo trouvée ici: Comment envoyer une demande POST en utilisant volley avec un corps de chaîne?

3
Ryan Newsom