簡體   English   中英

如何解決401錯誤

[英]how to solve 401 error

我試圖從兩個EditText視圖發送JSON格式的數據(使用Volley),並且從我的Android應用程序向URL返回唯一的設備ID的方法,但我收到“ [8970] BasicNetwork.performRequest:HTTP的意外響應代碼401 : //gorountsiallyetlasornall:5wxGq5UNlY6wdWmNAyYPVVrN@bulberadev.cloudant.com/notebook

這是我的方法:

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>"
}

401是未經授權的錯誤。

https://zh.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/

錯誤401是未經授權的HTTP錯誤。 這不是Volley或android相關的錯誤。 在這種情況下,您提供的URL https:// gorountsiallyetlasornall:5wxGq5UNlY6wdWmNAyYPVVrN@bulberadev.cloudant.com/notebook

Volley也不能將其解釋為登錄名。 cURL和其他工具有時會使用此url將密碼中的用戶名硬編碼到基本身份驗證HTTP的URI中。

為此,您的用戶名是gorountsiallyetlasornall,密碼是5wxGq5UNlY6wdWmNAyYPVVrN。

根據基本認證,解釋如下:https: //luckymarmot.com/paw/doc/HTTP_Basic_Auth需要將其轉換為Base 64,然后添加到請求的標頭中。

我已將您的用戶名和密碼轉換為Basic Auth base 64編碼的字符串,以供您使用。

Z29yb3VudHNpYWxseWV0bGFzb3JuYWxsOjV3eEdxNVVObFk2d2RXbU5BeVlQVlZyTg==

通過擴展Volley請求並覆蓋函數getHeaders以返回具有以下鍵值對的HashMap,將其添加到Volley標頭中。

"Authorization" , "Basic Z29yb3VudHNpYWxseWV0bGFzb3JuYWxsOjV3eEdxNVVObFk2d2RXbU5BeVlQVlZyTg"

您的請求現在可以使用。

如果您需要更詳細的說明,請告訴我。

PS。 希望您在問題中發布的值不是您的真實用戶名和密碼。 如果是這樣,那么將來就不要這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM