2017-09-03 12 views
0

Cette commande cURL fonctionne bien quand je le lance sur mon terminal:demande Publier fonctionne bien dans cURL mais pas dans Android Volley

boucle -X POST -H "Content-Type: application/json" - H "autorisation: de base uname: pass123" -d '{ "userName": "uname", "mot de passe": "pass123"} "http://mysite123.com/api/Login"

maintenant, je suis en train d'utiliser Android Volley envoyer cette demande de publication. Le code est le suivant:

RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); 
    String url = "http://mysite123.com/api/Login"; 
    StringRequest stringRequest = new StringRequest(Request.Method.POST, url, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 

        Toast.makeText(MainActivity.this,response,Toast.LENGTH_LONG).show(); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_LONG).show(); 
        error.printStackTrace(); 
       } 
      }){ 
     @Override 
     protected Map<String,String> getParams(){ 

      Map<String,String> params = new HashMap<String, String>(); 
      params.put("userName", "uname"); 
      params.put("password", "pass123"); 
      return params; 
     } 
     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      Map<String,String> headers=new HashMap<String,String>(); 

      headers.put("Content-Type", "application/json"); 
      headers.put("Accept", "application/json"); 
      headers.put("Accept-Encoding", "utf-8"); 
      String creds = String.format("%s:%s","uname","pass123"); 
      String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.NO_WRAP); 
      headers.put("Authorization", auth); 
      return headers; 
     } 

    }; 
    queue.add(stringRequest); 

Mais il me donne l'erreur dans stackTrace comme:

09-03 07: 46: 43,823 17712-17918/com.ankitshubham97.gpsmonitoring E/Volley: [ 108117] BasicNetwork.performRequest: Code de réponse inattendu 400 pour http://mysite123.com/api/Login 09-03 07: 46: 43.833 17712-17712/com.ankitshubham97.gpsmonitoring E/Qmage: isQIO: le flux n'est pas un fichier QIO 09-03 07:46: 43.843 17712-17712/com.ankitshubham97.gpsmonitoring W/System.err: com.android.volley.ServerError 09-03 07: 46: 43.853 17712-17712/com.ankitshubham97.gpsmo nitoring W/System.err: à l'adresse com.android.volley.toolbox.BasicNetwork.performRequest (BasicNetwork.java:163) 09-03 07: 46: 43.853 17712-17712/com.ankitshubham97.gpsmonitoring W/System.err: at com.android.volley.NetworkDispatcher.run (NetworkDispatcher.java:112)

Quel pourrait être le problème? Ou toute méthode d'envoi direct de la commande curl à partir d'Android?

EDIT: Je même utilisé https://incarnate.github.io/curl-to-php/ pour convertir la commande cURL ci-dessus pour le code php et le php fonctionne bien aussi. Je me demande quel est le problème avec Volley!

+0

J'ai essayé votre commande curl mais son donnant la même réponse 405 Méthode non autorisée - DOSarrest Internet Security –

+0

C'est parce que j'ai donné une fausse URL, un nom d'utilisateur et un mot de passe ici au lieu des vrais. –

Répondre

0

L'utilisation de Postman m'a aidé. Donc, le problème était que '{"userName":"uname","password":"pass123"}' devait être envoyé sous forme brute avec le format json et dans le corps (pas comme param). Donc, j'utilisé cette méthode:

  @Override 
      public byte[] getBody() throws AuthFailureError { 
       try { 
        return requestBody == null ? null : requestBody.getBytes("utf-8"); 
       } catch (UnsupportedEncodingException uee) { 
        VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", requestBody, "utf-8"); 
        return null; 
       } 
      } 
      @Override 
      public String getBodyContentType() { 
       return "application/json"; 
      } 

J'ai défini le requestBody avant que:

JSONObject jsonBody = new JSONObject(); 
    try{ 

     jsonBody.put("userName", "uname"); 
     jsonBody.put("password", "pass123"); 
    } 
    catch (JSONException e){ 

    } 

    final String requestBody = jsonBody.toString();