2013-12-16 22 views
11

Tôi đang cố gắng để làm việc với một số mã cũ và đã đưa ra chống lại một vấn đề khi sử dụng bóng chuyền.android - lỗi volley Không có thách thức xác thực nào được tìm thấy

Tôi đang cố gắng truy cập vào trang web chính của mình và nó hoạt động tốt cho một tài khoản, nhưng không hoạt động với một tài khoản khác. Tôi đang cố gắng tìm ra sự khác biệt có thể là gì trong URL yêu cầu/tiêu đề và cả những gì đang quay lại trong phản hồi, nhưng dường như tôi không tìm được cách nào trong mã volley để in nó vào nhật ký.

Các lỗi tôi nhận được là

com.android.volley.NoConnectionError: java.io.IOException: No authentication challenges found 

Tôi đã đọc xung quanh rằng đây có thể là do một phản ứng 401, nhưng tôi không thực sự biết điều đó có nghĩa hoặc ít nhất là làm thế nào để chứng minh/kiểm tra điều đó. Tôi thực sự bối rối rằng nó hoạt động cho một tài khoản và không phải là một tài khoản khác.

Url hơi khác một chút đối với trang web Vương quốc Anh của chúng tôi và trang web khác của chúng tôi, nhưng khác với điều đó không có sự khác biệt.

Cảm ơn

+0

đó là lỗi cho biết không có kết nối nào có thể được thiết lập khi thực hiện yêu cầu Volley. – Raghunandan

+0

@Raghunandan bạn có biết nếu có bất kỳ thông tin nào khác không? Bất kỳ chi tiết phản hồi nào? –

+0

không có kết nối nào có thể được thiết lập. nếu không có kết nối mà là cơ hội để nhận được phản ứng – Raghunandan

Trả lời

8

Lỗi này xảy ra bởi vì các máy chủ sẽ gửi một 401 (trái phép) nhưng không đưa ra một "WWW-Authenticate" mà là một gợi ý cho khách hàng phải làm gì tiếp theo. Tiêu đề "WWW-Authenticate" cho khách hàng biết loại xác thực nào là cần thiết (hoặc Basic hoặc Digest). Điều này thường không hữu ích trong các máy khách http không đầu, nhưng đó là cách tiêu chuẩn được định nghĩa. Lỗi xảy ra vì lib cố gắng phân tích cú pháp tiêu đề "WWW-Authenticate" nhưng không thể.

giải pháp có thể nếu bạn có thể thay đổi máy chủ:

  • Thêm một giả "WWW-Authenticate" tiêu đề như: WWW-Authenticate: Basic realm="fake". Đây chỉ là giải pháp không phải là giải pháp, nhưng nó sẽ hoạt động và máy khách http được thỏa mãn.
  • Sử dụng mã trạng thái HTTP 403 thay vì 401. Đó là ngữ nghĩa là không giống nhau và thường khi làm việc với đăng nhập 401 là một phản ứng chính xác (see here for a detailed discussion) nhưng đủ gần.

giải pháp có thể nếu bạn không thể thay đổi máy chủ:

Như @ErikZ viết trong post mình bạn có thể sử dụng một thử & bắt

HttpURLConnection connection = ...; 
try { 
    // Will throw IOException if server responds with 401. 
    connection.getResponseCode(); 
} catch (IOException e) { 
    // Will return 401, because now connection has the correct internal state. 
    int responsecode = connection.getResponseCode(); 
} 

Tôi cũng đăng này ở đây: java.io.IOException : No authentication challenges found

+0

Tôi đang cố gắng gửi tiêu đề Xác thực thông báo, nhưng không thể tìm ra cách thực hiện (vẫn đang tìm kiếm câu trả lời). Bạn có bất kỳ mẫu nào về cách thực hiện xác thực thông báo (hoặc thậm chí cơ bản) trong Android-Volley không? –

+0

Basic và Digest chỉ là đặt tiêu đề trông giống như "Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ ==" trong Basic và phức tạp hơn trong tiêu hóa - đây không phải là đặc biệt để bóng, bạn chỉ cần đặt tiêu đề (google về cách làm điều đó trong bóng chuyền) – for3st

+0

Tôi xin lỗi vì tôi đã hỏi câu hỏi này từ lâu nên tôi thậm chí không nhớ nó liên quan đến cái gì, cộng với dự án di sản đó đã bị đóng cửa. Tôi sẽ upvote câu trả lời của bạn cho những nỗ lực bạn đã đưa vào, nhưng không có cách nào kiểm tra nó đúng như vậy sẽ không chọn nó như là câu trả lời tôi sợ. –

8

Thật vậy, tôi đã giải quyết vấn đề này bằng cách bao gồm tiêu đề WWW-Authenticate trong phản hồi của máy chủ.

Tuy nhiên, nếu bạn thêm tiêu đề WWW-Authenticate: Basic realm="" và API của bạn cũng được khách hàng web tiêu thụ, một số trình duyệt web sẽ kích hoạt cửa sổ bật lên yêu cầu thông tin đăng nhập cơ bản.

Đối với tôi, giải pháp phù hợp đã sử dụng lược đồ tùy chỉnh. Như được giải thích trong số này blog post, tôi sử dụng xBasic thay vì Basic trong phản hồi tiêu đề.

WWW-Authenticate: xBasic realm=""

Với tiêu đề này, không chỉ Volley phân tích các phản ứng một cách chính xác, nhưng tôi cũng tránh các trình duyệt web hiển thị cửa sổ pop xác thực lên.

+0

Tôi xin lỗi tôi đã hỏi câu hỏi này từ lâu rồi tôi thậm chí không nhớ nó liên quan đến cái gì, cộng với dự án di sản đó đã bị đóng cửa. Tôi sẽ upvote câu trả lời của bạn cho những nỗ lực bạn đã đưa vào, nhưng không có cách nào kiểm tra nó đúng như vậy sẽ không chọn nó như là câu trả lời tôi sợ. –

+0

@Russ Không sao cả! Chỉ muốn giúp những người khác tìm kiếm một câu trả lời :) –

+0

Chỉ cần một lưu ý để đi cùng với điều này. Bạn có thể sử dụng bất kỳ chuỗi nào cho lược đồ (ví dụ 'xBasic' như trên), nhưng' realm = "" '(bao gồm dấu ngoặc kép) cũng phải được bao gồm để tránh ngoại lệ bị ném. –

0

tôi đã có thể nắm bắt này client-side khi khởi tạo RequestQueue volley:

Volley.newRequestQueue(getApplicationContext(), new HurlStack() { 
     @Override 
     public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders) { 
      try { 
       return super.performRequest(request, additionalHeaders); 
      } catch (AuthFailureError authFailureError) { 
       authFailureError.printStackTrace(); 
       // Log out/whatever you need to do here 
      } catch (IOException e) { 
       e.printStackTrace(); 
       if (e.getMessage().equals("No authentication challenges found")) { 
        // This is the error. You probably will want to handle any IOException, not just those with the same message. 
       } 
      } 
      return null; 
     } 
}); 
0

Nếu máy chủ bị rơi, bạn có thể phải đối mặt với vấn đề này. bước:

  1. Dừng server tomcat

  2. goto Run -> Dịch vụ -> khởi động lại cơ sở dữ liệu của bạn (ví dụ: postgres)

  3. Bắt đầu server tomcat.

0

Bạn có thể kiểm tra e là instanceof AuthFailureError.

Log.e(TAG, "AuthFailureError: " + (e instanceof AuthFailureError)); 
Các vấn đề liên quan