Send volleyball request authentication information

In my Android app, I have to call a web service that looks like this

http://mywesite.com/demo/mob/getmenubycategory/1 

I use a volley to send a request, but the result is VolleyError 401 . I changed the getParams() method to add a header. But that does not work. Here is my code.

 RequestQueue requestQueue = volleySingleton.getRequestQueue(); requestQueue.add(new JsonObjectRequest(Request.Method.GET, url, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.e(TAG, "onResponse = \n " + response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e(TAG, "response error \n" + error.networkResponse.statusCode); } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { try { Map<String, String> map = new HashMap<String, String>(); String key = "Authorization"; String encodedString = Base64.encodeToString(String.format("%s:%s", "USERNAME", "Password").getBytes(), Base64.NO_WRAP); String value = String.format("Basic %s", encodedString); map.put(key, value); return map; } catch (Exception e) { Log.e(TAG, "Authentication Filure" ); } return super.getParams(); } }); 

When I use my browser, it displays a dialog to enter my username and password. How can I send a username and password with a request using a volley. Any help to solve this problem would be appreciated.

+5
source share
2 answers

For IMHO authentication, you must override getHeaders instead of getParams , try the following:

 @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<>(); String credentials = "username:password"; String auth = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP); headers.put("Content-Type", "application/json"); headers.put("Authorization", auth); return headers; } 

Hope this helps!

+20
source

Use CustomVolleyRequest as I use below

 public class CustomVollyRequest extends Request<JSONObject> { private Listener<JSONObject> listener; private Map<String, String> params; public CustomVollyRequest(String url, Map<String, String> params, Listener<JSONObject> reponseListener, ErrorListener errorListener) { super(Method.GET, url, errorListener); this.listener = reponseListener; this.params = params; } public CustomVollyRequest(int method, String url, Map<String, String> params, Listener<JSONObject> reponseListener, ErrorListener errorListener) { super(method, url, errorListener); this.listener = reponseListener; this.params = params; } @Override protected Map<String, String> getParams() throws com.android.volley.AuthFailureError { return params; } @Override protected void deliverResponse(JSONObject response) { listener.onResponse(response); } @Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); 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)); } } 

Use the above class as below

 Map<String, String> params = new HashMap<>(); params.put("key",value);//put your parameters here CustomVollyRequest jsObjRequest = new CustomVollyRequest( Request.Method.POST, url, params, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { //Log.d("Response: ", response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError response) { Log.d("Response: Error", response.toString()); } } ); 
0
source

Source: https://habr.com/ru/post/1238371/


All Articles