5

W moim Android app Muszę zadzwonić do usługi internetowej, która wygląda jak tenWysyłanie informacji uwierzytelniania z żądaniem siatkówki

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

Używam woleja wysłać żądanie, ale wynik jest VolleyError 401. Nadpisałem metodę getParams(), aby dodać nagłówek. ale to nie działa. Oto mój kod.

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

Kiedy korzystam z przeglądarki, wyświetla się okno dialogowe umożliwiające wprowadzenie mojej nazwy użytkownika i hasła. Jak mogę wysłać nazwę użytkownika i hasło z prośbą za pomocą salwy. Każda pomoc w rozwiązaniu tego problemu zostanie doceniona.

+0

Czy masz jakiś dziennik błędów? – Sree

+0

nie jest to po prostu logowanie 401 w 'onErrorResponse (błąd VolleyError)' – Sony

+0

czy próbujesz wydrukować ten "błąd"? – Sree

Odpowiedz

19

do uwierzytelniania, IMHO, należy zastąpić getHeaders zamiast getParams, spróbuj wykonać następujące czynności:

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

Mam nadzieję, że pomoże!

+2

Dzięki! Użycie 'getHeaders()' zamiast 'getParams()' rozwiązało mój problem. – Sdghasemi

+0

Czyli to oznacza utworzenie własnego rozszerzenia wniosku? W jaki sposób przekazujesz nazwę użytkownika: hasło i gdzie znajdują się tokeny? –

+0

@G_V pytanie dotyczy podstawowego uwierzytelniania i jak widzisz w moim przykładowym kodzie 'String credentials =" nazwa_użytkownika: hasło ";', o tokenach, masz na myśli dostęp do tokena wysłanego do usługi sieciowej? Jeśli tak, to również w 'getHeaders();' – BNK

0

używać własnych Volley wniosek, używam poniżej

public class Custom_Volly_Request extends Request<JSONObject> { 
    private Listener<JSONObject> listener; 
    private Map<String, String> params; 

    public Custom_Volly_Request(String url, Map<String, String> params, 
      Listener<JSONObject> reponseListener, 
      ErrorListener errorListener) { 
     super(Method.GET, url, errorListener); 
     this.listener = reponseListener; 
     this.params = params; 
    } 

    public Custom_Volly_Request(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)); 
    } 
} 

użytkowania powyższe klasy jak poniżej

Map<String, String> params = new HashMap<>(); 
params.put("key",value);//put your parameters here 
Custom_Volly_Request jsObjRequest = new Custom_Volly_Request(
     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()); 
      } 
     } 
); 
Powiązane problemy