it-swarm.com.de

Authentifizierungsinformationen mit Volley-Anfrage senden

In meiner Android-App muss ich einen Webdienst aufrufen, der so aussieht 

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

Ich verwende den Volleyball, um die Anfrage zu senden, aber das Ergebnis ist VolleyError 401. Ich habe die getParams()-Methode überschrieben, um den Header hinzuzufügen, aber er funktioniert nicht.

Hier ist mein 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();
        }
    });

Wenn ich meinen Browser verwende, wird ein Dialog zur Eingabe meines Benutzernamens und Passworts angezeigt. Wie kann ich den Benutzernamen und das Passwort mit der Anfrage über Volley senden?.

7
Sony

Zur Authentifizierung, IMHO, sollten Sie getHeaders anstelle von getParams überschreiben. Bitte versuchen Sie Folgendes:

@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;
}

Ich hoffe es hilft!

23
BNK

Überschreiben Sie einfach diese Methode

 @Override
        public Map<String, String> getHeaders() {
            String username ="[email protected]";
            String password = "dani3173";
            String auth =new String(username + ":" + password);
            byte[] data = auth.getBytes();
            String base64 = Base64.encodeToString(data, Base64.NO_WRAP);
            HashMap<String, String> headers = new HashMap<String, String>();
            headers.put("Authorization",base64);
            headers.put("accept-language","EN");
            headers.put("Content-type","application/json");
            headers.put("Accept","application/json");
            return headers;
        }
0

Verwenden Sie CustomVolleyRequest wie ich unten verwende

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));
    }
}

Verwenden Sie die oben genannte Klasse wie folgt

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
Muhammad Younas