java - Volley 使用单例将访问 token 附加到每个请求

标签 java android android-volley

我正在做以下完美的工作

    //else proceed with the checks
    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
            Request.Method.GET,
            checkauthurl,
            null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(String response) { 
                         //do stuff here
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                   // do stuff here
                }
            }) {
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    HashMap<String, String> headers = new HashMap<String, String> ();
                    TokenService tokenservice = new TokenService(ctx);
                    String accesstoken = tokenservice.getToken(ApiHelper.ACCESS_TOKEN_SHARED_PREF);
                    headers.put("Authorization", "Bearer " + accesstoken);

                    return headers;
              }
    };

    // Access the RequestQueue through your singleton class.
    ApiSingleton strngle = new ApiSingleton(ctx);
    strngle.addToRequestQueue(jsonObjectRequest);

对于每个请求,我都必须添加请求 header 。如何直接在单例中设置请求 header 。

这是我的单例

private static ApiSingleton mInstance;
private RequestQueue mRequestQueue;
public static Context mCtx;
private ImageLoader mImageLoader;

public ApiSingleton(Context context) {
    mCtx = context;
    mRequestQueue = getRequestQueue();
    //do stuff
}

public RequestQueue getRequestQueue() {
    if (mRequestQueue == null) {
        // getApplicationContext() is key, it keeps you from leaking the
        // Activity or BroadcastReceiver if someone passes one in.
        mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
    }
    return mRequestQueue;
}

在每个请求中附加不记名 token 时,如何避免上述代码重复?

最佳答案

public class CustomJsonRequest extends JsonRequest<Object>{
    public CustomJsonRequest(String url, String requestBody, Response.Listener<Object> listener,
                       Response.ErrorListener errorListener) {
        super(url, requestBody, listener, errorListener);
    }

    public CustomJsonRequest(int method, String url, String requestBody, Response.Listener<Object> listener,
                       Response.ErrorListener errorListener) {
        super(method, url, errorListener);
    }
    @Override
    protected Response<Object> parseNetworkResponse(NetworkResponse response) {
        return Response.success(Object, HttpHeaderParser.parseCacheHeaders(response));
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = new HashMap<String, String> ();
        TokenService tokenservice = new TokenService(ctx);
        String accesstoken = tokenservice.getToken(ApiHelper.ACCESS_TOKEN_SHARED_PREF);
        headers.put("Authorization", "Bearer " + accesstoken);
        return headers;
    }
}

您可以扩展 JsonRequest 类并覆盖 getHeaders() 方法。 在队列中添加 volley 请求时传递 CustomJsonRequest 对象的实例。

VolleyUtils.getInstance().addToRequestQueue(customJsonRequest); 

关于java - Volley 使用单例将访问 token 附加到每个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49284158/

相关文章:

android - 添加 ImageView 作为 ListView 的标题

android - 如何获取我刚刚点击的AppWidget id?

android - 使用 Picasso 在第二个 Volley JSON 请求后将图像加载到 RecyclerView 中?

在应用程序 onCreate 中初始化类时出现 java.lang.NoClassDefFoundError

java - 安卓工作室 : 2 different activities in 1 button

java - 从图库中选择一张图片并将其显示在另一个 Activity 中

java - 如何从 Java 查询 VSAM 数据?

java - emacs 上的 geben 和 xdebug

java - EMR 上的 Oozie - 任务永远卡在 PREP 状态

AndroidPlot:从 1 到 11 的域标签