Question

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

Je dois POSTER une chaîne dans le corps lorsque je demande le jeton du porteur.La chaîne devrait ressembler à ceci :GRANT_TYPE = Password & Username = Alice & Password = Password123 et En-tête:Type de contenu :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 n'arrive pas à comprendre comment puis-je le résoudre.

J'essaie quelque chose comme ceci :

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 tout le temps 400 mauvaises demandes.Je pense que j'envoie en fait 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.

Était-ce utile?

La solution

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

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

Autres conseils

Pour envoyer une demande postale normale (no Json) avec des paramètres tels que le nom d'utilisateur et le mot de passe, vous remplaceriez généralement GetParams () et passez une carte des 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 d'envoyer une chaîne arbitariale en tant que données post-corps dans une volley stringrequest, vous remplacez Getbonnez ()

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 tant que de côté, la documentation de volley est inexistante et la qualité des réponses Stackoverflow est plutôt mauvaise.Je ne peux pas croire une réponse avec un exemple comme celui-ci n'était pas déjà ici.

Je sais que c'est vieux, mais j'ai couru dans ce même problème et il y a une solution beaucoup plus propre que je trouve ici: Comment envoyer une demande postale à l'aide de volley avec corps de cordes?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top