2

I'm trying to make a POST request to get token from my web API (writen by asp.net mvc) and it works in Postman (I get a valid JSON object), but not using Volley. With the following code:

  String url = "https://branj.ir/Token";

    Response.Listener<String> listener= new Response.Listener<String>() {
      @Override
      public void onResponse(String jsonResult) {

        Log.i(G.Tag, "volley result: " + jsonResult);
      }
    };
    Response.ErrorListener errorListener=   new Response.ErrorListener() {
      @Override
      public void onErrorResponse(VolleyError error) {

        error.printStackTrace();
        Log.d(G.Tag, "Error: " + error
          + "\nStatus Code " + error.networkResponse.statusCode
          + "\nCause " + error.getCause()
          + "\nmessage" + error.getMessage());
      }
    };

    StringRequest   request = new StringRequest  (
      Request.Method.POST,
      url,
      listener,
      errorListener

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

logcat is:

 BasicNetwork.performRequest: Unexpected response code 400 for https://branj.ir/Token
11-13 16:55:59.608 21200-21200/ir.branj.app.wideidea.ir.branj D/Branj: Error: com.android.volley.ClientError
    Status Code 400
    Cause null
    messagenull
Mahdi SarAii
  • 79
  • 1
  • 2
  • 9
  • Error 400 is returned by the server because request wasn't correct. If you want to get response that was sent by the server in case of error then you have to read `error.networkResponse.data` in `onErrorResponse` function. `error.getMessage()` isn't the right place to look for the server side response. – Sharjeel Nov 13 '18 at 19:09
  • check this STRINGREQUEST code :- https://stackoverflow.com/a/52531318/7319704 – Abhinav Gupta Nov 14 '18 at 05:43

2 Answers2

1

I changed the application code as follows and my problem was resolved

 public static void Token(final String username, final String password) {

    String url = BASE_URL + "Token";

    Response.Listener<String> listener= new Response.Listener<String>() {
      @Override
      public void onResponse(String jsonResult) {

        Log.i(G.Tag, "volley result: " + jsonResult);
      }
    };
    Response.ErrorListener errorListener=   new Response.ErrorListener() {
      @Override
      public void onErrorResponse(VolleyError error) {
        error.printStackTrace();
        Log.d(G.Tag, "Error: " + error
          + "\nStatus Code " + error.networkResponse.statusCode
          + "\nCause " + error.getCause()
          + "\nnetworkResponse " + error.networkResponse.data.toString()
          + "\nmessage" + error.getMessage());
      }
    };

    StringRequest   request = new StringRequest  (
      Request.Method.POST,
      url,
      listener,
      errorListener
    )
    {
      @Override
      public Map<String, String> getParams() throws AuthFailureError {
        Map<String,String> params = new HashMap<>();
        params.put("username", username);
        params.put("password", password);
        params.put("grant_type", "password");
        return params;
      }
    } ;
    G.getInstance().addToRequestQueue(request);
  }
Mahdi SarAii
  • 79
  • 1
  • 2
  • 9
0

{ "error": "unsupported_grant_type" } when i have used your request on postman i am getting the error because the body is incorrect of the volley.

Vishal Sharma
  • 1,051
  • 2
  • 8
  • 15
  • use this parameters as body Map params = new HashMap<>(); params.put("username", "NamadTest"); params.put("password", "NamadTest"); params.put("grant_type", "password"); – Mahdi SarAii Nov 14 '18 at 04:47