【问题标题】:Android Volley .NET Rest token authorization failsAndroid Volley .NET Rest 令牌授权失败
【发布时间】:2018-08-24 12:55:47
【问题描述】:

我正在尝试使用我在 .NET Framework 中构建的 Web API,它使用令牌身份验证系统。这些 API 正在使用 Volley 在 Android 中使用。

所以这些 API 在 postman 中测试时可以完美运行,所以我将按照我在 Android 中使用的代码分享 postman 配置的屏幕截图。

public static void authorizeAPIClient(final String username, final String password, RequestQueue requestQueue){

    StringRequest stringRequest = new StringRequest(Request.Method.POST,
            apiPath + "api/authorise/token",
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    MainActivity.getToken(response);
                }
            }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {


        }
    }) {

        @Override
        public String getBodyContentType() {
            return "application/x-www-form-urlencoded; charset=UTF-8";
        }



        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("grant_type", "password");
            params.put("username", username);
            params.put("password", password);
            return params;
        }

    };

    requestQueue.add(stringRequest);
}

所以这部分工作得很好,我能够从 JSON 中提取令牌,甚至使用邮递员测试在 Android 设备上接收到的令牌,它工作得很好。我对此感到奇怪的是,我使用getParams() 将用户名和密码传递给它,而在邮递员中我需要通过表单来完成。

现在我们已经从服务器获得了一个令牌并确定它可以工作,我尝试调用另一个需要令牌的函数。

public static void getUserDetails(final String userId, final String token, RequestQueue requestQueue){

    StringRequest stringRequest = new StringRequest(Request.Method.GET,
            apiPath + "API/points/getUserDetails",
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {

                    Log.i("API", response);
                }
            }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            Log.i("API", error.toString());

        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("UserId", userId);
            return params;
        }
        @Override
        public Map<String, String> getHeaders(){
            Map<String, String> params = new HashMap<String, String>();
            params.put("Authorization", "Bearer " + token);
            return params;
        }
    };

    requestQueue.add(stringRequest);

调用此函数时,我收到以下错误之一,具体取决于我传递参数和标头的方式:

  1. com.android.volley.ServerError

  2. com.android.volley.AuthFailureError

我不确定哪个错误先出现,即它是否会在 AuthFailureError 之前或之后引发服务器错误,因此很难确定它是否曾经授权或 URL 参数是否正确传递。

有谁知道我做错了什么,我一直在通过 StackOverFlow 搜索,但对我没有任何帮助。

另外,很抱歉所有的黑衬里,敏感信息:D

【问题讨论】:

    标签: android asp.net-web-api android-volley token


    【解决方案1】:

    试试这个

    public static void getUserDetails(final String userId, final String token, RequestQueue requestQueue){
    
    StringRequest stringRequest = new StringRequest(Request.Method.GET,
            apiPath + "API/points/getUserDetails?UserId=" + userId,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
    
                    Log.i("API", response);
                }
            }, new Response.ErrorListener() {
    
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.i("API", error.toString());
    
        }
    }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError{
            Map<String, String> params = new HashMap<String, String>();
            params.put("Authorization", "Bearer " + token);
            return params;
        }
    };
    
    requestQueue.add(stringRequest);
    

    【讨论】:

    • 感谢您的回答,这对我有用,但是您能向我解释一下 getParams() 的确切目的是什么吗?有人会认为 getParams() 取代了自己连接 url 字符串的需要吗?还是 getParams 只是为了提交表单数据?
    • 在执行 get 请求时不能使用 getParam
    猜你喜欢
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 2019-07-12
    • 1970-01-01
    • 2021-12-08
    • 2020-08-02
    相关资源
    最近更新 更多