【问题标题】:com.android.volly.AuthFailureError in making basic volly POST request to a django servercom.android.volley.AuthFailureError 在向 django 服务器发出基本 volley POST 请求
【发布时间】:2015-08-08 09:21:36
【问题描述】:

我正在尝试从我的 android 应用程序连接到 django 服务器。我正在尝试访问我的 api,使用 volly 发出 POST 请求。一切都准备好了。所需的所有参数和标题,但我仍然收到此错误。

log: [490] BasicNetwork.performRequest: Unexpected response code 401 for https://example.com/

它不允许我访问我的 django Api。它适用于 PHP 服务器。

    public void vollyRequest()
    {
        RequestQueue queue  = Volley.newRequestQueue(this);
        StringRequest request =  new StringRequest(Request.Method.POST  , "https://example.com/", new Response.Listener<String>() {

            @Override
            public void onResponse(String response) {
                Toast.makeText(MainActivity.this, "RESPONSE: " + response, Toast.LENGTH_SHORT ).show();
            }

        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(MainActivity.this, "ERROR: " + error, Toast.LENGTH_SHORT ).show();
            }
        }) {

            @Override
            protected Map<String,String> getParams(){
                Map<String,String> params = new HashMap<String, String>();
                params.put("username","***");
                params.put("password","***");
                return params;
                }
//            @Override
//            public Map<String, String> getHeaders() throws AuthFailureError {
//            Map<String,String> params = new HashMap<String, String>();
//            params.put("Content-Type","application/x-www-form-urlencoded");
//            return params;
//            }
        };
        queue.add(request);
    }

【问题讨论】:

  • 我与 PHP 服务器有同样的错误
  • @CodeWarrior 你解决问题了吗?

标签: android post android-volley


【解决方案1】:

我自己解决了... 此代码将为您获取一个身份验证令牌,以及您提供的用户名和密码,然后将该令牌放入标头中以从服务器获取数据...

public void vollyRequestGetAuthToken()
{
    RequestQueue queue  = Volley.newRequestQueue(this);
    StringRequest request =  new StringRequest(Request.Method.POST  , "https://example.com/get-auth-token/", new Response.Listener<String>() {

        @Override

    public void onResponse(String response) {
        Toast.makeText(MainActivity.this, "RESPONSE: " + response, Toast.LENGTH_SHORT ).show();
        System.out.println("RESPONSE:          >>> " + response + "<<<");
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        Toast.makeText(MainActivity.this, "ERROR: " + error, Toast.LENGTH_SHORT ).show();
    }
}) {
    @Override
    protected Map<String,String> getParams(){
        Map<String,String> params = new HashMap<String, String>();
        params.put("username","*****");
        params.put("password","*****");
        return params;
    }
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String,String> params = new HashMap<String, String>();
        params.put("Authorization",
                String.format("Basic %s", Base64.encodeToString(
                        String.format("%s:%s", "<username>", "<password>").getBytes(), Base64.DEFAULT)));
        params.put("username" , "*****" );
        params.put("password" , "*****" );
        return params;
    }
};
    queue.add(request);
}

现在,当您拥有 auth-token 后,使用以下代码发送 auth-token 以获取数据

@Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                HashMap<String, String> headers = new HashMap<String, String>();
                headers.put("Authorization", "Token <token>");
                return headers;
            }

【讨论】:

    【解决方案2】:

    这是在请求被 API 端点拒绝/阻止时引起的。 原因可能是请求格式不正确,

    • 检查您的请求类型 [GET/POST/ANY OTHER]
    • 检查请求的Header和Body

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多