【问题标题】:how to solve 401 error如何解决401错误
【发布时间】:2015-08-11 07:16:11
【问题描述】:

我正在尝试从两个 EditText-views 发送 JSON 格式数据(使用 Volley)和一个从我的 Android 应用程序返回唯一设备 ID 到 URL 的方法,我收到 "[8970] BasicNetwork.performRequest:https://gorountsiallyetlasornall:5wxGq5UNlY6wdWmNAyYPVVrN@bulberadev.cloudant.com/notebook 的意外响应代码 401"

这是我的方法:

private void doPost() {
    final String url = "https://gorountsiallyetlasornall:5wxGq5UNlY6wdWmNAyYPVVrN@bulberadev.cloudant.com/notebook";
    final String deviceId = getDeviceId(getApplicationContext());


    try {
        try {
            JSONObject jsonObject = new JSONObject();
            String title = editTitle.getText().toString();
            String content = editContent.getText().toString();
            jsonObject.put("title", title);
            jsonObject.put("content", content);
            jsonObject.put("deviceId", "<" + deviceId + ">");

        } catch (JSONException e) {
            e.printStackTrace();
        }
        requestQueue = Volley.newRequestQueue(this);
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,
                url, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                try {
                    VolleyLog.v("Response:%n %s", response.toString(4));
                } catch (JSONException e) {
                    e.printStackTrace();
                }


            }
        },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // Log.e("VOLLEY", "ERROR");
                    }
                });
        requestQueue.add(jsonObjectRequest);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

它应该采用以下格式:

   {
"title":"Birth day",
"content":"Buy a gift for my mom!",
"deviceId":"<Device ID>"
}

【问题讨论】:

  • 我认为这与 SSL ..

标签: android http post android-volley


【解决方案1】:

401 是未经授权的错误。

https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error

这意味着无法识别用户和密码。您通过 URL 提供它,但这仅适用于浏览器。如果您使用的服务接受基本 HTTP 授权标头,则此代码将为您提供所需的标头:

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    HashMap<String, String> params = new HashMap<String, String>();
    String creds = String.format("%s:%s","USERNAME","PASSWORD");
    String auth = "Basic " + Base64.encodeToString(creds.getBytes(), Base64.DEFAULT);
    params.put("Authorization", auth);
    return params;
}

来自https://stackoverflow.com/a/18980454/3286819的原码

当然,用户名和密码必须是您自己的。在这种情况下:

更多信息:https://yakivmospan.wordpress.com/2014/04/04/volley-authorization/

【讨论】:

  • 这让我回来了:“意外的响应代码 415 for.. ;x”
  • 只有这个错误代码它可以是任何东西。我建议检查生成的标头(auth 变量的值可以提供线索。另外,您可以为 Volley 启用详细调试:stackoverflow.com/a/23654407/3286819
  • 会不会是因为 SSL: ?
  • 看起来不像。如果您单击您在浏览器中提供的原始 URL,它可以工作,并且使用的是 HTTPS。无论如何,如果你做我在之前评论中建议的测试,我们可以找到它。
  • 我发现了我的错误——我从来没有将 jsonObject 传递给 jsonObjectRequest,谢谢你的帮助 :))
【解决方案2】:

错误 401 是未经授权的 HTTP 错误。这不是 Volley 或 android 相关的故障。在这种情况下,您提供的 URL https://gorountsiallyetlasornall:5wxGq5UNlY6wdWmNAyYPVVrN@bulberadev.cloudant.com/notebook

Volley 也不能将其解释为登录。此 url 有时被 cURL 和其他工具用于将密码中的用户名硬编码到基本身份验证 HTTP 的 URI 中。

为此,您的用户名是 gorountsialyetlasornall,密码是 5wxGq5UNlY6wdWmNAyYPVVrN。

根据基本认证,解释https://luckymarmot.com/paw/doc/HTTP_Basic_Auth 需要将其转换为Base 64,然后添加到请求的标头中。

我已将您的用户名和密码转换为基本身份验证 base 64 编码字符串,供您使用。

Z29yb3VudHNpYWxseWV0bGFzb3JuYWxsOjV3eEdxNVVObFk2d2RXbU5BeVlQVlZyTg==

通过扩展 Volley 请求并覆盖函数 getHeaders 以返回具有以下键值对的 HashMap,将其添加到您的 Volley 标头中。

"Authorization" , "Basic Z29yb3VudHNpYWxseWV0bGFzb3JuYWxsOjV3eEdxNVVObFk2d2RXbU5BeVlQVlZyTg"

您的请求现在将生效。

如果您需要更详细的解释,请告诉我。

PS。希望您在问题中发布的值不是您的真实用户名和密码。如果是这样,那么以后不要这样做。

【讨论】:

  • 这给我带来了“意外的响应代码 400”:x
猜你喜欢
  • 2014-04-08
  • 2014-05-04
  • 2021-10-15
  • 2020-09-16
  • 2019-05-12
  • 2020-01-24
  • 2021-07-14
  • 1970-01-01
  • 2022-01-08
相关资源
最近更新 更多