簡體   English   中英

連接到Shutterstock API的Android應用拋出IOException錯誤401

[英]Android app connecting to shutterstock api throws IOException with Error 401

我正在嘗試將我的Android應用程序連接到shutterstock api,以便它可以在那里搜索一些圖像。 它使用https方案+基本身份驗證標頭來允許用戶進行所有搜索請求。 我使用HttpsURLConnection在常規Java項目中實現了該功能,並且能夠獲取正確的JSON響應。 Java代碼如下所示:

HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();//proxy);
        String username = "62c01aa824222683004b", password = "dc4ad748a75e4e69ec853ad2435a62b700e66164";
        String encoded = Base64.getEncoder().encodeToString((username+":"+password).getBytes("UTF-8"));
        System.out.println(encoded.equals("Nj0jMDFhZWE4ZmE4MjY4MzAwNGI6ZGM0YWQ3NDhhNzVlNGU2gWVjODUzYWQ0ZmEzYTYyYjc7MGU2NjE2NA==")); // prints true

        urlConnection.setRequestProperty("Authorization", "Basic "+encoded);

將其移植到Android時,它拋出IOException錯誤,並帶有401錯誤代碼。 作為上所以在很多職位描述(如一個在這里 ),我修改了代碼相應的一個額外try-catch如下:

String username = "62c01aa824222683004b", password = "dc4ad748a75e4e69ec853ad2435a62b700e66164", encoded = "";
            encoded = Base64.encodeToString((username+":"+password).getBytes("UTF-8"), Base64.URL_SAFE);
            Log.e("test", "encoded strings match:" + encoded.equals("Nj0jMDFhZWE4ZmE4MjY4MzAwNGI6ZGM0YWQ3NDhhNzVlNGU2gWVjODUzYWQ0ZmEzYTYyYjc7MGU2NjE2NA==") + "\n" + encoded); // prints false but string is same!!

            URL url = new URL(reqUrl);
            connection = (HttpsURLConnection) url.openConnection();
            connection.setRequestProperty("Authorization", "Basic "+encoded);

try {
    if (connection != null) {
        connection.connect();

        if (200 == connection.getResponseCode()) { // ---> throws IOException
            BufferedReader br = new BufferedReader(new InputStreamReader((connection.getInputStream())));
            String output;
            while ((output = br.readLine()) != null) {
                Log.e("test", output);
                response.append(output);
            }
            connection.disconnect();
            return response.toString();
        }
    }
} catch (IOException e) {
    try {
        Log.e("test", e.getMessage()); // ---> prints "No authentication challenges found"
        Log.e("test", connection.getResponseCode() + ":" + connection.getResponseMessage() + connection.getHeaderFields());
        //---> prints 401:Unauthorized{null=[HTTP/1.1 401 Unauthorized], cache-control=[no-cache], Connection=[keep-alive], Content-Length=[38], Content-Type=[application/json; charset=utf8], Date=[Tue, 31 May 2016 14:11:28 GMT], Server=[nginx], X-Android-Received-Millis=[1464703888222], X-Android-Sent-Millis=[1464703887592], x-end-user-request-id=[f754ec7f-c344-431b-b641-360aabb70184], x-shutterstock-app-version=[apitwo-625], x-shutterstock-resource=[/v2/images/search]}

        if (401 == connection.getResponseCode()) {
            InputStream es = connection.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(es));
            String output;
            while ((output = br.readLine()) != null) {
                Log.e("test", output); // ---> prints {"message":"Invalid auth credentials"}
                response.append(output);
            }
            connection.disconnect();
            return response.toString();
        } else {
            Log.e("test","Could not connect! " + connection.getResponseCode() + ":" + connection.getResponseMessage() + ". " + connection.getRequestMethod());
        }
    }catch (Exception e1){e1.printStackTrace();}
}

我無法在Firefox的Rest客戶端中檢查響應標頭,因為添加身份驗證標頭時它不會將請求發送到服務器。

所以這里的問題是:

  1. 這是在Android中處理401錯誤的正確方法嗎? 我會在內部try-catch中獲得JSON響應嗎?
  2. Java程序使用與Android中完全相同的編碼字符串。 為什么String.equals()在Java中返回“ true”,在android中返回“ false”?
  3. 來自服務器的錯誤消息顯示“無效的身份驗證憑據”。 出於任何原因,Android和Java之間的編碼字符串是否有所不同? 如果是,則第2點有意義。

我將編碼后的字符串從Java程序復制到Android變量中,並且能夠通過Shutterstock成功地進行身份驗證。 因此,確實,盡管UTF-8格式的Android和Java上的編碼字符串有所不同。 這也解釋了Android中的“ false”和來自服務器的“ Invalid certificate”消息。

只是不確定為什么/當兩個編碼的字符串對於人眼而言都是相同時,為什么/有什么不同!

暫無
暫無

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

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